请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

FLASH 使用__attribute__,於指定位置放入固定變數問題

[复制链接]
非常茶花 提问时间:2019-3-20 15:43 /
想請教一下,目前使用STM32F051K6T7,這顆有32KFlash空間,
當我在程式裡面要增加一個Word值放在FLASH0x7FFC的位置裡面,也就是FLASH最後面的位置
但是當我下下面的指令後
int const IAP_End_Address__attribute__((at(0x08007FFC))) = 0x01234567;
卻出現下面的ERROR
Warning: L6969W: Changing AT Section.ARM.__AT_0x08007800 type from RW to RO in ER_IROM1.
Error: L6406E: No space in executionregions with .ANY selector matching __dczerorl2.o(.text).
Error: L6407E: Sections of aggregate size0x58 bytes could not fit into .ANY selector(s).
但是當我放在0x08007FA4則可以使用,

使用Debug下去看,從0x08007FD8位置也都沒有放任何值,都是0xFF

擷取.PNG

請問為什麼我的值沒辦法放在FLASH最後的位置呢?

收藏 评论7 发布时间:2019-3-20 15:43

举报

7个回答
七哥 回答时间:2019-3-20 17:59:33
看一下你的.map文件,以及生成的hex或bin文件,内有乾坤。
RW的数据会放在Flash的最后面。 01.png

02.png

03.png

04.png

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

非常茶花 回答时间:2019-3-21 12:10:36
我早上在看MAP的時候也發現了這一點,.RW是不是就必須從最後面開始放,沒有其他解了呢?
七哥 回答时间:2019-3-21 16:02:12
非常茶花 发表于 2019-3-21 12:10
我早上在看MAP的時候也發現了這一點,.RW是不是就必須從最後面開始放,沒有其他解了呢? ...

那你得研究一下链接文件怎么修改,keil下对应的是.sct文件。
wenyangzeng 回答时间:2019-3-21 16:26:05
本帖最后由 wenyangzeng 于 2019-3-21 16:31 编辑

0x1234567应该是uint32_t 而非int呀
这个IAP_End_Address和__attribute_((at(0x08007ffc)))之间应该留一个空格才是;

赋值是否应该分2步:
uint32_t const IAP_End_Address __attribute_((at(0x08007ffc)));
IAP_End_Address = 0x1234567;


评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

非常茶花 回答时间:2019-3-21 17:03:47
wenyangzeng 发表于 2019-3-21 16:26
0x1234567应该是uint32_t 而非int呀
这个IAP_End_Address和__attribute_((at(0x08007ffc)))之间应该留一个 ...



1.這部分有空格沒錯,可能是複制上漏掉了

2.目前我只是把值寫進FLASH裡面,然後撈出來判斷是不是這個值而已,並沒有需要看到10進制的值,所以在寫入上int和uint32_t都可以使用,比較沒有注意這個部分

3.在賦值上若在main.c裡面是可以直接賦值的,如果把變數另外拉到 .h 做宣告,則需要兩段式賦值,這個部份我比較不了解為什麼,不過因為我需要值是直接寫在FLASH裡面的,讀的時候也是從FLASH裡面讀取,所以在宣告的時候就要一起賦值了,不然會因為FLASH的特性無法更改裡面的值,得整個Section Erase掉才可以重新改變Flash的值,且Eraseㄧ個Section目前至少須要0x1000的空間,所以需要這樣做。

4.然後我記得Const這個部分是寫在FLASH的,不會拉到RAM所以無法重新賦值給他,應該跟我第三項所說的一樣,FLASH有無法更改的特性,除非使用FLASH指令,但FLASH寫入只能由1改成0,若由0改成1還是得用Erase的功能才行。
edmundlee 回答时间:2019-3-21 19:49:22
Options for the Target..->Linker--> 去勾Use Memory Layout.. --> Edit(Scatter File *.sct)

LR_IROM1 0x08000000 0x00004000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00003400  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  API_IROM1 0x08003400 0x00000C00  {
        *.o(apiSection)
  }

  
  RW_IRAM1 0x20000000 0x00001000  {  ; RW data
   .ANY (+RW +ZI)
  }
}
加上红色部分

然后再
const u16 __attribute__((section("apiSection"))) CmdLengthList[]={....

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

非常茶花 回答时间:2019-3-22 09:44:39
edmundlee 发表于 2019-3-21 19:49
Options for the Target..->Linker--> 去勾Use Memory Layout.. --> Edit(Scatter File *.sct)

LR_IROM1 0 ...

依照你的步驟設置完成後,發現他不會照著我要的位置放,這顆SIZE是0x40000,我要把值放在0x3FFFC裡面
  1. LR_IROM1 0x08003000 0x0003CFFC  {    ; load region size_region
  2.   ER_IROM1 0x08003000 0x0003CFFC  {  ; load address = execution address
  3.    *.o (RESET, +First)
  4.    *(InRoot$Sections)
  5.    .ANY (+RO)
  6.   }
  7.     API_IROM1 0x0803FFFC 0x00000004  {
  8.         *.o(apiSection)
  9.   }
  10.   RW_IRAM1 0x200000BC 0x00007F44  {  ; RW data
  11.    .ANY (+RW +ZI)
  12.   }
  13. }
复制代码
但是不管是使用

int const IAP_End_Address __attribute__((section("apiSection"))) = 0x12345678;

或是

int const IAP_End_Address __attribute__((at(0x0803FFFC))) = 0x12345678;

都不是放在我需要的位置,後來我在這邊增加IROM2,才能把我要的值放在最後面

擷取.PNG

擷取.PNG

在把.SCT擋叫出來看

擷取.PNG





這邊我有先把User Memory Layout 勾勾取消,編輯後存檔,
但是怎麼樣就是無法放到0x083FFFC的位置,只能將IROM2打開分配另外ㄧ個空間才行

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版