1. 程式人生 > 其它 >freertos 編譯c++失敗_深度解剖~ FreeRtos閱讀筆記1

freertos 編譯c++失敗_深度解剖~ FreeRtos閱讀筆記1

技術標籤:freertos 編譯c++失敗

上帝不僅給了我一顆低頻的cpu還送了個劣質的晶振,可悲可嘆!無奈在家休養,不然的話晶振偷停我可就駕鶴西去了。。。不過這也是個好機會,在家靠著窗戶晒著太陽,偶爾讀讀原始碼,都很好。就是工資沒了~

接連幾個專案都使用了freertos,作為剛剛畢業一張白紙的我只能先去摸索一些api怎麼去呼叫,需要填入哪些引數,才能達到自己的目的。程式不出問題就完事大吉了,不過稍有異常出現例如某個任務莫名奇妙的被掛起,超出預想,只憑借對api的瞭解很難追查問題的根源,所以我決定適當深入瞭解下freertos,順便學習下大神們的編碼風格,免得光頭強總說:看你的程式碼像吃屎。我覺得看一些原始碼至少能給屎加點孜然。。。

上電覆位

要讓FreeRtos跑起來,首先要。。。給板子上電!

接觸了一些晶片,發現它們都是將初始的異常向量表放在自己flash(也有可能是rom)的0地址,晶片上電覆位在0地址,0地址開始的四個位元組存放執行棧地址,緊跟著4位元組是復位後要執行的第一行程式碼的地址(bootloader),引用一張cortexM3指南的一張圖片:

8208fa89eb89a2491bf22f58b9770974.png

要執行的第一行程式碼一般是彙編實現的初始化工作,因為此時並沒有對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的閱讀筆記。