發現很多人在LiteOS的移植過程中總會遇到一些問題,現在簡單做一些總結。后續有新的問題提再繼續補充。
1、CMSIS版本導致的問題
問題現象一般如下圖所示,編譯后報錯,Undefined symbol __get_IPSR (找不到 符號__get_IPSR )。
分析:該問題一般出現在stm32f103系列的單片機使用標准庫移植的情況下。F103系列單片機標准庫只更新到3.5版本,cmsis版本較低。
內核相關的文件中缺少 __get_IPSR 函數。
解決辦法有三種:
1、將標准庫替換成HAL庫。(代碼改動大,有些人可能不願意。但hal庫是趨勢,建議大家及早准備)
2、從mdk安裝目錄中復制最新的cmsis文件出來,替換掉當前工程目錄下的文件。
即將MDK安裝目錄下 Packs\ARM\CMSIS\5.5.1\CMSIS\Core\Include 目錄下的頭文件,復制到當前工程目錄下CMSIS頭文件路徑下。
3、將liteos源碼中arch\arm\common\cmsis 目錄下的文件,復制到當前工程目錄下CMSIS頭文件路徑下。
2、無法下載和調試代碼
問題現象一般是:首次下載代碼后,無法進行調試,找不到器件;有的情況下也無法再下載程序。
分析:該問題一般是由於使用STM32CubeMX生成裸機工程導致的。在配置時,沒有使能Debug功能,導致調試接口禁用。
解決方法:配置時,要使能串行調試功能(如果使用的是SWD接口)。如下圖:
如果由於禁用了SWD導致已經不能下載程序了,那么需要先按住CPU的復位,然后再點擊下載程序。
3、沒有重定向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;
}
4、關於OS是否托管中斷
個人建議在移植的時候選擇OS不托管中斷(LOSCFG_PLATFORM_HWI 定義為 NO)。
如果選擇OS托管中斷(LOSCFG_PLATFORM_HWI 定義為 YES),那么移植相對比較復雜:
1.需要修改啟動文件,將通過DCD指令開辟的中斷向量表刪除;
2. 同時,要修改sct文件,加入中斷向量表存儲地址相關的內容。
寫程序時,應在內核初始化之后,再使用 LOS_HwiCreate 創建中斷,綁定中斷處理函數。
在內核初始化之前調用LOS_HwiCreate 是無效的,切記。
5、關於時間片輪轉
如果 LOSCFG_BASE_CORE_TIMESLICE 定義為 NO ,關閉時間片輪轉,則任務無法按時間片方式調度。
即:當任務優先級相同時,若任務不主動阻塞自己,則不會觸發進行任務調度。表現為:如果創建了兩個相同優先級的任務,則其中一個任務會一直占用 CPU,另外一個任務無法得到執行。
6、其他問題
其他問題,大家可以按如下方式排除:
1、排除配置問題,可以對比target_config.h中的宏定義,找出自己是否有配置不對的地方
2、在線調試,日志打印等。
至於使用問題,可以仔細閱讀官方教程,還是蠻詳細的。
在實際項目過程中,總會遇到各式各樣的問題,大家需要掌握調試手段,善於解決問題,提高自己的能力!
作者:llb90
往期文章精選
javascript基礎修煉(13)——記一道有趣的JS腦洞練習題