深度解剖~ FreeRtos阅读笔记1

上帝不仅给了我一颗低频的cpu还送了个劣质的晶振,可悲可叹!无奈在家休养,不然的话晶振偷停我可就驾鹤西去了。。。不过这也是个好机会,在家靠着窗户晒着太阳,偶尔读读源码,都很好。就是工资没了~

接连几个项目都使用了freertos,作为刚刚毕业一张白纸的我只能先去摸索一些api怎么去调用,需要填入哪些参数,才能达到自己的目的。程序不出问题就完事大吉了,不过稍有异常出现例如某个任务莫名奇妙的被挂起,超出预想,只凭借对api的了解很难追查问题的根源,所以我决定适当深入了解下freertos,顺便学习下大神们的编码风格,免得光头强总说:看你的代码像吃屎。我觉得看一些源码至少能给屎加点孜然。。。

上电复位

要让FreeRtos跑起来,首先要。。。给板子上电!

接触了一些芯片,发现它们都是将初始的异常向量表放在自己flash(也有可能是rom)的0地址,芯片上电复位在0地址,0地址开始的四个字节存放运行栈地址,紧跟着4字节是复位后要执行的第一行代码的地址(bootloader),引用一张cortexM3指南的一张图片:

要执行的第一行代码一般是汇编实现的初始化工作,因为此时并没有对MSP进行配置,所以还不具备C运行环境,因此这些工作只能由汇编来代替:初始化内存各段,将0地址值填入MSP栈寄存器,拥有栈之后才能够运行C。随后跳入我们所熟悉的main函数,在main中应当永远得不到返回。流程大致是这样吧,我并没有实际调试过这些初始化用的汇编代码,因为之前调试的板子都只带了这些文件库:iar下的startup.o,我没有看到源码,遗憾!

异常向量表重定向

Flash或Rom 0地址存放异常向量表,在程序运行后它们的值很难进行变更甚至不能更改,假设需要使用某些中断,在代码编译之前就要将处理函数地址准确的填入向量表对应的位置,一旦程序运行就再也无法变更。

引用一句M3指南翻译:“然而,为了动态重分发中断,CM3 允许向量表重定位——从其它地址处开始定位各异常向量。这些地址对应的区域可以是代码区,但也可以是 RAM 区。在 RAM区就可以修改向量的入口地址了”。

可以和stm8的中断表代码对比下,stm8不支持向量表重定向:

struct interrupt_vector const _vectab[] = {

       {0x82, (interrupt_handler_t)_stext}, /* reset */

       {0x82, NonHandledInterrupt}, /* trap */

       {0x82, NonHandledInterrupt}, /* irq0 */

       {0x82, NonHandledInterrupt}, /* irq1 */

       {0x82, NonHandledInterrupt}, /* irq2 */

       {0x82, NonHandledInterrupt}, /* irq3 */

       {0x82, NonHandledInterrupt}, /* irq4 */

       {0x82, NonHandledInterrupt}, /* irq5 */

       {0x82, NonHandledInterrupt}, /* irq6 */

       {0x82, NonHandledInterrupt}, /* irq7 */......

如果要用中断,就必须在程序编译前将中断处理函数填入到_vectab数组中,一旦程序运行起来这个地址就无法更改,因为它处于代码段。然而重定向后将不会如此刻薄,因为我们可以将向量表重定向在ram中,即使程序运行起来你都可以随便将一个函数Register成为异常处理函数。

阅读内核之前先整理下单片机的启动流程,准备下篇开始记录对freertos的阅读笔记。

猜你喜欢

转载自my.oschina.net/u/3699634/blog/1544893