深度解剖~ FreeRtos阅读笔记1

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

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

从上电到运行

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

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


取出的复位地址便是一些汇编引导代码段的首地址,这些代码主要用来初始化一些内存段,把0地址的栈位置赋给MSP,此时才具备C语言运行的环境。随后call main,这才跳入我们所熟悉的main函数。流程大致是这样吧,我并没有实际调试过这些初始化用的汇编代码,因为之前调试的板子都只带了这些文件库:iar下的startup.o,我没有看到源码,遗憾!

 

最后,引用一句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中。


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭