發現不少人在LiteOS的移植過程當中總會遇到一些問題,如今簡單作一些總結。後續有新的問題提再繼續補充。javascript
一、CMSIS版本致使的問題java
問題現象通常以下圖所示,編譯後報錯,Undefined symbol __get_IPSR (找不到 符號__get_IPSR )。面試
分析:該問題通常出如今stm32f103系列的單片機使用標準庫移植的狀況下。F103系列單片機標準庫只更新到3.5版本,cmsis版本較低。函數
內核相關的文件中缺乏 __get_IPSR 函數。ui
解決辦法有三種:spa
一、將標準庫替換成HAL庫。(代碼改動大,有些人可能不肯意。但hal庫是趨勢,建議你們及早準備).net
二、從mdk安裝目錄中複製最新的cmsis文件出來,替換掉當前工程目錄下的文件。調試
即將MDK安裝目錄下 Packs\ARM\CMSIS\5.5.1\CMSIS\Core\Include 目錄下的頭文件,複製到當前工程目錄下CMSIS頭文件路徑下。日誌
三、將liteos源碼中arch\arm\common\cmsis 目錄下的文件,複製到當前工程目錄下CMSIS頭文件路徑下。code
二、沒法下載和調試代碼
問題現象通常是:首次下載代碼後,沒法進行調試,找不到器件;有的狀況下也沒法再下載程序。
分析:該問題通常是因爲使用STM32CubeMX生成裸機工程致使的。在配置時,沒有使能Debug功能,致使調試接口禁用。
解決方法:配置時,要使能串行調試功能(若是使用的是SWD接口)。以下圖:
若是因爲禁用了SWD致使已經不能下載程序了,那麼須要先按住CPU的復位,而後再點擊下載程序。
三、沒有重定向printf致使程序死掉
內核在運行過程當中,有時會打印一些日誌,打印函數使用的是printf。
所以,若是沒有重定向printf函數,那麼會致使程序死掉。或者,你能夠關閉日誌打印功能,不使用printf函數。
重定向printf的示例代碼以下,須要勾選使用微庫:
///重定向c庫函數printf到USART1 int fputc(int ch, FILE *f) { /* 發送一個字節數據到USART1 */ UART_SendByte(USART1, (uint8_t) ch); return (ch); } ///重定向c庫函數scanf到USART1 int fgetc(FILE *f) { /* 等待串口1輸入數據 */ while((USART1->SR&UART_FLAG_RXNE)==0); return (int)USART1->DR&0xff; }
四、關於OS是否託管中斷
我的建議在移植的時候選擇OS不託管中斷(LOSCFG_PLATFORM_HWI 定義爲 NO)。
若是選擇OS託管中斷(LOSCFG_PLATFORM_HWI 定義爲 YES),那麼移植相對比較複雜:
1.須要修改啓動文件,將經過DCD指令開闢的中斷向量表刪除;
2. 同時,要修改sct文件,加入中斷向量表存儲地址相關的內容。
寫程序時,應在內核初始化以後,再使用 LOS_HwiCreate 建立中斷,綁定中斷處理函數。
在內核初始化以前調用LOS_HwiCreate 是無效的,切記。
五、關於時間片輪轉
若是 LOSCFG_BASE_CORE_TIMESLICE 定義爲 NO ,關閉時間片輪轉,則任務沒法按時間片方式調度。
即:當任務優先級相同時,若任務不主動阻塞本身,則不會觸發進行任務調度。表現爲:若是建立了兩個相同優先級的任務,則其中一個任務會一直佔用 CPU,另一個任務沒法獲得執行。
六、其餘問題
其餘問題,你們能夠按以下方式排除:
一、排除配置問題,能夠對比target_config.h中的宏定義,找出本身是否有配置不對的地方
二、在線調試,日誌打印等。
至於使用問題,能夠仔細閱讀官方教程,仍是蠻詳細的。
在實際項目過程當中,總會遇到各式各樣的問題,你們須要掌握調試手段,善於解決問題,提升本身的能力!
做者:llb90
javascript基礎修煉(13)——記一道有趣的JS腦洞練習題