STM32記憶體優化

2021-10-03 07:39:50 字數 2506 閱讀 9560

這些問題都是我在做大創專案的時候遇到的問題,這次先把記憶體問題說了,下次說怎麼用**實現通訊協議的,這是我第一次寫部落格,請各位多多指正。

再說之前先感謝學校老師和公司帶我的師傅的幫助,沒有他們的幫忙很那開展除錯。

我用的是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的電荷會吸收電荷,因此它需要定期重新整理,所以就有了動態記憶體之稱。重新整理...