一鍵發布任務
獲取驗證碼

抵抗疫情共度難關,發布項目即可參與百萬項目補貼。點擊查看活動詳情>>

返回

發布成功


贊賞作者

贊賞金額:

  • ¥2
  • ¥5
  • ¥10
  • ¥50
  • ¥100
  • ¥200

支付金額:5

支付方式:

微信支付

贊賞成功!
你的贊賞是對作者最大的肯定~?

當前位置 : 首頁 > 方案訊 > 方案訊詳情
BlueNRG系列存儲分析(Flash and RAM)——工程師原創應用筆記
發布時間:2020-09-16 閱讀量:138 來源:我愛方案網 作者:LucienKuang

static stack BLE_OTA_ResetManager and app編者按】一些使用BlueNRG系列芯片的用戶希望預留部分Flash出來給特定的應用存放應用數據或者存放自己特定的應用程序,而又不知道如何修改程序或者配置。錯誤的配置可能讓程序無法運行起來,或者產生一些莫名其妙的錯誤。本文從各個方便介紹BlueNRG系列的存儲相關的基本概念和應用,只有理解了BlueNRG系列Flash和RAM相關的分布和OTA的方式,更改代碼或者配置才能得心應手。

溫馨提示: 請使用最新版本的SDK進行開發


linker中宏定義作用范圍

linker中宏定義可以定義一些宏,直接作用于鏈接腳本文件,需要注意的是,linker中宏定義并作用于.c文件或者.h文件,只作用于鏈接文件(.icf 或者.sct 或者 *.ld)。

 

官方默認提供的OTA的方式

官方默認提供了兩類OTA的方式,加上由于本身協議棧又可以固定在固定的位置(static stack),組合起來可以有4種。

OTA的詳細描述可以參考文檔: AN4869_ The BlueNRG-1, BlueNRG-2 BLE OTA (over-the-air) firmware upgrade.pdf


下面只介紹大致的類別。


A. 升級服務存在于應用端 BLE_OTA_ResetManager + Lower Application (with BLE OTA service) or BLE_OTA_ResetManager + Higher Application (with BLE OTA service)

BLE_OTA_ResetManager and app

 BLE_OTA_ResetManager and app.png

此方法reset manager 代碼可以比較小,2KB,OTA服務存在于應用程序中,應用程序可以備份,兩個應用程序都包含協議棧。如果使用靜態協議棧,則對應的Flash分布如下圖(下圖片是基于BlueNRG-LP的,如果是BlueNRG-1/2, Flash空間大小會不一樣,協議棧大小也不一樣,但這里主要描述基本框架,請忽略實際標記的Flash大小)

 

static stack BLE_OTA_ResetManager and app.png


B. 升級服務存在于boot端, BLE_OTA_ServiceManager + application

BLE_OTA_ServiceManager and app

 BLE_OTA_ServiceManager and app.png這種方式BLE_OTA_ServiceManager和application中都包含協議棧,OTA升級服務存在于boot程序BLE_OTA_ServiceManager中。

如果使用使用靜態協議棧,則Flash的分布是這樣的:

Static stack BLE_OTA_ServiceManager and app

Static stack BLE_OTA_ServiceManager and app.png 


這種方式協議棧固定在Flash的開始處,Boot中帶OTA服務,應用可以使用的空間比較大,上述圖片是基于BlueNRG-LP的,如果是BlueNRG-1/2, Flash空間大小會不一樣,協議棧占比也不一樣(這里側重描述Flash分布框架,請忽略實際標記的Flash大小)。


鏈接腳本文件分析:

鏈接腳本文件對于不同的編譯工具,是不一樣的。

Keil --> *.sct

IAR --> *.icf

True studio --> *.ld

下面分析BlueNRG-1/2的最新SDK中IAR平臺Chat工程目錄下BlueNRG2.icf文件,其他平臺一樣,可以進行類比。

分析前,我先介紹一個特點,由于Flash的擦除必須是整頁操作的,寫Flash之前必須將對應的頁擦除,所以Flash的劃分需要2K對齊。就算只使用到0.9KB,也需要劃分2KB區域。


RAM 相關的分析

BlueNRG-1/2和BlueNRG-LP系列內存基地址都是0x2000 0000, RAM相關的宏設置比較簡單,只有一個相關的宏定義MEMORY_RAM_APP_OFFSET,如果沒有定義,則默認為0x00。如果使用靜態協議棧方式(固定協議棧)則需要定義此宏,將協議棧使用的內存和應用程序使用的內存區分開來。

舉個例子:

SDK默認工程 BLE_Static_Stack + BLE_SensorDemo_Static_Stack 就是將協議棧使用的內存放在內存的低地址區域,將應用程序使用的內存放在高地址,即 BLE_Static_Stack 不定義偏移,使用從0地址開始,BLE_SensorDemo_Static_Stack 工程定義MEMORY_RAM_APP_OFFSET=0xyyy  ,其中0xyyy  可以設定為BLE_Static_Stack中使用內存變量的最后一個變量所在的地址,再加上最后一個變量所占的字節數。不同的編譯器(IAR, keil,studio)所編譯的協議棧占用的內存其實是略微有點點差別。

 比方說在BlueNRG-1/2 SDK中 BLE_Static_Stack工程中Keil工具編譯到的map文件如下圖:


BLE_Static_Stack_map.png


那么在BLE_SensorDemo_Static_Stack工程中應該設定MEMORY_RAM_APP_OFFSET為: >= 0x2000042C - 0x20000000 + 0x34 = 0x460BLE_Static_Stack_map

BLE_SensorDemo_Static_Stack_error_set.png  


這里官方這個工程Keil版本是自動生成的,和IAR的一致,需要用戶手工調整一下。


Flash 相關的分析

公共的宏:

MEMORY_FLASH_APP_SIZE: 定義限制程序使用Flash的大小,這里不一定是只指應用程序Flash大小的限制,里面的APP字符容易讓用戶誤會為應用程序,舉個例子,如果使用BLE_OTA_ServiceManager工程時,在linker中定義MEMORY_FLASH_APP_SIZE = 0x3000, 則表明BLE_OTA_ServiceManager的大小不能超過0x3000 字節 = 12*1024 字節. 這里BLE_OTA_ServiceManager雖然作為boot程序,但宏定義MEMORY_FLASH_APP_SIZE也是限制本身這個工程編譯的程序空間大小不能超過這個范圍。

普通不帶OTA服務的工程默認大小是: Flash size(256KB or 160KB) - NVM size(4KB)    // 160KB是當使用BlueNRG-1時,256KB 是使用BlueNRG-2 or BlueNRG-LP


MEMORY_FLASH_APP_OFFSET: 定義程序編譯鏈接地址的偏移,這里也是不一定是只指應用程序的偏移,同樣其他boot工程和其他工程也是同樣作為工程鏈接地址的偏移。


基本概念

hex文件帶地址信息,bin文件不帶地址信息。

BlueNRG系列MCU,程序地址在編譯時是強綁定的,比方說編譯的程序地址是從0x10050000,直接直接下載該程序的bin文件到0x10040000是無法運行起來的。

不同編譯平臺,對應的linker設置位置不同

Keil  ----->   Option for target 'xxxx' ---> Linker-----> Misc controls

IAR ----->  Options ---> Linker ---> Configuration file symbol definitaions

True studio ---> xxxx---> xxxxx  // 此處我暫時也沒有找到對應的地方

 

 

A類OTA(升級服務存在于應用端)Flash分布


A類.png

ST_OTA_HIGHER_APPLICATION:  Flash高地址部分的應用(上圖Higher app ),當使能這個宏,編譯應用程序到Flash的高地址,此方式支持OTA備份。

ST_OTA_LOWER_APPLICATION:   Flash低地址部分的應用(上圖 Lower app ),當使能這個宏,編譯應用程序到Flash的低地址,此方式支持OTA備份。

RESET_MANAGER_SIZE:  影響MEMORY_FLASH_APP_SIZE 和MEMORY_FLASH_APP_OFFSET的數值。如果使用A類靜態協議棧方式OTA,這個數值一般在應用程序的linker處重新定義(協議棧和這部分融合在一塊了)。

 

B類OTA(升級服務存在于應用端)Flash分布


B類.png

ST_USE_OTA_SERVICE_MANAGER_APPLICATION: 如果定義了此宏,使用上述方式B(升級服務存在于boot端, BLE_OTA_ServiceManager + application)內存方式

SERVICE_MANAGER_SIZE:  影響MEMORY_FLASH_APP_SIZE 和MEMORY_FLASH_APP_OFFSET的數值。如果使用B類靜態協議棧方式OTA,這個數值一般在應用程序端的linker處需重新定義。


C類非OTA類程序Flash分布

 

c類.png

 

 

對于BlueNRG SDK系列程序,沒有定義宏ST_USE_OTA_SERVICE_MANAGER_APPLICATION,ST_OTA_HIGHER_APPLICATION或者ST_OTA_LOWER_APPLICATION的程序,其實都會歸屬于C類非OTA類程序。


A B C 類Flash分布本質上只是計算MEMORY_FLASH_APP_OFFSET和MEMORY_FLASH_APP_SIZE的方式不同而已,如果應用需要,也可以改動這個鏈接腳本文件。


調試技巧

有時工程設置不對,程序沒有跑起來,用戶不知道如何排查錯誤,可以通過查看hex文件的內容來檢查程序是否設置正確。

用stm32 flash utility 可以直接打開查看hex文件內容。


stm32_stlink_utility.pngstm32_stlink_utility

 

用UE或者notepad++ 也可以以二進制形式打開,此方式需要對HEX格式比較了解。

ue

ue.png 


小結:

首先,你需要確定你應用程序采用哪種OTA方式,A類還是B類還是C類;然后,需要考慮的是是否使用靜態協議棧,使用靜態協議棧的方式能夠比較大力的節省Flash空間。從而,就可以確定程序采用的是哪種Flash分布,確定Flash分布后,更改相關的配置后,編譯生成hex文件,檢查對應的地址是否是正確的運行地址。


作者:LucienKUANG, 多年BLE 和Mesh相關開發和支持經驗,先后開發過,空氣波壓力治療儀系統,共享單車鎖,自拍桿,點讀筆電子價簽系統等等嵌入式軟件產品的嵌入式軟件開發。支持過ST,Dialog等大廠BLE相關產品的開發。在我愛方案網的個人店鋪為“路恩”,有類似的項目開發需求者歡迎聯系。

文章評論

您需要登錄才可以對文章進行評論。

沒有賬號?立即注冊

最新活動
意見反饋
取消
請輸入正確的手機號碼!
澳客网彩票-首页