【LiteOS】LiteOS移植常見問題

發現不少人在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

 

往期文章精選

若是讓你手寫個棧和隊列,你還會寫嗎?

挑戰10個最難的Java面試題(附答案)【上】

javascript基礎修煉(13)——記一道有趣的JS腦洞練習題

【個人物聯網成長記3】如何開發物聯網應用?

【HC資料合集】2019華爲全聯接大會主題資料一站式彙總,免費下載!

 對你沒有看錯!不到 10 行代碼完成抖音熱門視頻的爬取!

Python面試的一些心得,與Python練習題分享

相關文章
相關標籤/搜索