在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在Keil環境編程中發現STM32內存管理存在的問題

GReq_mcu168 ? 來源:未知 ? 作者:胡薇 ? 2018-09-12 16:15 ? 次閱讀

非常簡單的一個工程,沒有用到任何IO操作,與STM32有關的僅僅只有芯片的選擇,即其SRAM大小有區別。圖1是工程示意圖,從圖中可以看出,除了自己編寫的代碼外,僅僅增加了2個文件,即system_stm32f10x.c和startup_stm32f10x_hd.s,其中為了對startup_stm32f10x_hd.s進行修改,將其從庫文件夾復制到了項目文件夾中。

圖1

代碼1

int main()

{

int a,b,c,d;

a=10;b=20;

c=a+b;

for(;;);

}

myex1.c(3): warning: #550-D: variable "c" was set but never used

linking...

Program Size: Code=796 RO-data=336 RW-data=20 ZI-data=1636

FromELF: creating hex file...

"myex1.axf" - 0 Error(s), 1 Warning(s).

代碼2

int main()

{ const int x=16;

int a,b,c,d;

a=10;b=20;

c=a+b;

for(;;);

}

myex1.c(2): warning: #177-D: variable "x" was declared but never referenced

myex1.c(3): warning: #550-D: variable "c" was set but never used

linking...

Program Size: Code=800 RO-data=336 RW-data=20 ZI-data=1636

FromELF: creating hex file...

"myex1.axf" - 0 Error(s), 2 Warning(s).

說明:

(1)Code增加了4字節

(2)其余沒有任何變化

代碼3

int main()

{ const int x=16;

int myArry[100];

int i;

int a,b,c,d;

a=10;b=20;

c=a+b;

for(i=0;i<100;i++)

myArry[i]=i;

for(;;);

}

myex1.c(2): warning: #177-D: variable "x" was declared but never referenced

myex1.c(3): warning: #550-D: variable "myArry" was set but never used

myex1.c(5): warning: #550-D: variable "c" was set but never used

myex1.c(5): warning: #177-D: variable "d" was declared but never referenced

linking...

Program Size: Code=816 RO-data=336 RW-data=20 ZI-data=1636

FromELF: creating hex file...

"myex1.axf" - 0 Error(s), 4 Warning(s).

分析:程序中增加了數組myArry,Code增加為816字節,但是RO-data等仍未變化

代碼4

int main()

{ const int x=16;

int myArry[100]={1,2,3,4,5,6};

int i;

int a,b,c,d;

a=10;b=20;

c=a+b;

for(i=0;i<100;i++)

myArry[i]=i;

for(;;);

}

myex1.c(2): warning: #177-D: variable "x" was declared but never referenced

myex1.c(3): warning: #550-D: variable "myArry" was set but never used

myex1.c(5): warning: #550-D: variable "c" was set but never used

myex1.c(5): warning: #177-D: variable "d" was declared but never referenced

linking...

Program Size: Code=1024 RO-data=360 RW-data=20 ZI-data=1636

FromELF: creating hex file...

"myex1.axf" - 0 Error(s), 4 Warning(s).

分析:

(1)由于myArry作了初始化,因此RO-data增加了 360-336=24字節。原因是32位機中int型變量是32位的,占4字節,所以初始6個值后,增加了24字節。

(2)再增加初始化變量的數量,則RO-data隨之增加,而Code不再變化,也就是Code由代碼3的816字節增加到1024字節,是增加了初始化處理的代碼量。

根據以上分析,似乎與已知資料有沖突。

***************************************************

RO是程序中的指令和常量RW是程序中的已初始化變量ZI是程序中的未初始化的變量由以上3點說明可以理解為:RO就是readonly,RW就是read/write,ZI就是zero

****************************************************

如果按此說明,增加變量應該增加RO,但從代碼1到代碼2的變化來看,僅是增加了Code,卻沒有增加RO。

初始化變量時,應該增加RW,但是從代碼2~代碼4,RW卻沒有任何變化。

看來這個說法只能適用于ARM芯片,即運行時需要將代碼調入RAM運行的芯片,對于STM32這類芯片并不完全適用。

以下再作研究:

當使用 int myArray[300]時:

圖2

當使得int myArray[100]時:

圖3

應該是向下生成的??

而且與芯片無關,無論選擇6K RAM還是48K RAM都是如此,且當數組再大時,就會將地址置于小于0x2000000的地址,但編譯并不報錯。

當使得int myArray[450]時:

圖4

當然,執行是錯誤的。

當int myArray[409]時:正指向0x2000000

去掉其他變量,對于這個地址沒有影響!

代碼5

int myArray[400]={1,2,3,4,5,6,7,8,9,10,11,12,13,14};

int main()

{ const int x=16;

int a,b,c,d;

int i;

a=10;b=20;

c=a+b;

for(i=0;i<100;i++)

myArray[i]=i;

for(i=0;i<100;i++)

c+=myArray[i];

d+=x;

for(;;);

}

編譯結果:

compiling myex1.c...

linking...

Program Size: Code=876 RO-data=336 RW-data=1620 ZI-data=1636

FromELF: creating hex file...

"myex1.axf" - 0 Error(s), 0 Warning(s).

分析:

本段程序將數組作為全局變量來定義,情況立即發生了變化。RW-data變成了1620。其中的1600應該是這個數組增加的4*400=1600,而20則是代碼1~代碼4中一直都有的。

經查驗資料,局部變量是放在棧中的,如果棧定義得較小,那么變量數就很少。因此當數組在main內部定義時,是作為局部變量從棧中分配內存給它。所以在代碼1~代碼4的實驗中還發現,即便更改芯片,從6KB RAM的C4到48KB RAM的VC,編譯的結果不發生變化,其原因就在于不論哪種芯片,給它分配的棧是固定的。棧的大小應該在啟動代碼中修改。

圖5

更改這個:startup_stm32f10x_hd.s可以更改棧的大小。

改成500后的編譯結果如下:

linking...

Program Size: Code=1048 RO-data=392 RW-data=20 ZI-data=1892

FromELF: creating hex file...

"myex1.axf" - 0 Error(s), 0 Warning(s).

說明:注意到ZI-ddata已發生了變化。

至此可以明白RO-data ZI-data應該是針對棧來說的。即棧中的只讀數據和零數據??但是RW-data似乎又有所不同,這里還應該再次探究。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3037

    瀏覽量

    74143
  • STM32
    +關注

    關注

    2270

    文章

    10910

    瀏覽量

    356577

原文標題:用Keil環境編程 發現STM32內存管理的一個問題

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    管理STM32 MCU中的內存保護單元

    本應用筆記介紹如何管理 STM32 產品中的內存保護單元(MPU)。MPU 是用于存儲器保護的可選組件。STM32 微控制器(MCU)中嵌入 MPU 之后變得更穩健可靠。
    發表于 12-23 11:04 ?1073次閱讀

    Keil中使用STM32CubeProgrammer

    Keil 環境中對新產品進行下載。對此,用戶可以選擇等待,也可以自行擴展 Keil 的 FLM 來支持該產品。但考慮到用戶產品開發的時間限制以及新的STM32 正式 Pack 很快
    的頭像 發表于 11-03 16:50 ?2731次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>Keil</b>中使用<b class='flag-5'>STM32</b>CubeProgrammer

    stm32keil編譯環境下如何使用printf函數?

    stm32keil編譯環境下如何使用printf函數?
    發表于 12-01 07:34

    內存管理簡介

    內存管理1.內存管理簡介2. 硬件設計3. 軟件設計3.1 STM32CubeMX設置3.2 MDK-ARM
    發表于 12-13 06:17

    請問STM32工程keil下怎么移植到IAR環境

    請問STM32工程keil下怎么移植到IAR環境
    發表于 12-17 07:12

    STM32內存管理的相關資料推薦

    STM32內存管理總結使用一個STM32芯片,對于內存而言有兩個直觀的指標就是 RAM 大小,FLASH大小,比如
    發表于 02-09 06:22

    Keil環境中建立帶FreeRTOS的STM32L項目教程詳細說明

    Keil 環境中建立帶FreeRTOS的STM32L項目   1、先把source 文件夾復制至project 目錄,然后keil
    發表于 11-07 14:35 ?13次下載
    <b class='flag-5'>Keil</b><b class='flag-5'>環境</b>中建立帶FreeRTOS的<b class='flag-5'>STM32</b>L項目教程詳細說明

    STM32學習筆記1——軟硬件基礎之keil5編程與GPIO開發

    STM32學習筆記1——軟硬件基礎之keil5編程與GPIO開發
    發表于 11-30 12:36 ?4次下載
    <b class='flag-5'>STM32</b>學習筆記1——軟硬件基礎之<b class='flag-5'>keil</b>5<b class='flag-5'>編程</b>與GPIO開發

    stm32keil和IAR中的匯編啟動代碼不相同

    最近學習cortex-A8內核的soc,Linux環境下開發,從匯編到C、uboot分析移植。過程中發現,使用的匯編和keil中同是arm內核的s
    發表于 12-03 12:51 ?2次下載
    <b class='flag-5'>stm32</b><b class='flag-5'>在</b><b class='flag-5'>keil</b>和IAR中的匯編啟動代碼不相同

    STM32內存管理相關(內存架構,內存管理,map文件分析)

    STM32內存管理總結使用一個STM32芯片,對于內存而言有兩個直觀的指標就是 RAM 大小,FLASH大小,比如
    發表于 12-05 20:21 ?14次下載
    <b class='flag-5'>STM32</b>的<b class='flag-5'>內存</b><b class='flag-5'>管理</b>相關(<b class='flag-5'>內存</b>架構,<b class='flag-5'>內存</b><b class='flag-5'>管理</b>,map文件分析)

    STM32+Keil 5+proteus 8 編程、仿真方法匯總

    介紹Keil 5 是我們真正編程開發的IDE環境。用C語言寫程序實現某些功能STM32CubeMX是為stm32特別服務的“代碼自動生成”軟
    發表于 12-16 16:59 ?22次下載
    <b class='flag-5'>STM32+Keil</b> 5+proteus 8 <b class='flag-5'>編程</b>、仿真方法匯總

    STM32內存管理

    內存管理詳解1、介紹內存管理,是指軟件運行時對計算機內存資源的分配和使用的技術。其最主要的目的是如何高效,快速的分配,并且
    發表于 12-24 19:37 ?13次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>內存</b><b class='flag-5'>管理</b>

    淺談嵌入式系統裸機編程內存管理

     malloc和freePC編程中是很好用的一種內存分配手段。但是,其嵌入式中,就未必好用了。由于嵌入式裸機編程中,無MMU,即
    發表于 09-15 10:38 ?1535次閱讀

    管理 STM32 MCU 中的內存保護單元

    管理 STM32 MCU 中的內存保護單元
    發表于 11-21 08:11 ?4次下載
    <b class='flag-5'>管理</b> <b class='flag-5'>STM32</b> MCU 中的<b class='flag-5'>內存</b>保護單元

    AN4838 管理STM32 MCU中的內存保護單元

    AN4838 管理STM32 MCU中的內存保護單元
    發表于 11-21 17:07 ?0次下載
    AN4838 <b class='flag-5'>管理</b><b class='flag-5'>STM32</b> MCU中的<b class='flag-5'>內存</b>保護單元
    主站蜘蛛池模板: 另类图片综合网| 国内一国产农村妇女一级毛片| 亚洲天堂资源网| 国产盗摄女厕美女嘘嘘| 月夜免费观看完整视频| 性欧美xxxxhd| 日本视频色| 激情亚洲综合网| 成人99| 午夜毛片网站| 久久精品美女| 在线婷婷| 伊人狠狠丁香婷婷综合色| 天堂综合网| 久久综合性| 国产精品9999久久久久仙踪林| 在线capcom超级碰碰| 日韩特黄特色大片免费视频| www.午夜剧场| 男女免费观看视频| 性视频久久| 免费网站色| 永久看免费bbbbb视频| 免费一级毛片正在播放| 亚洲人成网站色7799在线观看| 亚洲一本高清| 四虎永久在线精品| 精品国产免费人成高清| 亚洲午夜久久影院| 国产播放啪视频免费视频| 乌克兰一级毛片| 天天射天天摸| 国外一级毛片| 日本污视频在线观看| 91亚色视频在线观看| 成人国产精品一级毛片了| 三级完整在线观看高清视频| 国产一区美女| 黄色录像视频网站| 日本视频一区二区三区| 四虎影视永久在线精品免费播放|