硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1102|回复: 7
收起左侧

[MDK] AC5 的定位用法__attribute__((at(0x20000F40))

[复制链接]

6

主题

89

回帖

107

积分

初级会员

积分
107
发表于 2023-1-3 09:53:37 | 显示全部楼层 |阅读模式
       最近换了个国产 M33 内核的MCU 移植了一个老的程序 在KEIL5上用,还必须用AC6编译,然后就发现原来的定位变量__IO u32 gpio[4] __attribute__((at(0x20001400));
  这AC5的编绎定位RAM用法在AC6完全不行,参考AC6写法如下__IO u32 gpiol[4] __attribute__((section(".ARM.__at_0x20001400")));
一开始也没觉得有什么不对,打开那国产的上位机软件,一直报HEX文件过长错误。后面打开HEX文件查看,在末尾添加了又一段地址,打开MAP文件看,确实也开了个ROM字段,

导致HEX转化时候文件解析不对。而老版本是没有这问题的。
:102940000240000007058302400000000000000074
:020000042000DA
:1014000000000000000000000000000000000000DC
:04000005000000E512
:00000001FF


map 文件字段
    Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x20001400   0x20001400   0x00000010   Data   RW          680    .ARM.__at_0x20001400  main.o

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2023-1-3 10:29:19 | 显示全部楼层
AC6的话,这种定义方式,实际上不好,会造成生成程序空间非常多。下面帖子换了一个定义方式,你试试。

MDK5 AC6下载提示No Algorithm found for: 30040000H - 300400BFH解决办法
https://www.armbbs.cn/forum.php? ... 3585&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

210

主题

1044

回帖

1684

积分

至尊会员

More we do, more we can do.

积分
1684
发表于 2023-1-3 14:19:28 | 显示全部楼层
手册上也是写的这个语法,你代码看起来没问题:
[C] 纯文本查看 复制代码
__attribute__((section( ".ARM.__at_address")))
回复

使用道具 举报

6

主题

89

回帖

107

积分

初级会员

积分
107
 楼主| 发表于 2023-1-3 15:34:23 | 显示全部楼层
本帖最后由 mygod 于 2023-1-3 15:54 编辑

AC6和AC5编译器 老的版本KEIL4的 是把这段变量当成 RAM, 而AC6把这当成DATA类型,导致生成的HEX多了一段地址,有好些HEX解析的软件都会搞错。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2023-1-3 15:55:34 | 显示全部楼层
mygod 发表于 2023-1-3 15:34
AC6和AC5编译器 老的版本KEIL4的 是把这段变量当成 RAW, 而AC6把这当成DATA类型,导致生成的HEX多了一段地 ...

楼主位的定义方法不合理,因为这个变量的加载域不能是RAM,RAM掉电后程序就丢失了。

[C] 纯文本查看 复制代码
  Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object
    0x20001400   0x20001400   0x00000010   Data   RW          680    .ARM.__at_0x20001400  main.o


而且MDK下载的时候还会提示算法不存在,要修改为我二楼的定义即可解决。
[C] 纯文本查看 复制代码
__attribute__((section(".bss.ARM.__at_0x20001400")))


修改后就成这样了,这就合理了
[C] 纯文本查看 复制代码
    Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object
    0x20001400        -       0x00000010   Zero   RW            5    .bss.ARM.__at_0x20001400  main.o



回复

使用道具 举报

6

主题

89

回帖

107

积分

初级会员

积分
107
 楼主| 发表于 2023-1-3 16:09:57 | 显示全部楼层
本帖最后由 mygod 于 2023-1-3 16:21 编辑

这是很早之前做的复位 时候不 复位全局变量的做法,就是把RAM 分成2段了,后面那段是没有定义在里面的(相当于复位时候不初始化全局变量值)。
经过测试 这样的写法才有效果,折腾了半天,还是得硬汉
__attribute__((section(".bss.ARM.__at_0x20001400")))
回复

使用道具 举报

210

主题

1044

回帖

1684

积分

至尊会员

More we do, more we can do.

积分
1684
发表于 2023-1-3 17:41:13 | 显示全部楼层
我是看的这篇《Arm Compiler for Embedded Migration and Compatibility Guide》
这个把变量初始化为零,没看出来对使用有什么影响。请楼主解释一下
__attribute__((section( ".bss.ARM.__at_address")))

回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2023-1-3 18:39:14 | 显示全部楼层
加上bss后就是zi变量,本质上就不会以rw方式存储变量了,正常情况下,rw变量都是存到内部Flash,楼主这里看map文件,是存到了ram里面,显然就出问题了。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 23:34 , Processed in 0.187533 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表