這些問題都是我在做大創專案的時候遇到的問題,這次先把記憶體問題說了,下次說怎麼用**實現通訊協議的,這是我第一次寫部落格,請各位多多指正。
再說之前先感謝學校老師和公司帶我的師傅的幫助,沒有他們的幫忙很那開展除錯。
我用的是stm32f103c8t6,flash是128k,ram是20k,只要是涉及演算法和通訊的就有點不夠用
再加上演算法裡要用到兩個500的陣列,於是我懷疑是記憶體的問題。
uint32_t aun_ir_buffer[
500]
;//ir led sensor
int32_t n_ir_buffer_length;
//data length
uint32_t aun_red_buffer[
500]
;//red led sensor data
int32_t n_sp02;
//spo2 value
int8_t ch_spo2_valid;
//indicator to show if the sp02 calculation is valid
int32_t n_heart_rate;
//heart rate value
int8_t ch_hr_valid;
//indicator to show if the heart rate calculation is valid
uint8_t uch_dummy;
於是我開啟編譯好自動產生的listings資料夾下的.map檔案,找到image component sizes
發現total rw size (rw data + zi data)
,已經超過20k到達31k多,也就是上電後flash要往ram寫的資料。怪不得我一上電就宕機。
#2.解決方法
#2.1 檢視變數
你在**裡申請的所有變數,包括區域性和全域性變數,都能在.map裡看到,變數在image symbol table
下找,區域性變數local symbols
全域性變數global symbols
我發現我的兩個500陣列全在區域性變數裡,可能寫入棧的時候爆了,於是我把這兩個放到全域性變數,為了防止相同問題,我們需要把相對應棧的大小調大一些。
stm32一般是先把變數寫入棧的,如果變數太大或者棧太小有可能會導致卡頓或者宕機。
#2.2 修改棧大小
在stm32的啟動彙編檔案裡有相關設定
stack_size equ 0x00001fff
area stack, noinit, readwrite, align=
3stack_mem space stack_size
__initial_sp
; heap configuration
; heap size (in bytes)
<
0x0-
0xffffffff:8
>
;<
/h>
heap_size equ 0x00000000
area heap, noinit, readwrite, align=
3__heap_base
heap_mem space heap_size
__heap_limit
preserve8
thumb
;stack_size是棧大小的設定
;heap_size一般用於malloc函式,如果**裡沒有malloc函式,建議清零
#2.3 修改棧大小出現編譯錯誤解決方案
當然具體的stack_size
的大小需要自己去除錯,只要編譯不報錯就行,我這裡調的是0x00001fff,大一點編譯就會報錯,就像這樣。
如果你不確定程式是不是在執行,你可以加乙個心跳燈,讓他跑一遍程式就閃一下。
led1
( on )
;delay
(0x4000);
led1
( off )
;delay
(0x4000
);
延時**
void
delay
(__io u32 ncount)
stm32記憶體分配
原文 1 棧區 stack 由編譯器自動分配和釋放,存放函式的引數值 區域性變數的值等,其操作方式類似 於資料結構中的棧。2 堆區 heap 一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由作業系統 分配 方式類似於資料結構中的鍊錶。3 全域性區 靜態區 static 全域性變數和靜...
STM32記憶體管理
這是我的第一篇文章,寫的不好請多多見諒 針對stm32f429來進行講解,其他型號的也可以參照學習 相信很多新手在記憶體管理這個程式中比較疑惑,為什麼分配那麼大,可不可以更改大小?但是改大了編譯會錯誤又是為什麼?這裡將對大家心中的疑惑進行講解,並且教大家進行計算。當該項值為 0 的時候,代表對應的記...
STM32之記憶體
記憶體的分類 1 動態記憶體 dram。為什麼稱之為動態記憶體呢?是與他的硬體構成有關。動態隨機儲存器dram 的記憶體單元是以電容的電荷來表示資料。有電荷表示1,無電荷表示0,但是隨著時間的推移,代表1的電荷會放電,代表0的電荷會吸收電荷,因此它需要定期重新整理,所以就有了動態記憶體之稱。重新整理...