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

相關文章
相關標籤/搜索