返回列表 发帖

[站长原创] 跟我学嵌入式基础知识篇 - hello程序之后应该学习到的知识点

[站长原创] 跟我学嵌入式基础知识篇 - hello程序之后应该学习到的知识点

跟我学嵌入式基础知识篇 - hello程序实验之后应该学习到的知识点

嵌入式开发联盟www.mcuos.com

Osboy站长原创

QQ:82475491

Mcuos.com@gmail.com

对于做完本站的第一个hello程序的学员,你做外之后应该体会到的知识点:


(一)与ubuntu x86的机器上的hello程序对比体会到的

我们在ubuntu上编译执行一个helloworld程序是不是很轻松,直接gcc hello.c -o hello,然后直接执行./hello就可以了。在开发板上是不是比这个要负责一些?这个就是嵌入式开发者必须适应的一个过程哦:)针对嵌入式开发你需要设置交叉编译器路径,进行交叉编译,然后要把hello执行文件拷贝到rootfs中,然后还要重新和zImage打包(针对我们的initramfs来说)重新编译内核,然后还要下载到板子上,上电重启,才能最终执行hello程序。

(二)如何将hello程序状态到嵌入式开发板中?

我们是在ubuntu上交叉编译的hello程序,那么如何烧写到开发板中呢,一般有以下几种常用的烧写方法:

1)可以把这个程序放到u盘,或者sd卡中,通过PC机器,先把这个hello文件拷贝到sd卡,或者u盘中,然后拔出,再插到已经运行到跟文件系统中的开发板上,这个时候系统会识别有sd卡插入,你需要手动挂载sd卡:

一般命令类似于:mount -t vfat /dev/sda1 /var

然后再去/var中找你的hello程序,执行./hello就可以了。

2)可以和跟文件系统一起烧录,我们知道filesystem/rootfs下的跟文件系统,你只要把hello程序拷贝到rootfs/bin下面,然后重新编译内核,内核就会把rootfs一起编译到内核中去了,再通过sd boot方法,或者usb下载方法来烧写zimage内核,启动之后就能到/bin下面去找到你刚才的hello程序了。

这两种方法对于初学者来说一定要好好的体会。

(三)如何烧写zimage到板子上?

这章和(二)章有相同也有不同,相同的是都是把image写到板子中,只是(三)将介绍的更详细点,(二)之介绍了方法。

在6410的板子中,我们的烧写文件到板子的方法,有两种:

1)sd boot烧写,就是把板子跳线到sd卡boot,然后把卡插到pc机上,烧录mmc.bin,然后直接拷贝uboot zimage到sd中,拔出sd卡,再插入板子中,上电启动,这个时候板子的执行过程就是,先从sd卡中读取mmc.bin然后执行,这个mmc.bin其实就是针对sd卡的uboot,他要做的工作就是擦板子上的nandflash,然后把之前拷贝到sd中的uboot zimage到nand flash中。这个过程其实就是烧录文件到开发板的过程。

2)直接跳线nand boot,然后使用usb线下载,由于uboot中支持usb otg下载模式,所以我们可以启动板子到uboot命令行阶段,输入dnw c0008000回车,插上板子的窄口usb线和pc机器的usb口连接,这个时候pc上会提示安装dnw的驱动,安装好后,使用dnw工具的usb下载,选择要下载的文件,这个时候你就会看到,zimage其实是被下载到内存ddr的c0008000虚拟地址处了,千万注意这个时候还只是在内存中,并没有写进nandflash中,你如果想写进nandflash中必须,执行nand erase ,和nand wirte操作,具体的可参考飞凌的文档。

在此步骤中,如果你只想做仅仅一次调试,那么当你dnw下载完毕到c0008000处的时候,其实你就可以输入bootm去直接从ddr中执行zimage文件了,只是如果断电一次,这里存储的zimage就没有了,你需要每次都执行usb的烧写操作,这个非常适合我们初学者做调试内核烧写用,不用每次都烧写flash,慢啊。

(四)什么是跟文件系统rootfs

我想大家都用过ubuntu把,ubuntu的命令行终端你也用过的吧,那么现在你执行,cd /进到跟目录下,看看那些个目录文件是不是跟我给你大家的rootfs目录有些相似呢,那么ubuntu机器启动起来之后我们能看到这个文件系统目录,其实我们在板子上的原理是一样的,我们的目地就是用zimage内核去挂载rootfs的文件系统,然后我们在执行完内核挂载后,就能在板子上看到这些目录啦,如果你此时的rootfs中存放有hello程序的话,你就可以直接在板子上执行helloworld程序了。

有一点你需要注意,跟文件系统的挂载是需要实物载体的,比如是一个硬盘,一个u盘,一个sd卡,一个nand flash,或者是一块sdram,ddr内存块,都可以,而且跟文件系统的读写存储属性都是依赖于这个载体的,比如ubuntu pc的跟文件系统载体就是硬盘,硬盘肯定是可读写,可以保存的,所以你就能在ubuntu上保存任何文件,如果跟文件系统是挂载到一个内存块上,那么就不能保存文件了,我们知道内存是掉电即失的载体。这也就是为什么我要大家hack 飞凌的kernel,就是为了改这个载体,我们为了方便使用的initramfs的文件系统,这个系统的载体必须是ram,也就是内存块,所以bootoption中才有root=/dev/ram 这一项,说明就是内存块,而厂家标准的/dev/mtdblock,这个文件节点表示的就是mtd设备,即nandflash。


如果在hello程序做完之后你能体会并能彻底理解以上概念,那么恭喜你,你进步了不只是一点点,基本的嵌入式概念你已经很清楚了。

分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

这个我已经明白,期待更深入,期待更多的实验,好好利用好用手上的开发板。

TOP

理解了
hello跟rootfs打包在一起烧,或者hello单独拷贝过去执行

内核开启initramfs是为了和rootfs一起烧,省的烧2个文件,一个uImage一个rootfs

TOP

返回列表
网页右侧QQ悬浮滚动在线客服
网页右侧QQ悬浮滚动在线客服