演算法移植到STM32微控制器中會遇到的一些問題

2021-08-19 11:39:58 字數 1264 閱讀 9017

最近完成了一些演算法,需要移植到stm32f4系列的板子上用作實際工程,其中遇到了許多的問題,下面記錄一些除錯bug的經驗記錄。

1、編譯沒有問題,但是除錯執行時卻會進入到某一函式無法執行,之後跳到記憶體出錯的無限迴圈保護程式中。這樣的問題一般是記憶體溢位的問題,f4的板子自帶的記憶體空間是192k,但是在跑大一些的演算法或者演算法需要處理的檔案較多的情況下,記憶體也會不夠用,我這裡的解決方法是使用外擴的sram,原子家的開發板是外擴1m的sram的,將相關的大陣列用指標代替,然後申請記憶體空間到外擴sram即可解決。

2、演算法需要對檔案進行開啟和讀取操作,pc機可以用c語言的標準庫stdlib.h中的fopen和fread等函式,但是微控制器中不能用這個庫,微控制器中常用到的檔案系統是faft檔案系統,很容易就可以找到這個檔案系統的操作函式,其中會有對應的f_open、f_read的函式,其功能基本類似,但引數位置有些變化,在使用時注意這些變化。另外在開啟檔案時返回了空字串,這樣的情況根據源程式的提示應該是讀取發生錯誤,仔細檢查程式之後發現我一共有兩次開啟操作,第一次沒有問題,而第二次返回了空字元,兩次沒有放在一起,第一次開啟時候又進行了許多檔案操作,可能是這裡產生了問題,把第二次開啟檔案操作與第一次操作都放到靠近程式開頭,問題解決。

3、檔案指標記憶體申請的問題,演算法需要用到的記憶體空間很大,所以要把某些變數申請到外擴記憶體中,一維指標的沒什麼問題,只要如下這樣申請就可以

fp=(fil*)mymalloc(sramex,sizeof(fil));
但其中有一些二維指標作為陣列來用,就不能簡單的這麼申請

x=(float**)mymalloc(sramex,m*n*sizeof(float**));
這樣申請出來只是m*n個指標,而不能像操作二維陣列那樣操作這個指標。應該如下申請才不會出錯

x=(float**)mymalloc(sramex,m*sizeof(float*));

for(i=0;i

4、fatfs檔案系統和c標準庫中的檔案系統操作差別還是很大的,在演算法移植過程中遇到了許多的問題,最終也沒有找到問題的根源,只是通過一些手段算是避開了這些問題,一種就是不要開啟太多的檔案,還有一種就是檔案的開啟和提取出檔案中資料的計算不要放到一起,也就是先將所有檔案開啟然後將其中的內容載入到記憶體中,然後再對記憶體中的資料計算。這樣就算是避免了檔案開啟的一些問題,但是這樣卻導致了另外一些似乎是記憶體溢位的問題,最後還是靠完成某些計算寫入到檔案中然後復位整個系統解決問題,但是這樣只是算湊合完成了系統(我的演算法比較複雜,消耗的資源非常大,其實是不太適合在微控制器上執行的)。

微控制器學習(一) 微控制器基礎 STM32

io四種輸入工作模式 io四種輸出工作模 stm32有8個16位定時器 stm32具有強大的異常響應系統,它把能夠打斷當前 執行流程的事件分為異常 exception 和中斷 interrupt 並把它們用乙個表管理起來,編號為 3 6的中斷向量定義為系統異常,編號從7到19的為外部中斷。中斷向量控...

微控制器 STM32庫開發

1.stm32庫開發是什麼?st公司推出的基於cortex m3核心的mcu 微控制器,也就是通常所說的微控制器 倡導使用韌體庫開發,僅通過呼叫庫裡面的api 應用程式介面 就可以迅速搭建乙個程式,寫出各種使用者需要的應用。庫開發方式自頂向下,可以避免對底層暫存器的繁瑣操作,能大大降低學習門檻和開發...

stm32mcuid規則 STM32微控制器命名規則

stm32 系列微控制器命名規則 stm32 f 103 c 8 t 6 1 2 3 4 5 6 7 8 產品系列名 固定為 stm32 和 產品系列 f 通用系列 0xx 入門級 mcu0x0 超值系列在傳統 位和位市場極具競爭力 0x1 實現了高度的功能整合,提供多種儲存容量和封裝的選擇,為成本...