1. 程式人生 > >深度解剖~ FreeRtos閱讀筆記1

深度解剖~ 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中。