之前了解過stm32 的記憶體分配問題,對於藍芽晶元51822的記憶體分配問題把專案中,遇到了.bss和。data部分超了的問題,這其實就是宣告的變數和stask 及 heap的大小總和超出了微控制器的ram,仔細的分析了下nrf51822的ram的分配,這裡做下分享。
首先是看下nrf51822的rom和ram 的大小:
我這邊選用的晶元型號是 qafac就是有rom 256kb ram 32kb.
文件的20頁21頁
下面看下在keil工程中的配置:
實際中的ram的開始位置並不是由0x20000000開始,這是因為最開始的部分大約有8k的空間是給了藍芽協議棧使用。
我這邊使用的藍芽協議棧版本是s110 找到相應的文件有描述協議棧最小使用的ram和預設的ram大小如下:
有上面可以看到協議棧占有的ram的大小為8k ,所以片上一共有的32k的ram給應用程式的實際上只有24k了。
文件的35頁
下面在看下在啟動檔案中定義的棧和堆的大小,實際上在程式執行過程中使用的棧和堆以及使用的變數都是存放在ram中。
可以看到分配的stask size 為 7200 就認為為7k吧,heap size 為3584 就認為為3k吧。
在看下編譯生成的map檔案.
可以看出這個時候編譯出的rw size 是23k 左右,這個時候是微控制器的ram是夠用的,當然在鏈結的時候沒有問題,能夠生成map檔案說明**的ram肯定是夠用的。
這裡說下:
code :是程式中**所佔位元組大小
ro-data :程式中所定義的指令和常量大小 (個人理解 :read only)
rw-data :程式中已初始化的變數大小 (個人理解」:read/write)
zi-data :程式中未初始化的變數大小 (個人理解 :zero initialize)
這裡看到的toal rw size 其實是包括了啟動檔案中分配的棧和堆的大小的。
到這裡就知道假如程式報報.bss 或者 .data 資料儲存不足的話,如果程式的優化等級已經是-o3的話,這個時候就要考慮動下啟動檔案中的棧和堆的大小,不過這個在棧和堆如果過小會影響程式的執行,具體在程式執行中怎麼測量堆和棧的使用情況這個還沒有研究過,這樣的話那只能去修改程式中關於變數的申請了,程式中不要宣告大的陣列,尤其是在牽制到協議解析的時候,不要使用太大的資料區快取資料。
nrf51822 廣播間隔
1.目的 設定廣播間隔,已達到乙個功耗最佳的狀態 2.分析 廣播間隔,指每次藍芽廣播之間的間隔,間隔越大功耗越低,間隔越小功耗越大 3.平台 協議棧版本 sdk10.0.0 編譯軟體 keil 5.14 硬體平台 nrf51822最小系統 4.步驟 在main.c static void adver...
NRF51822和NRF52832的簡單介紹
1 功耗方面 nrf52832更是在nrf51822的基礎上簡直將功耗降低了一半 2 更好的rf體現,主要是發射功率和接納敏感度更好。發射功率,他哥倆適當,都是 4dbm nrf52832的靈敏度是 96dbm,nrf51822的接納靈敏度是 93dbm。3 更強的處理才能,nrf52832的處理器...
nrf51822 修改藍芽名字
1.目的 修改藍芽的名字 2.分析 藍芽名字最長設定為20個位元組,超過20個位元組為無效 3.平台 協議棧版本 sdk10.0.0 編譯軟體 keil 5.14 硬體平台 nrf51822最小系統 4.步驟 首先,要知道設定名字的api 在ble gap.h brief set gap devic...