天天看點

程式寫超了(記憶體不夠了)

這裡僅将嵌入式寫程式中遇到的代碼全局變量過多(做的是雷射雷達的資料處理,資料量有些大),導緻SRAM不夠用的情況簡單分析如下:

SRAM用超之後(多加了個函數),keil編譯器報錯如下:

程式寫超了(記憶體不夠了)

大意就是No space,之前程式可以有效編譯的結果如下:

程式寫超了(記憶體不夠了)

代碼占用了多少空間:

Code是代碼占用的空間,RO-data是 Read Only 程式中的指令和隻讀常量的大小,如const型,RW-data是(Read Write) 初始化後為非0的可讀寫變量的大小,ZI-data是(Zero Initialize) 未被初始化或初始化為0的變量的大小。

一個ARM程式包含3部分:RO,RW和ZI(“ARM程式”是指在ARM系統中正在執行的程式,而非儲存在ROM中的bin映像(image)檔案,ARM映像檔案就是指燒錄到ROM中的bin檔案,具體這裡的差別我還沒有細究,具體可參考http://blog.sina.com.cn/s/blog_a189aca10101u1f1.html)

燒寫的FLASH被占用的空間為:Code+RO Data+RW Data=39158+1898+128=41184 Bytes目前是40.22KB

程式運作的時候,晶片内部SRAM使用的空間為: RW Data + ZI Data=128+48312=48440 Byte目前是47.3KB

目前調試用的闆子晶片是stm32f103RCT6,關于stm32晶片命名規則:

STM32 F 103 R B T 6 B xxx
1 2 3 4 5 6 7 8 9
  • 1.産品系列;

      STM32代表ST品牌Cortex-Mx系列核心(ARM)的32位MCU

  • 2.産品類型;

      F:通用快閃(Flash Memory)

      L:低電壓(1.65~3.6V)

        F類型中F0xx和 F1xx系列為2.0~3.6V

        F2xx和F4xx系列為1.8~3.6V

      W:無線系統晶片,開發版.

  • 3.産品子系列;

      050:ARM Cortex-M0核心

      051:ARM Cortex-M0核心

      100:ARM Cortex-M3核心,超值型

      101:ARM Cortex-M3核心,基本型

      102:ARM Cortex-M3核心,USB基本型

      103:ARM Cortex-M3核心,增強型

      105:ARM Cortex-M3核心,USB網際網路型

      107:ARM Cortex-M3核心,USB網際網路型、以太網型

      108:ARM Cortex-M3核心,IEEE802.15.4标準

      151:ARM Cortex-M3核心,不帶LCD

      152/162:ARM Cortex-M3核心,帶LCD

      205/207:ARM Cortex-M3核心,不加密子產品.(備注:150DMIPS,高達1MB閃存/128+4KB RAM,USB OTG HS/FS,以太網,17個TIM,3個ADC,15個通信外設接口和攝像頭;)

      215/217:ARM Cortex-M3核心,加密子產品。(備注:150DMIPS,高達1MB閃存/128+4KB RAM,USB OTG HS/FS,以太網,17個TIM,3個ADC,15個通信外設接口和攝像頭;)

      405/407:ARM Cortex-M4核心,不加密子產品。(備注:MCU+FPU,210DMIPS,高達1MB閃存/192+4KB RAM,USB OTG HS/FS,以太網,17個TIM,3個ADC,15個通信外設接口和攝像頭)

      415/417:ARM Cortex-M4核心,加密子產品。(備注:MCU+FPU,210DMIPS,高達1MB閃存/192+4KB RAM,USB OTG HS/FS,以太網,17個TIM,3個ADC,15個通信外設接口和攝像頭)

  • 4.管腳數目;

      F=TSSOP 20腳

      E=WLCSP 25腳

      G=QFN 28腳

      K=QFN 32腳 or WLCSP 36腳

      T=LQFP/QFN 36腳 or WLCSP 32腳

      C=LQFP/QFN 48腳 or WLCSP 49腳

      R=LQFP/BGA/WLCSP 64腳

      V=LQFP/BGA 100腳

      Z=LQFP/BGA 144腳 or WLCSP 143腳

      O=WLCSP 90腳

      I=LQFP/BGA 176腳

      B=LQFP 208腳

      N=BGA 216腳

  • 5.閃存存儲器容量:
    • 小容量

        4=16KB

        6=32KB

    • 中容量

        8=64KB

        B=128KB

    • 大容量

        C=256KB

        D=384KB

        E=512KB

        G=1024KB

        I=2048KB

  • 6.封裝資訊;

      T=LQFP

      H=BGA

      U=VFQFPN

      Y=WLCSP/ WLCSP64

  • 7.工作溫度範圍;

      6=工業級,-40~+85°C

      7=工業級,-40~+105°C

  • 8.内部代碼;

      A:48/32腳封裝

      Blank:28/20腳封裝

  • 9.包裝方式;

      TR:帶卷

      XXX:盤裝

      D:電壓範圍1.65V – 3.6V且BOR無使能

      無特性:電壓範圍1.8V – 3.6V且BOR使能

  • (stm32晶片命名規則來自:https://blog.csdn.net/tp1112/article/details/44060549)

可見自己使用的晶片屬于C系列Flash = 256K,RAM = 48K。是以晶片flash可用空間還是充足的,由于全局變量定義過多導緻

RAM不夠用了。

另外通過keil的配置界面也可以檢視晶片flash和RAM的大小,如下:

程式寫超了(記憶體不夠了)
程式寫超了(記憶體不夠了)

0x40000對應256KB的flash,0xC000對應48KB的RAM。

ROM主要指:NAND Flash,Nor Flash  ;RAM主要指:PSRAM,SDRAM,SRAM,DDRAM

flash是用來存儲代碼的,在運作過程中不能改;EEPROM是用來儲存使用者資料,運作過程中可以改變。

闆子晶片是stm32f103RCT6,屬于大容量晶片:

程式寫超了(記憶體不夠了)

對于keil中配置加載flash選擇的是512k(但實際自己使用的晶片flash是256KB,應該是按類選擇就這樣)

程式寫超了(記憶體不夠了)

同樣的程式,之前使用的是stm32F4系列的晶片,這次為闆子接口友善換了一下。這裡對比一下F4和F1的差别:

F4的系統架構:

程式寫超了(記憶體不夠了)

可見F4的SRAM是很夠我折騰的,而F1的系統架構就簡單很多:

程式寫超了(記憶體不夠了)

大概梳理了一下,後面估計要換闆子了~

更多無人機知識分享,請關注微信公衆号:欣飛鴿

開心飛翔,靈動如鴿。願與無人機愛好者,共創一片藍天夢!