深度解剖~ 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的閱讀筆記。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章