STM32H7 記憶體管理實驗將記憶體使用率上傳至PC 以及硬體除錯演算法的小經驗
移植一些演算法到STM32上,演算法在PC上能夠執行,而移植到STM32的時候就會出現問題,
總結來說主要是因為編譯器的版本不同,MDK5的編譯器是很古老的編譯器,有些C語法會有問題。
常見的問題就是:
1.結構體賦值的時候,在32裡面的程式碼,結構體賦值必須要一個變數一個變數的賦值,不能夠直接賦值。
2.定義變數的時候不能用的時候才定義變數,需要將變數放在這個模組的前面
將演算法移植到STM32的時候,首先要考慮的就是STM32的記憶體大小是否足夠大,如果不夠大,一般就是報有.ANY的一些錯誤。(所以建議一開始移植演算法的時候使用比較好的硬體條件來移植,不然後面出了問題可能都不知道到底在哪裡出錯了)
如果定義的陣列太大,超出了STM32堆疊的大小,那麼STM32就會進入Hardfault。(因為進入Hardfault會有延時一行程式碼,所以建議檢視Hardfault的時候建議使用上一盤中JTAG除錯視窗中檢視中斷的視窗,能夠更明白的清除Hardfault在哪裡產生的)
除錯演算法一定要善用匯編語言,用匯編語言看C語言的本質.
移植演算法的時候也經常需要使用動態記憶體分配,STM32自帶的SRAM又很小,很難滿足演算法需要的SRAM要求,所以需要在32中外擴SRAM晶片。既然需要動態記憶體分配,自然也就需要記憶體管理了。在STM32中c語言標準動態記憶體分配的關鍵字malloc也就沒這麼好用了,最好就是要使用正點原子的記憶體管理使用,用它提供的分配函式來進行記憶體的分配與管理。
好了,說了這麼多,終於說到了標題的記憶體了,在除錯記憶體管理的時候,為了防止有申請的記憶體溢位堆疊的大小,因此在申請的時候最好每一步都呼叫一次的記憶體使用率函式檢視一下現在記憶體佔用率。防止堆疊溢位。而且在執行的時候,最好能夠清楚的瞭解到這個分配程式是在哪一個檔案的哪一行,這樣能夠方便我們的除錯。
這個函式的演示效果:
分享一下H7將記憶體使用率和獲取到這個函式在哪一行上傳到串列埠的函式。(即實現上面效果的函式)
.c檔案中的上傳程式碼:
void _uart_send_memused(const char *fileName, int line, u8 memx) { static const char* TEXT[4] = {"SRAMIN", "SRAMEX", "SRAM12", "SRAM4"}; u16 FingerVeinRun_memused=0; u8 paddr[20]; u8 send_cnt = 0; printf("%s: ", TEXT[memx]); FingerVeinRun_memused = my_mem_perused(memx); sprintf((char*)paddr,"%d.%01d%%",FingerVeinRun_memused/10,FingerVeinRun_memused%10); for(send_cnt=0; send_cnt<=4; send_cnt++) { USART1->TDR = paddr[send_cnt]; //等待發送結束 while((USART1->ISR & 0X40) == 0); } printf("\t%s\t%d", fileName, line); printf("\r\n"); } 在.h中需要新增的一個巨集定義。
#define uart_send_memused(memx) _uart_send_memused(__FILE__, __LINE__, memx)
獲取到檔名和行數不單單隻可以在記憶體管理函式中使用,也可以看你個人的需求移植到其他的地方。
轉載請說明出處~
歡迎關注文鴻學習筆記公眾號