eric2013 发表于 2019-4-8 04:01:06

AC6使用 __attribute__((at(x)))需要改用__attribute__((section("name")))实现(2022-05-03)

比如AC5是:
uint8_t ucHeap __attribute__((at(0x24000000)));

那么AC6就是:
uint8_t ucHeap __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

static/image/hrline/4.gif







eric2013 发表于 2019-4-8 04:05:24



myxiaonia 发表于 2019-4-8 10:31:54

我记得这个at好像是个宏而已

eric2013 发表于 2019-4-8 12:14:21

myxiaonia 发表于 2019-4-8 10:31
我记得这个at好像是个宏而已

搜了下,没搜到。

爱恋之燕 发表于 2019-4-8 14:03:13

为什么我用AC6编译时,报错:error:unknown type name '__forceinline'?
是AC6不认识‘__forceinline’吗?

eric2013 发表于 2019-4-8 14:18:07

爱恋之燕 发表于 2019-4-8 14:03
为什么我用AC6编译时,报错:error:unknown type name '__forceinline'?
是AC6不认识‘__forceinline’吗 ...

你测试的那个?

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

uint8_t ucHeap __attribute__((section(".ARM.__at_0x24000000")));

hpdell 发表于 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 的编译器了

eric2013 发表于 2019-4-11 18:14:49

hpdell 发表于 2019-4-11 17:16
我是直接改成指针的,

uint8_t*ucHeap = (uint8_t *)0x24000000;


对, 这种也很方便。

hpdell 发表于 2019-4-12 10:14:54

eric2013 发表于 2019-4-11 18:14
对, 这种也很方便。

{:33:}

风的季节 发表于 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 目录的就没问题了。

爱恋之燕 发表于 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 6MDK-ARM编译器从V5转到V6的解决办法,只要用心去研究的朋友都能在Keil官网找到官方的说明文档。
官方说明文档下载地址:http://www.keil.com/appnotes/docs/apnt_298.asp
先看下这个说明文档的目录:看目录,其实很简单,我大概说一下里面重要的几点:1.Switch the Compiler in μVision IDE即配置工程,将编译器切换到V6.9:Project -> Option for Target -> Target.2.Diagnostic Settings: Warnings and Errors即诊断设置,也就是配置工程,编译时警告输出的方式:先切换到V6.9,再配置(默认AC5-like即可,如果错误较多,可No Warning,不显示警告):这里想说一点: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.Select a Compiler Optimization Level这里编译等级,其实不是重点,默认即可。
5.Object and Library Compatibility关于使用库存在的一些问题,在编译的时候,添加关键字: -fshort-enums -fshort-wchar(一般默认都是添加了的):6.Data Packing这里主要是说数据结构,也是上面的指令不兼容的问题。如果之前使用typedef __packed struct定义,则替换成:__PACKED_STRUCT。
7.Assembler Migration汇编迁移:这一节可以说是重点。
很多RTOS都有一个或多个与汇编有关的源代码文件,所以,很多有RTOS的工程,编译后都会存在许多错误。常见的就是“asm”这个关键字。
文件中大概说明了:兼容GNU标准,不兼容ARM标准。其中还特别强调了关于Inline Assembler的一点,仅支持GNU标准:本节重点带领大家分析官方的资料,下一章节,实际应用中,我们的快捷的解决方法。
Ⅲ实际应用解决方法上面官方的解决办法,可以总结为两点:1.修改工程配置;
2.修改源代码;

实际应用中,我们也是这样按照官方一步一步修改源代码吗?
答案:如果兼容的源代码,替换即可; 如果没有,就只有按照官方说明一步一步修改。
下面,我就来教大家如何使用官方提供的、兼容V6.9的代码替换,这种快捷解决问题的办法。
1.解决CMSIS不兼容问题下载最新的CMSIS文件替换你工程中CMSIS文件。
下面是关于CMSIS的一份官方说明,大概意思就是向下兼容。下载地址:http://www.keil.com/dd2/Pack如果我们安装了最新的MDK-ARM V5.25,在安装目录下都有这些文件:这种方法可解决Cortet-M等处理器程序编译的错误问题,如STM32F0、F1、F4等Cortet-M等程序。
2.解决带FreeRTOS编译错误问题FreeRTOS解决办法,除了解决上面CMSIS的问题,还需要解决操作系统部分汇编带来的问题,简单说就是【FreeRTOS\Source\portable\RVDS】这个目录下源代码不兼容的问题。
解决办法,替换相应文件:3.其他其他RTOS解决的办法可参考上面讲述的内容。目前许多RTOS厂家逐步在完善兼容的问题。
没有替换的,就只有按照官方提供的办法修改源代码。实在不能解决,就只能使用之前V5编译器了。


hpdell 发表于 2019-6-28 14:50:49

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

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

业未央 发表于 2019-6-30 09:56:19

硬汉,你这个是什么手册

eric2013 发表于 2019-6-30 10:38:20

业未央 发表于 2019-6-30 09:56
硬汉,你这个是什么手册

MDK的help文档

业未央 发表于 2019-7-3 14:56:26

eric2013 发表于 2019-6-30 10:38
MDK的help文档

好的,谢谢

狂野的庄稼汉 发表于 2019-8-28 01:27:33

AC6的__attribute__ section真是不好用,像下面这种方式,不知道大家有没有好的方法,自己计算地址少了还好,多了真的是很麻烦还容易出错


eric2013 发表于 2019-8-28 11:03:48

狂野的庄稼汉 发表于 2019-8-28 01:27
AC6的__attribute__ section真是不好用,像下面这种方式,不知道大家有没有好的方法,自己计算地址少了还好 ...

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

hebsjzslb 发表于 2019-9-9 09:31:27

eric2013 发表于 2019-4-11 18:14
对, 这种也很方便。

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

浴火重生 发表于 2019-10-22 10:34:25

狂野的庄稼汉 发表于 2019-8-28 01:27
AC6的__attribute__ section真是不好用,像下面这种方式,不知道大家有没有好的方法,自己计算地址少了还好 ...

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

狂野的庄稼汉 发表于 2019-10-23 09:15:37

浴火重生 发表于 2019-10-22 10:34
大佬,你这个keil 配色很漂亮,可以分享下配色那部分数据吗

我用的也是坛友分享的:lol
keil配色分享

wdliming 发表于 2019-12-22 12:03:41

硬汉哥,我使用了你的方法,但是仿真的时候,指定地址的地方没有按照我的设置值,改变不了内存的数值,ac5是可以的

wdliming 发表于 2019-12-22 12:06:46

hpdell 发表于 2019-4-11 17:16
我是直接改成指针的,

uint8_t*ucHeap = (uint8_t *)0x24000000;


厉害,这个通用

wdliming 发表于 2020-2-21 10:21:13

试了,5.29可以的,这个方法ok

miaoqiongb 发表于 2020-5-13 23:50:45

用了AC6,使用你网络例子,硬汉看看啥问题

eric2013 发表于 2020-5-14 07:20:17

miaoqiongb 发表于 2020-5-13 23:50
用了AC6,使用你网络例子,硬汉看看啥问题

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

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

yuanzhongda 发表于 2020-5-14 08:51:27

有个问题请教 下   RTX中的事件标志组的osFlagsNoClear默认是osFlagsWaitAll | osFlagsNoClear吗

eric2013 发表于 2020-5-14 11:01:17

yuanzhongda 发表于 2020-5-14 08:51
有个问题请教 下   RTX中的事件标志组的osFlagsNoClear默认是osFlagsWaitAll | osFlagsNoClear吗

那个函数


he2002512 发表于 2020-8-28 11:39:14

__attribute__((section(".ARM.__at_0x24000000")));
这里不能用宏定义很不方便啊,
比如#define TEST_ADD 0X24000000
__attribute__((section(".ARM.__at_TEST_ADD")));

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

eric2013 发表于 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?mod=viewthread&tid=97631&fromuid=58
(出处: 硬汉嵌入式论坛)

efuntech 发表于 2020-10-12 10:35:33

miaoqiongb 发表于 2020-5-13 23:50
用了AC6,使用你网络例子,硬汉看看啥问题

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

wdliming 发表于 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")));
地址不能使用宏定义的。。。

fengyun2008 发表于 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

好用了!!:lol

eric2013 发表于 2022-5-3 08:10:30

fengyun2008 发表于 2022-5-2 02:57
感谢大硬汉的分享,今天用VC6作H750一个网卡的测试,发现直接怼还不行。
Exec Addr      Load Addr      Si ...

VC6?:L

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

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

sanit 发表于 2023-6-6 16:08:12

实际测试发现,AC5下面使用 uint8_t ucHeap __attribute__((section(".ARM.__at_0x24000000")));也是正常固定地址的;也就是说AC5 AC6之间 只有UNINIT字段是有区别的其他的都能兼容一种方法

eric2013 发表于 2023-6-7 09:08:58

sanit 发表于 2023-6-6 16:08
实际测试发现,AC5下面使用 uint8_t ucHeap __attribute__((section(".ARM.__at_0x24000000")));...

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

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

FlyDragon 发表于 2023-9-11 15:24:23

狂野的庄稼汉 发表于 2019-8-28 01:27
AC6的__attribute__ section真是不好用,像下面这种方式,不知道大家有没有好的方法,自己计算地址少了还好 ...

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

木偶 发表于 2024-4-16 17:02:51

狂野的庄稼汉 发表于 2019-8-28 01:27
AC6的__attribute__ section真是不好用,像下面这种方式,不知道大家有没有好的方法,自己计算地址少了还好 ...

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

eric2013 发表于 2024-4-17 08:17:57

木偶 发表于 2024-4-16 17:02
试了下你这个不行,展开宏定义会带括号,编译不会报错,实际没有强制定义到指定地址,展开会是下面这样的 ...
试试这个正常不

#ifndef      __MEMORY_AT
#if   (defined (__CC_ARM))
    #define__MEMORY_AT(x)   __attribute__((at(x)))
#elif   (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
    #define__MEMORY_AT__(x)   __attribute__((section(".bss.ARM.__at_"#x)))
    #define__MEMORY_AT(x)   __MEMORY_AT__(x)
#else
    #define__MEMORY_AT(x)
    #warning Position memory containing __MEMORY_AT macro at absolute address!
#endif
#endif

/* Ethernet Rx DMA 描述符 */
ETH_DMADescTypeDefDMARxDscrTab __MEMORY_AT(0x30040000);

/* Ethernet Tx DMA 描述符 */
ETH_DMADescTypeDefDMATxDscrTab __MEMORY_AT(0x30040060);

/* Ethernet 接收缓冲 */
uint8_t Rx_Buff __MEMORY_AT(0x30040200);

木偶 发表于 2024-4-17 09:36:36

eric2013 发表于 2024-4-17 08:17
试试这个正常不
不可以,问题是一样的,宏参数展开是带括号的,导致这个强制定义是无效的

eric2013 发表于 2024-4-17 09:44:08

木偶 发表于 2024-4-17 09:36
不可以,问题是一样的,宏参数展开是带括号的,导致这个强制定义是无效的
这样写, 任何其它的前缀后缀都不要加。

uint8_t eepUseRam__MEMORY_AT(XXXXXX);

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

http://www.armbbs.cn/static/image/filetype/zip.gifThreadX+NetXDUO+FileX+USBX+GUIX Template.7z (13.26MB)




页: [1] 2
查看完整版本: AC6使用 __attribute__((at(x)))需要改用__attribute__((section("name")))实现(2022-05-03)