FreeRTOS On STM32 – ARM7TDMI启动脚本(1)

最近开始阅读ARM7TDMI的启动脚本,目的是修改一些东西,先总结一下基础:

处理器特点

ARM7是带有流水线的(取指、译码、执行)!这点很重要,如果没有这个有些功能基本就没法实现,而一些功能实现起来会特麻烦,比如说内存模式的映射,这个以后会说的。ARM7的PC指针是指向取指的地址,而非执行的指令的地址。所以在执行的时候读取PC的值永远是+2个指令地址(ARM是每个指令4bytes,thumb是2bytes)。

这个有什么用?

晕,当你做任务切换的时候就有用了,你需要保存当前执行的任务的状态、指令地址、堆栈,而这个就需要一直记得PC是指向取指地址的(记得还有lr这个寄存器哦)。

特殊的指令

ARM7有两个指令ldmia和stmia,这两个的用法:

ldmia r8!, {r0-r7}

这个是把r8指针,里面的值当成起始地址,连续依次拷贝8个值到r0到r7,等价于如下的代码。

看出问题了吧,r8是更新的。因为r8后面加了一个感叹号,表示基址回写(当然ldmia必须这样)。
所以最开始看到着段代码的时候百思不得其解:

ldmia r8!, {r0-r7}
stmia r9!, {r0-r7}
ldmia r8!, {r0-r7}
stmia r9!, {r0-r7}

你没看错,是重复了两次,这个是用于拷贝ARM7的中断向量表,第一次是拷贝中断向量,第二次是拷贝中断服务程序的入口地址,需要结合代码来看。

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.