ARM裸机开发实战1


本科阶段的学习是应该学深还是学广呢,在我看来,应该学广,但是,也应该有自己特别擅长的一两个方向,其他的,浅尝辄止即可。

近几天又开了ARM Corrtex-A的新坑,明明连M系列都没怎么学明白的我胆子还真是大呢~,嵌入式老本行的我当然要把这部分死死地往深学。

废话不多说,总结一下Cortex-A系列裸机开发的容易懵逼的小知识点

本次使用的是正点原子Alphak开发板,搭载的是 I.MX6ULL芯片,单核Corex-A7。没有库,几千多页文档,看的我是着实头很大。不过在左神的带领下还是慢慢地摸清了它的门路,而且对STM32有了更深的理解,你说神不神奇!

编译与链接:

编译会检查.c或.S文件的语法错误,并根据文件生成

对应的.o文件,即object文件

链接会根据.o文件之间的引用关系,找到文件之间、变量之间的联系,将其链接成一个二进制文件,.elf文件,这是一个Linux的二进制文件,其中除了包含机器码,还包含着其他额外的信息,我们由.elf生成.bin文件,就是可以让单片机看懂的文件了。

链接 时还要注意链接脚本的编写,链接脚本确定了程序的链接地址,即程序存放到内存的哪一片区域。程序还分为text、bss、data、等静态程序段,还有堆、栈等动态单元,这些都要放在不同的地址上去。

生成.bin文件后,还需要在前面添加IVT、Bootdata以及DCD等信息,这些信息是芯片启动时Bootram内程序会参考的信息,用于初始化DDR、MMU等设备,锁定运行地址,还可以初始化一些寄存器。添加完成之后就可以烧写进SD卡了。

启动流程:

Bootram程序会检查几个IO以确定是串行烧写还是存储设备启动,是哪类存储设备,之后配置一些设备,然后会从运行地址开始运行程序。

汇编里要配置的东西:

STM32的初始化由ST官方提供的STARTUP.S完成,而我们的I.MX6ULL只能由我们自己来完成了,大体步骤如下:

首先我们的链接脚本决定了我们的_start:标号被链接到了0X87800000这个地址,我们的header又决定了我们的执行也是从0X87800000这个地址开始所以第一个执行的语句就是_start咯!

在_start:后,我们要手动配置中断向量表

原理就是改PC寄存器的值,是不是很简单。

复位中断这个很有意思,我们每次上电、复位都会使pc指向最一开始,也就是复位中断的位置,所以你说他没有也行