1. 程式人生 > >演算法移植到STM32微控制器中會遇到的一些問題

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

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