硬汉嵌入式论坛

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

[开发工具] AC6使用 __attribute__((at(x)))需要改用__attribute__((section("name")))实现(2022-05-03)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2019-4-8 04:01:06 | 显示全部楼层 |阅读模式
比如AC5是:
uint8_t ucHeap[64*1024] __attribute__((at(0x24000000)));

那么AC6就是:
uint8_t ucHeap[64*1024] __attribute__((section(".ARM.__at_0x24000000")));

大家如果有更好的方式,欢迎留言

2022-05-03,升级版解决方式:

MDK5 AC6下载提示No Algorithm found for: 30040000H - 300400BFH解决办法
https://www.armbbs.cn/forum.php?mod=viewthread&tid=103585



QQ截图20190408040041.jpg





评分

参与人数 1金币 +20 收起 理由
conalgo + 20

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-4-8 04:05:24 | 显示全部楼层
1.jpg
2.jpg
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-4-8 10:31:54 | 显示全部楼层
我记得这个at好像是个宏而已
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-4-8 12:14:21 | 显示全部楼层
myxiaonia 发表于 2019-4-8 10:31
我记得这个at好像是个宏而已

搜了下,没搜到。
回复

使用道具 举报

25

主题

287

回帖

367

积分

高级会员

积分
367
发表于 2019-4-8 14:03:13 | 显示全部楼层
为什么我用AC6编译时,报错:error:unknown type name '__forceinline'?
是AC6不认识‘__forceinline’吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-4-8 14:18:07 | 显示全部楼层
爱恋之燕 发表于 2019-4-8 14:03
为什么我用AC6编译时,报错:error:unknown type name '__forceinline'?
是AC6不认识‘__forceinline’吗 ...

你测试的那个?

这个吗,我现在是用的AC6.12

uint8_t ucHeap[64*1024] __attribute__((section(".ARM.__at_0x24000000")));
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2019-4-11 17:16:38 | 显示全部楼层
本帖最后由 hpdell 于 2019-4-11 17:17 编辑
eric2013 发表于 2019-4-8 14:18
你测试的那个?

这个吗,我现在是用的AC6.12

我是直接改成指针的,

uint8_t  *ucHeap = (uint8_t *)0x24000000;

这样简单省事,而且 编译器都不用去区分是 keil or iar 的编译器了

也不用去管是 ac5 还是 ac6 的编译器了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-4-11 18:14:49 | 显示全部楼层
hpdell 发表于 2019-4-11 17:16
我是直接改成指针的,

uint8_t  *ucHeap = (uint8_t *)0x24000000;

对, 这种也很方便。
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2019-4-12 10:14:54 | 显示全部楼层
eric2013 发表于 2019-4-11 18:14
对, 这种也很方便。

回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2019-6-27 19:06:24 | 显示全部楼层
爱恋之燕 发表于 2019-4-8 14:03
为什么我用AC6编译时,报错:error:unknown type name '__forceinline'?
是AC6不认识‘__forceinline’吗 ...

AC6 接近于GCC,要用inline __attribute__(( always_inline))。
我之前移植FreeRTOS 也是包一堆错,原因就是因为我编译portable 目录用的是RVDS,后来看到AC6 和GCC 的语法类似,换到GCC 目录的就没问题了。
回复

使用道具 举报

25

主题

287

回帖

367

积分

高级会员

积分
367
发表于 2019-6-28 10:01:54 | 显示全部楼层
转载一篇文章
MDK-ARM编译器从V5升级到V6需要做哪些工作?
本文主要内容
1.先给大家讲述一下官方的解决办法;
2.实际工程中的解决办法;


你了解过ARM Compiler 6.9吗?

MDK-ARM在16年就将编译器升级到了V6版本,但很少有人关心这个功能。包括我在内,其实一直都只知道MDK-ARM支持V6版本的编译器,但没有真正使用过。


那位朋友前天问我时,我回复他:我也没仔细研究过这个问题。


那位朋友对这个V6.9编译的功能研究了一天之后,没有完全解决这个问题,昨天晚上又给我说了他研究的情况。于是,我就开始了这个问题的研究。


    最后,经过我昨晚的研究,得出了解决办法。而且,效果真的很好(编译效率),编译的速度,可以和IAR相比拼了。我想,我后面使用MDK-ARM就基于V6.9了。


ARM Compiler 5 to 6

MDK-ARM编译器从V5转到V6的解决办法,只要用心去研究的朋友都能在Keil官网找到官方的说明文档。


官方说明文档下载地址:

http://www.keil.com/appnotes/docs/apnt_298.asp


先看下这个说明文档的目录:

1.jpg

看目录,其实很简单,我大概说一下里面重要的几点:

1.Switch the Compiler in μVision IDE

即配置工程,将编译器切换到V6.9:Project -> Option for Target -> Target.

2.png

2.Diagnostic Settings: Warnings and Errors

即诊断设置,也就是配置工程,编译时警告输出的方式:先切换到V6.9,再配置(默认AC5-like即可,如果错误较多,可No Warning,不显示警告):

3.png

这里想说一点:V6编译器检查的规则更加严格,简单来说,就是编译的警告会更多。如以前的一些代码编译都是没有警告,但用V6.9就可能有警告,如:

void HardFault_Handler(void)
{
  while (1)
  {
  }
}

while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
{
}

3.Incompatible Language Extensions

即V5和V6的指令不兼容,我们需要修改不兼容的代码。其实,就那么几条不兼容的语句,编译之后见到的错误基本就是由于这些语句的不兼容导致的。

4.png

4.Select a Compiler Optimization Level

这里编译等级,其实不是重点,默认即可。


5.Object and Library Compatibility

关于使用库存在的一些问题,在编译的时候,添加关键字: -fshort-enums -fshort-wchar(一般默认都是添加了的):

5.png

6.Data Packing

这里主要是说数据结构,也是上面的指令不兼容的问题。如果之前使用typedef __packed struct定义,则替换成:__PACKED_STRUCT。


7.Assembler Migration

汇编迁移:这一节可以说是重点


很多RTOS都有一个或多个与汇编有关的源代码文件,所以,很多有RTOS的工程,编译后都会存在许多错误。常见的就是“asm”这个关键字。


文件中大概说明了:兼容GNU标准,不兼容ARM标准。其中还特别强调了关于Inline Assembler的一点,仅支持GNU标准:

6.png

本节重点带领大家分析官方的资料,下一章节,实际应用中,我们的快捷的解决方法。


实际应用解决方法

上面官方的解决办法,可以总结为两点:

1.修改工程配置;

2.修改源代码;


实际应用中,我们也是这样按照官方一步一步修改源代码吗?


答案:如果兼容的源代码,替换即可; 如果没有,就只有按照官方说明一步一步修改。


下面,我就来教大家如何使用官方提供的、兼容V6.9的代码替换,这种快捷解决问题的办法。


1.解决CMSIS不兼容问题

下载最新的CMSIS文件替换你工程中CMSIS文件。


下面是关于CMSIS的一份官方说明,大概意思就是向下兼容。

7.png

下载地址:http://www.keil.com/dd2/Pack

8.png

如果我们安装了最新的MDK-ARM V5.25,在安装目录下都有这些文件:

9.png

这种方法可解决Cortet-M等处理器程序编译的错误问题,如STM32F0、F1、F4等Cortet-M等程序。


2.解决带FreeRTOS编译错误问题

FreeRTOS解决办法,除了解决上面CMSIS的问题,还需要解决操作系统部分汇编带来的问题,简单说就是【FreeRTOS\Source\portable\RVDS】这个目录下源代码不兼容的问题。


解决办法,替换相应文件:

10.png

3.其他

其他RTOS解决的办法可参考上面讲述的内容。目前许多RTOS厂家逐步在完善兼容的问题。


没有替换的,就只有按照官方提供的办法修改源代码。实在不能解决,就只能使用之前V5编译器了。




回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2019-6-28 14:50:49 | 显示全部楼层
爱恋之燕 发表于 2019-6-28 10:01
转载一篇文章
MDK-ARM编译器从V5升级到V6需要做哪些工作?
本文主要内容:1.先给大家讲述一下官方的解决 ...

st提供的底层库 都使用了大量的 packed , 估计目前还是得继续使用 ac5 了
回复

使用道具 举报

17

主题

107

回帖

158

积分

初级会员

迎风而舞,扶摇直上九万里。

积分
158
发表于 2019-6-30 09:56:19 | 显示全部楼层
硬汉,你这个是什么手册
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-6-30 10:38:20 | 显示全部楼层
业未央 发表于 2019-6-30 09:56
硬汉,你这个是什么手册

MDK的help文档
回复

使用道具 举报

17

主题

107

回帖

158

积分

初级会员

迎风而舞,扶摇直上九万里。

积分
158
发表于 2019-7-3 14:56:26 | 显示全部楼层

好的,谢谢
回复

使用道具 举报

7

主题

125

回帖

146

积分

初级会员

积分
146
发表于 2019-8-28 01:27:33 | 显示全部楼层
AC6的__attribute__ section真是不好用,像下面这种方式,不知道大家有没有好的方法,自己计算地址少了还好,多了真的是很麻烦还容易出错

2019-08-28_1-24-20.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-8-28 11:03:48 | 显示全部楼层
狂野的庄稼汉 发表于 2019-8-28 01:27
AC6的__attribute__ section真是不好用,像下面这种方式,不知道大家有没有好的方法,自己计算地址少了还好 ...

这个现在还没有比较好的方案,这块还是AC5用的舒服。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2019-9-9 09:31:27 | 显示全部楼层
eric2013 发表于 2019-4-11 18:14
对, 这种也很方便。

对于二维以上的数组,这样就很不方便了。
回复

使用道具 举报

4

主题

139

回帖

151

积分

初级会员

积分
151
发表于 2019-10-22 10:34:25 | 显示全部楼层
狂野的庄稼汉 发表于 2019-8-28 01:27
AC6的__attribute__ section真是不好用,像下面这种方式,不知道大家有没有好的方法,自己计算地址少了还好 ...

大佬,你这个keil 配色很漂亮,可以分享下配色那部分数据吗
回复

使用道具 举报

7

主题

125

回帖

146

积分

初级会员

积分
146
发表于 2019-10-23 09:15:37 | 显示全部楼层
浴火重生 发表于 2019-10-22 10:34
大佬,你这个keil 配色很漂亮,可以分享下配色那部分数据吗

我用的也是坛友分享的
keil配色分享
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
发表于 2019-12-22 12:03:41 | 显示全部楼层
硬汉哥,我使用了你的方法,但是仿真的时候,指定地址的地方没有按照我的设置值,改变不了内存的数值,ac5是可以的
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
发表于 2019-12-22 12:06:46 | 显示全部楼层
hpdell 发表于 2019-4-11 17:16
我是直接改成指针的,

uint8_t  *ucHeap = (uint8_t *)0x24000000;

厉害,这个通用
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
发表于 2020-2-21 10:21:13 | 显示全部楼层
试了,5.29可以的,这个方法ok
回复

使用道具 举报

13

主题

223

回帖

262

积分

高级会员

积分
262
发表于 2020-5-13 23:50:45 | 显示全部楼层
用了AC6,使用你网络例子,硬汉看看啥问题
123.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-5-14 07:20:17 | 显示全部楼层
miaoqiongb 发表于 2020-5-13 23:50
用了AC6,使用你网络例子,硬汉看看啥问题

网络例子暂时不做AC6版本,等网络例子做完了,再分享个AC6版。

维护版本太多,太累了,自己先摸索下吧。
回复

使用道具 举报

4

主题

166

回帖

178

积分

初级会员

积分
178
发表于 2020-5-14 08:51:27 | 显示全部楼层
有个问题请教 下   RTX中的事件标志组的osFlagsNoClear默认是osFlagsWaitAll | osFlagsNoClear吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-5-14 11:01:17 | 显示全部楼层
yuanzhongda 发表于 2020-5-14 08:51
有个问题请教 下   RTX中的事件标志组的osFlagsNoClear默认是osFlagsWaitAll | osFlagsNoClear吗

那个函数

QQ截图20200514105646.png
回复

使用道具 举报

8

主题

78

回帖

102

积分

初级会员

积分
102
发表于 2020-8-28 11:39:14 | 显示全部楼层
__attribute__((section(".ARM.__at_0x24000000")));
这里不能用宏定义很不方便啊,
比如#define TEST_ADD 0X24000000
__attribute__((section(".ARM.__at_TEST_ADD")));

AC6报错,找不到基地址....
有没有什么好的方法?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-8-28 14:08:44 | 显示全部楼层
he2002512 发表于 2020-8-28 11:39
__attribute__((section(".ARM.__at_0x24000000")));
这里不能用宏定义很不方便啊,
比如#define TEST_AD ...

这种方式比较爽一些

定义方式__attribute__((section (".RAM_D1")))可以正常用到MDK的AC5和AC6下
http://www.armbbs.cn/forum.php?m ... 7631&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2020-10-12 10:35:33 | 显示全部楼层
miaoqiongb 发表于 2020-5-13 23:50
用了AC6,使用你网络例子,硬汉看看啥问题

我也遇到了这个问题,您有解决的方法了吗? 我这样定义__attribute__((section(".RAM_D1"))); 把具体的地址换成分散文件中的段,就可以了,下载的时候没有出现No  Algorithm的警告。但是这种情况下,就不能够指定具体的地址,只能够指定一个段。不过,指定一个具体的地址是不是会很危险。
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
发表于 2020-11-26 09:10:55 | 显示全部楼层
he2002512 发表于 2020-8-28 11:39
__attribute__((section(".ARM.__at_0x24000000")));
这里不能用宏定义很不方便啊,
比如#define TEST_AD ...

比如#define TEST_ADD 0X24000000
__attribute__((section(".ARM.__at_TEST_ADD")));
地址不能使用宏定义的。。。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2022-5-2 02:57:13 | 显示全部楼层
感谢大硬汉的分享,今天用VC6作H750一个网卡的测试,发现直接怼还不行。
Exec Addr      Load Addr      Size                  Type   Attr      Idx    E Section Name        
0x30040000   0x30040000   0x00000060       Data   RW      702    .ARM.__AT_0x30040000

这个Load Addr是0x30040000,这个Type是Data,没招了,搜了半天找到个zero_init,但是这CC_ARM的还不行。
最后看看RT10x咋弄的,结果真有了。加个bss就行了。__attribute__((used,section(".bss.ARM.__AT_0x30040000")))

Exec Addr       Load Addr     Size               Type   Attr          Idx    E Section Name        
0x30040000         -             0x00000060    Zero   RW          702    .bss.ARM.__AT_0x30040000

好用了!!

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2022-5-3 08:10:30 | 显示全部楼层
fengyun2008 发表于 2022-5-2 02:57
感谢大硬汉的分享,今天用VC6作H750一个网卡的测试,发现直接怼还不行。
Exec Addr      Load Addr      Si ...

VC6?  

MDK AC6的,加上bss后可以解决一些奇葩问题。

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

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2023-6-6 16:08:12 | 显示全部楼层
实际测试发现,AC5下面使用 uint8_t ucHeap[64*1024] __attribute__((section(".ARM.__at_0x24000000")));  也是正常固定地址的;也就是说AC5 AC6之间 只有UNINIT字段是有区别的  其他的都能兼容一种方法
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2023-6-7 09:08:58 | 显示全部楼层
sanit 发表于 2023-6-6 16:08
实际测试发现,AC5下面使用 uint8_t ucHeap[64*1024] __attribute__((section(".ARM.__at_0x24000000")));  ...

他这个文档整理的详细些。

MDK的AC5转AC6注意事项文档
https://www.armbbs.cn/forum.php? ... 6796&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2023-9-11 15:24:23 | 显示全部楼层
狂野的庄稼汉 发表于 2019-8-28 01:27
AC6的__attribute__ section真是不好用,像下面这种方式,不知道大家有没有好的方法,自己计算地址少了还好 ...

你可以试一下,__ARMCC_VERSION,多个变量用一个地址,后面地址会自动增长,不需要手动增加
回复

使用道具 举报

2

主题

33

回帖

39

积分

新手上路

积分
39
发表于 2024-4-16 17:02:51 | 显示全部楼层
狂野的庄稼汉 发表于 2019-8-28 01:27
AC6的__attribute__ section真是不好用,像下面这种方式,不知道大家有没有好的方法,自己计算地址少了还好 ...

试了下你这个不行,展开宏定义会带括号,编译不会报错,实际没有强制定义到指定地址,展开会是下面这样的
section(".ARM._at_" "(0x20000000)")))
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2024-4-17 08:17:57 | 显示全部楼层
木偶 发表于 2024-4-16 17:02
试了下你这个不行,展开宏定义会带括号,编译不会报错,实际没有强制定义到指定地址,展开会是下面这样的 ...

试试这个正常不

  1. #ifndef      __MEMORY_AT
  2.   #if     (defined (__CC_ARM))
  3.     #define  __MEMORY_AT(x)     __attribute__((at(x)))
  4.   #elif   (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
  5.     #define  __MEMORY_AT__(x)   __attribute__((section(".bss.ARM.__at_"#x)))
  6.     #define  __MEMORY_AT(x)     __MEMORY_AT__(x)
  7.   #else
  8.     #define  __MEMORY_AT(x)
  9.     #warning Position memory containing __MEMORY_AT macro at absolute address!
  10.   #endif
  11. #endif
复制代码

  1. /* Ethernet Rx DMA 描述符 */
  2. ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT] __MEMORY_AT(0x30040000);

  3. /* Ethernet Tx DMA 描述符 */
  4. ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT] __MEMORY_AT(0x30040060);  

  5. /* Ethernet 接收缓冲 */
  6. uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_MAX_PACKET_SIZE] __MEMORY_AT(0x30040200);  
复制代码


回复

使用道具 举报

2

主题

33

回帖

39

积分

新手上路

积分
39
发表于 2024-4-17 09:36:36 | 显示全部楼层

不可以,问题是一样的,宏参数展开是带括号的,导致这个强制定义是无效的
下载 (1).png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2024-4-17 09:44:08 | 显示全部楼层
木偶 发表于 2024-4-17 09:36
不可以,问题是一样的,宏参数展开是带括号的,导致这个强制定义是无效的

这样写, 任何其它的前缀后缀都不要加。

uint8_t eepUseRam[1024]  __MEMORY_AT(XXXXXX);  

这样写还有问题就诡异了,注意AC5和AC6的区别,这个在AC5,AC6,IAR,GCC上均测试正常。

ThreadX+NetXDUO+FileX+USBX+GUIX Template.7z (13.26MB)



289.jpg
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 06:53 , Processed in 0.321733 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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