[TencentOS_tiny_EVB_MX]之程式跳轉
- 2020 年 3 月 16 日
- 筆記
TencentOS_tiny_EVB_MX 本身是基於STM32的。
關於STM32的程式跳轉網上也有不少案例和介紹。
現針對TencentOS_tiny_EVB_MX這個,做一個簡單的程式跳轉demo分享出來。
一般程式跳轉,主要的功能是什麼呢。
一般有一個比較簡單的程式,可以作為boot程式,這個boot程式的功能,就是用於啟動app程式。
可能會有人不太清楚,一個STM的KEIL,怎麼還會有boot程式和app程式的區別呢。
這裡的boot和app只是個概念,是根據用途定義的。實際上兩個程式都是keil編譯出來的,和stm32底層沒有關係。
這樣做的一個好處呢,就是可以把boot設計的簡單,功能單一。只支援啟動,或者再額外支援可以通過串口或者USB等將編譯好的app的keil程式,拷貝到FLASH,再由boot啟動運行APP程式。
說白了,就是一個keil程式調用另一個keil程式的過程。
因為對於實際用途,特別是不方便使用keil來燒錄程式。
當然,對於IOT的應用來說,更希望具備遠程更新程式功能,那麼程式跳轉的設計就應運而生了。
說了一大堆,開始上程式碼。
首先拿TencentOS_tiny_EVB_MX里的兩個demo作為案例。

將hello_world作為boot程式,需要添加相應的程式碼部分。

既然FLASH要存在兩個程式,就要對FLASH進行空間劃分了。
手上的這個FLASH是256K的。
將前面的64K作為BOOT部分
將後面的作為APP部分。起始地址就是0x8010000。
當然需要根據實際的BOOT大小劃分。
有讀者想問,BOOT部分可以不使用TencentOS_tiny的程式碼模板嘛。這個就看你喜好了。
只是TencentOS_tiny這個程式碼模板放著是現成的,能用就用吧,多用一次就熟悉一次。
一 先看BOOT 部分。
BOOT要作什麼呢。
BOOT的程式也比較簡單,就是寫一個跳轉函數就可以了。


這樣BOOT程式部分就實現了。運行hello_world程式後,執行task1後,就跳轉到了APP程式了。
二 APP程式部分
1 KEIL的設置。

需要根據實際的APP地址來設置。
2 設置中斷向量表。


在應用程式里,在一開始,最好把中斷開起來。因為在BOOT程式,已經把中斷關閉的。因此需要在APP這邊,先把中斷使能了。
到這裡,就可以實現程式跳轉功能了。運行的效果列印消息就不貼上來了。
那麼問題來了。
BOOT程式一般只燒錄一遍,APP可能會需要添加功能,修改bug等需要維護,則需要重新燒錄。對於本地下載呢,可以直接使用KEIL只燒錄APP部分程式碼就行了
但是對於遠程呢,怎麼辦呢。
即便是能把文件傳輸到板子呢,是直接燒錄到APP所有的FLASH嗎、那不會把原來程式刷沒呢。
正在運行的程式,被刷掉了,不會異常結束嘛。
那這裡,SPI_FLASH就起到作用了。
可以先把收到遠程發過來的程式,存放到SPI_FLASH里。SPI_FLASH有8M呢,多存幾份都不是問題呢。
然後在BOOT啟動的時候,就可以把程式從SPI_FLASH拷貝到FLASH里,這樣就可以實現遠程更新APP用戶程式了。
下一篇文章會介紹下TencentOS_tiny_EVB_MX 中,SPI FLASH驅動的實現。可以讀寫SPI_FLASH。
貌似在TencentOS_tiny_EVB_MX里,沒有看到相應的驅動,不知道是不是還沒有實現,還是沒有檢查仔細。
如果想體驗的,可以到https://github.com/xidongliang/TencentOS_tiny_EVB_MX_Plus_QSPI
下載我移植的驅動,不過,沒有介紹,需要自己手動啟用支援QSPI宏,才能使用QSPI功能。
將會在下一篇文章介紹這個驅動。
就是參考了相關QSPI的驅動,然後將這個驅動移植到了TencentOS_tiny_EVB_MX板子
為了方便用戶編程,就直接在原來板子程式碼上的spi.c和spi.h進行修改。並沒有重新生成qspi等庫文件。

