分享

今日头条

 leafcho 2017-12-02

什么是交叉编译:交叉编译就是在自己的平台上编译另一个平台的程序,由于嵌入式开发版资源有限,不能在本地编译连接,所以在Linux环境下,使用交叉编译,

对程序进行编译,这样编译好的程序就能在arm平台上运行了。

裸机启动过程:Cortex-A9

1.该芯片有64K ROM(iROM),256K SRAM(iRAM)

2.启动方式有ad卡启动,emmc启动

3.然后它的启动过程是分阶段的,首先运行iROM(厂家固话好的代码,不开源),然后该iROM会去读取外部按钮状态,来决定是用sd卡启动还是emmc启动,然后根

据选择的启动状态,来去存储器找BL1(也是芯片特定且不开源的代码--芯片公司提供),假如选择的启动方式是SD卡,则会去SD卡中找BL1的程序,该程序会放到

运存中执行,同时BL1代码中还有一部分是调用SD卡中的BL2程序,该程序是用户自己定义的,规定大小为固定的14K(最后包含一个和校验)。

问题:如果我们写的程序大于14K怎么办?那么我们所编写的程序的前14K代码要实现的作用就要是实现代码搬移了(把整个用户程序完整的从启动储存设备中复制到

外部扩展DDR3内存中,然后跳转到DDR3中运行),如果带了操作系统,那么还要实现把OS复制到DDR3中,然后引导启动。同时,如果小于14K,则多余的部分填充0.

启动流程知道了,那么如何制作BL2呢?

1:首先先拿到我们的要下载到芯片的裸机程序:led.c

网友最爱的Cotex-A9单片机入门教程:第一步、裸机编程(嵌入式)

第一步:把.c编译成.o

网友最爱的Cotex-A9单片机入门教程:第一步、裸机编程(嵌入式)

第二部:对led.o连接,由于制作的是在A9芯片上运行的程序,所以添加一个-Ttext 0x02023400

至于为什么写这一串数字,是因为BL1阶段,会把BL2代码复制到SRAM来运行,而芯片规定了BL2在SRAM中运行的地址:如下图

网友最爱的Cotex-A9单片机入门教程:第一步、裸机编程(嵌入式)

就这样,能在A9芯片上裸机运行的程序就编译连接好了,下面要做的就是制作BL2文件了—因为写的程序不足14K,所以需要填充0而且要加和校验以满足14K的大小。

如何制作BL2?芯片公司给了我们制作BL2的源代码,我们只需要make一下,就会生成一个执行程序(该程序能够制作BL2)。我们要做的就是运行该程序,并加上3个参数:参数1:要制作的文件(LED.bin),参数2:制作完成后的命名(我写bl2.bin) 参数3:大小—14K-14336

OK,现在BL2有了,BL1(厂家给,不开源)也有了,我们现在要做的就是下载,我们选择SD卡下载,厂家送了一个脚本,该脚本的具体功能就是将我们写好的BL2和BL1读到磁盘上面,我们所要做的就是如何使用脚本(需要2个参数,参数1:SD卡路径 /dev/sdb 参数2:制作好的led.bin);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多