韦东山鸿蒙移植01-移植RTOS需要做的事
1. 框架
鸿蒙是一套完整的、普通人可以直接使用的操作系统,跟Windows、安卓、IOS类似。
常见的错误观点是把鸿蒙跟Linux放在一起来对比,这不对:
Linux只是一个内核,普通人无法使用还需要在Linux之上安装各类程序比如Ubuntu等发行版,它们在Linux内核之上,还有桌面、各类办公软件鸿蒙支持多种内核:Linux、Liteos(又分为Liteos-a、Liteos-m)在内核之上,鸿蒙还有各种子系统,在子系统之上又有桌面等软件2. 嵌入式软件系统的组成
我们可以把内核之上的软件,简单称为APP(实际上还可以细分,比如各类子系统、桌面等APP)。
启动内核,并不复杂,使用U-boot即可。
3. 移植最小系统要做的几件事
串口相关打印(只是打印调试信息)串口驱动(可发可收,APP执行printf时可以从串口打印,所以需要驱动 )MMU(Memory Management Unit,内存管理单元)的设置:虚拟地址与物理地址完善中断子系统提供系统tick时钟为串口驱动实现基于中断的读取字符函数实现存储设备驱动程序在存储设备上烧录文件系统3.1 串口相关
与Linux的串口驱动相比,鸿蒙的串口驱动极大简化了。
对于输出:不使用中断,直接使用查询方式输出。对于输入:使用中断,我们只需要提供底层硬件相关的代码。
要注意:使用的是虚拟地址。
3.2 MMU设置
MMU有2大功能:
3.2.1 权限管理
比如可以把进程A、B的地址空间完全隔离开,它们互不影响写得差的进程、有恶意的进程,不能影响到其他进程用户程序、内核地址空间完全隔离开:不允许用户直接访问硬件示例如下3.2.2 地址映射
使能MMU后,CPU发出的地址被称为"虚拟地址",它不是直接发送给硬件,而是发给MMUMMU根据页表进行权限判定转换为物理地址,发给外设运行app1时,CPU发出的addr,通过MMU映射到paddr1;运行app2时,CPU发出的同一个addr,通过MMU映射到paddr2;虽然app1、app2使用的地址相同,但是对应的内存不同,如下图:
3.3 中断子系统
操作系统跟单片机程序最大的区别,就是多任务,也就是同时 运行多个程序。同时 ,对人类来说是这样的,多个程序好像可以同时运行,实际上它们是轮流 运行。
3.3.1 操作系统"同时"运行多个任务
轮流运行:
3.3.2 串口接收数据的中断
使用串口接收数据时,如果使用"查询"方式,低效并且费电。一般都使用中断方式。
3.4 存储设备的驱动程序
板子上一般都有EMMC、SD/TF卡、Nor Flash、Nand Flash等存储设备。Nor Flash、Nand Flash的驱动程序相对简单,但是这些设备比较少见了。而EMMC、SD/TF卡的驱动程序又太复杂,足够出一个专题了。我们聚焦在最小系统 的移植,先把流程走通:用内存来模拟Flash。
3.5 根文件系统
光有存储设备还不行,上面需要有文件:这就是根文件系统。一个程序要能运行,除了你写出的程序本身,还需要其他库,比如printf就不是你写的,它在库文件里。根文件系统里会有这些内容:
程序库配置文件用户数据(可选)驱动程序(可选)4. 想做更多
为有更好的人机交互可以移植LCD、触摸屏驱动为了方便开发,移植EMMC驱动、网卡驱动要接各类外设,还需要I2C、SPI、GPIO、UART驱动摄像头、声卡驱动嵌入式Linux系列第5篇:Nand Flash根文件系统制作
1.引言
之前系列的文章介绍了如何编译Uboot、Kernel以及使用默认的ramdisk根文件系统来构建一个完整的嵌入式Linux系统,本篇文章介绍如何从头制作一个放在NAND Flash上的根文件系统。经过我这段时间的总结,rootfs相关的编译、配置等工作还是比较麻烦的。所以你可能会看到一般做核心板的第三方厂家会建议初学者直接使用现成提供的文件系统,比如一个做NUC972核心板的厂家,其文档里这么描述:
再比如另外一个做NXP I.MX6核心板的厂家,其文档里这么描述:
他们都建议初学者直接使用他们提供好的文件系统。但是我还是强烈建议大家自己一步一步的去操作制作一次,因为一是这有助于你理解根文件系统是怎么来的,最小的能用的根文件系统包含了哪些东西,二是将来你很有可能需要对文件系统做一些定制化的裁剪和修改工作,只有自己做了一遍你对会明白这个东西到底是怎么回事,比如我原来就搞不清楚Busybox、Buildroot、Yocto这些名词在Linux中的作用,现在随着实践增多,就大概知道他们的用处了。
2.环境介绍
2.1.硬件
因为本系列博客都会以NUC972为平台来介绍。
2.2.软件
本篇新用到的软件工具一个是busybox,它用来生成文件系统里的几个最基本的文件夹,二是打包工具mkyaffs2,它用来生成能直接烧录到板子里的镜像文件。
大家有没有注意,我为什么每次都把这个官方的链接放过来,让大家自己去下载,原因是我们要知道我们用的东西的源头在哪里,最官方的资料渠道在哪里,这很重要。
我们这次要实现的目标是:自己亲手制作的文件系统能够跑起来,同时能够运行我们第二篇文章介绍的Helloworld程序。
3.使用Busybox制作根文件系统
1)进入到nuc972文件夹,新建一个tool文件夹,用来存放busybox、mkyaffs2等工具,把上面下载的NUC970_Linux_Applications-master.zip文件解压到tool文件夹里,因为解压后含有NUC970_Linux_Applications-master,我们把里面的内容移出来,然后删除掉空的NUC970_Linux_Applications-master文件夹和NUC970_Linux_Applications-master.zip源文件。然后进入到busybox目录里。同样的,在编译前要设置交叉编译的环境变量。
cd ~/nuc972
mkdir tool
unzip NUC970_Linux_Applications-master.zip
cd NUC970_Linux_Applications-master
mv ./* ../
cd ..
rm NUC970_Linux_Applications-master -fr
rm NUC970_Linux_Applications-master.zip
cd busybox-1.22.1/
source ~/nuc972//toolchain/environment.sh
2)make menuconfig 进入配置界面
make menuconfig
我们这里就设置一个地方,其他的全部使用默认配置。
修改make install生成的文件夹路径,我们把默认的./_install改成nuc972目录下的rootfs。
Busybox Settings --->
Installation Options ("make install" behavior) --->
(../../rootfs) BusyBox installation prefix
3)make 编译
make
编译成功后显示如下:
编译完成之后我们可以查看一下busybox的文件属性,可以看到如下信息,说明我们交叉编译的没问题。
4)make install 安装
make install
这样就在前面我们设置的地方生成一个rootfs的文件夹,进到里面看一下
cd ~/nuc972/rootfs
ls
bin、sbin、usr :存放一些命令
linuxrc :挂载根文件系统时,第一个执行的文件
4)再创建几个文件夹
mkdir etc lib dev
5)在 rootfs 目录的dev目录下创建设备节点
cd dev
sudo mknod console c 5 1
sudo mknod null c 1 3
6)在根文件系统rootfs/etc目录下创建一个inittab 文件,在文件里面填写:.console::askfirst:-/bin/sh
cd ../etc
vim inittab
4.文件系统打包
1)进入到tool文件夹的yaffs2utils目录里
cd yaffs2utils
2)编译,生成mkyaffs2
make clean
make
注:编译这个工具,不需要修改Makefile,用file看下属性,它是在x86-64运行的,这是没问题的,因为它就是在Ubuntu下使用的,不是在嵌入式环境下去执行使用的。
将它复制到/usr/bin下以后用起来方便了,可以直接使用这个指令了,你可一在终端敲mkya,然后TAB建看不能出来。
sudo cp mkyaffs2 /usr/bin/
4) 生成文件系统
sudo mkyaffs2 --inband-tags -p 2048 rootfs rootfs_yaffs2.img
5.内核修改
内核也要做一定的修改,具体如下:
1)make menuconfig进入到内核配置界面
make menuconfig
2)默认用的RAM filesytem 需要去掉
General setup —>
[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support
3)默认的Boot option需要修改成如下:
Boot options --->
(noinitrd root=/dev/mtdblock2 rootfstype=yaffs2 rootflags=inband-tags console=ttyS0,115200n8 rdinit=/sbin/init mem=64M)
4)NAND Flash驱动相关配置
Device Drivers --->
Generic Driver Options --->
<*> Nuvoton NUC970 FMI function selection
Select FMI device to support (Support MTD NAND Flash) --->
5)选中MTD的支持
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
<*> Caching block device access to MTD devices
-*- NAND Device Support --->
-*- Nuvoton NUC970 MTD NAND --->
NUC970 NAND Flash pin selection (Port C) --->
6)选中yaff2文件系统的支持
File systems --->
[*] Miscellaneous filesystems --->
<*> yaffs2 file system support
7)保存配置,编译
6.结果查看
6.1.验证文件系统是否可用
1)将上述生成的kernel 970uimage、文件系统rootfs_yaffs2.img、还有之前第三讲生成的uboot.bin,uboot-spl.bin,以及env.txt 下载到板子里,env.txt做了一些改动,主要是加入了boocmd那一行,这样下载进去就能直接启动了。
baudrate=115200
bootcmd=nboot 0x7fc0 0 0x200000; bootm 0x7fc0
bootdelay=1
ethact=emac
ethaddr=00:00:00:11:66:88
stderr=serial
stdin=serial
stdout=serial
烧写前,最好对芯片进行一次Erase。几个文件的烧写类型及地址大家注意下,别搞错了。
2)上电,看看效果,调试串口打印信息如下:
这一次很顺利啊,一次就成功了,这就说明我们上述做的根文件系统是可以正常使用的了。
6.2.验证helloworld能否在板子上运行
我们还要看看我们之前编译的helloworld程序能不能运行,我们把helloworld放到板子里去,怎么把这个文件放到板子上呢?有以下几种方式:
a) 把Helloworld在Ubuntu下放到rootfs文件夹里,然后按照上述的方法打包、下载进去。
b)通过scp或者NFS服务,直接通过网口放到板子里
c) 先放到U盘里,然后U盘插入到板子上,再复制过去
方法a)自然没问题,不过有些麻烦,方法b)现阶段我们的文件系统并不支持,暂时先不弄了,下一篇文章会介绍scp的移植,我们来试试方法c)吧
1)插入U盘到电脑上,把helloworld拷贝过去
2)把U盘插入到板子上,这时调试串口会自动输出如下信息,提示我们有USB Mass Storage设备接入了,看来内核已经把USB这部门驱动已经做进去了。这不是有点像我们给PC机重装Windows系统的过程,默认鼠标键盘也是可以直接使用的。
我们进入到/dev目录里,可以看到有sda1设备,LINUX所有的存储设备都是映射成"文件"来访问的,包括U盘、光驱、硬盘等。这个sda1就对应我们刚插入的U盘。
那么该如何访问U盘的东西呢?
我们需要挂载,使用mount指令,我们执行以下命令:
mkdir mnt
cd mnt
mkdir usb
cd usb
mount -t vfat /dev/sda1 /mnt/usb
cd /
mkdir opt
cp /mnt/usb/helloworld /opt
完成的事情是把sda1挂载到了/mnt/usb目录上,这样/mt/usb目录里就有了U盘里的内容,然后再复制到了系统的/opt目录。
我们在/opt目录里执行./helloworld,提示如下错误:
-/bin/sh: ./helloworld: not found
这是怎么回事呢?原因很简单,helloworld的执行是需要依赖一些库的,不可能系统里什么都没有就执行能执行成功了。所以需要我们把交叉编译链~/nuc972/toolchain/arm-2014.05/arm-none-linux-gnueabi/libc/lib里的库文件复制到板子的lib目录里。
可以先到arm-2014.05/arm-none-linux-gnueabi/libc/lib目录中,压缩下
tar -cvf lib.bin *
然后通过U盘放到板子的/lib目录中解压
tar -xvf lib.bin
这样操作之后,再次执行helloword,结果如下:
另外可以对板子断电-再上电,看看我们之前操作的内容都还在,因为它是存到NAND Flash里的,所以断电是不丢失的。
7.结束语
如果你亲自动手实现了这篇文章介绍的所有内容,相信你对根文件系统一定有了一个非常感官的认识。包括这篇在内,我用了5篇文章一直在介绍嵌入式Linux基础环境相关的内容,你应该也能感受到这和我们以前接触的单片机开发还是有着较大的差异。从下一篇文章开始,我们就正式进入到具体的应用了。我会陆续介绍GPIO、UART使用;网络通信;WIFI使用;摄像头采集数据;EC20 4G模块使用;QT编程;Opencv使用等。
相关问答
怎么样才能复制adobe flash player 打开的内容?-ZOL问答FLASH讨论回答(6)要将网页上的内容保存为PDF文件,您可以按照以下步骤操作:首先,您需要安装一个虚拟打印机软件,例如PdfFactory。您可以通过Google搜索找到更...
有什么好玩的火柴人游戏?火柴人游戏是指,由简单笔画组成的人物,在加工制作的游戏,这类游戏的特点就是打击感抢、可操控性好,当然最大的优点还是小巧便捷。不过火柴人游戏大多都是Flas...
Adobe停止更新 flash 后,对大家有什么影响?DZ论坛上插入的解析视频还能看吗?说起Flash技术可能有很多人不知道,但是在几年前Flash技术是被广泛应用的,比如:QQ空间里的各种动画装饰效果、各大视频网站的播放器、一些动画及小游戏等。什...
gui 移植 什么意思?移植GUI有三部分内容。第一,将显示屏的驱动与GUI关联起来,第二,通过实际的显示屏参数来配置GUI,例如显示屏的尺寸,是否支持触摸等,第三,移植触摸屏驱动。...
学嵌入式linux要先学什么?那么这份嵌入式linux学习路线分享给大家。1、嵌入式高级C语言Linux系统LinuxUbuntu操作系统安装、使用、Linux常用命令、samba服务器、SSH远程登录GCC编译器...
影视后期合成可以转做影视后期制作吗?适合吗?该软件是影视后期制作的基础。 第二,音频处理软件GoldWave。与Sony Sound Forge、Adobe Audition相比,GoldWave并不先进,但它小巧、实用,具备录音、...
问问看大家金立手机怎么换系统_其他问答_系统粉手机不支持换其他手机的系统哦,花花其他手机的系统有可能会到手机系统异常,无法使用的风险。塘沽服务最好的佰瑞装饰公司为您解答手机不支持换其他...
你玩过哪些奇葩游戏?谢邀要是奇葩游戏,笔者这么多年也是玩过不少,下面列举一些比较另类的游戏人面鱼:禁断之宠《人面鱼:禁断之宠》是日本世嘉推出在DC(DreamCast)平台上的一...而...
多年来,Java几乎稳居TIOBE编程语言排行榜第一,它有什么优势?..首先,Java语言之所以能够迅速在科技行业内普及,一个重要的原因是Java语言的出现恰好契合了Web时代对于编程语言的要求,可以说Java语言的大流行是互联网时代发...
什么是CSP?C语言天然好的"移植性/高效性/灵活性",一直以来都是最受程序员青睐的语言,现在用CSP技术我们就可以轻松地将C语句直接嵌入到HTML源文件中并叫它CSP了...