深度解剖~ FreeRtos阅读笔记1

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

 

接连几个项目都使用了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地址存放异常向量表,在程序运行后它们的值很难进行变动甚至不能更改,假设须要使用某些中断,在代码编译以前就要将处理函数地址准确的填入向量表对应的位置,一旦程序运行就再也没法变动。spa

引用一句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的阅读笔记。

相关文章
相关标签/搜索