硬汉嵌入式论坛

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

[技术讨论] ac6编译出错,请指点

[复制链接]

73

主题

1200

回帖

1419

积分

至尊会员

积分
1419
发表于 2020-9-1 14:37:48 | 显示全部楼层 |阅读模式
本帖最后由 wdliming 于 2020-9-1 14:40 编辑

.\AC6\LIB_F103.axf: Error: L6971E: main.o(.ARM.__at_0x2000a000) type RW incompatible with startup_stm32f103xe.o(STACK) type ZI in er RW_IRAM1.

代码中使用了:
    uint32_t  temp  __attribute__((section(".ARM.__at_0x2000a000")));

stack= 0x400
heap = 0x200


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2020-9-1 22:37:22 | 显示全部楼层
不能定义到你option选项已经设置的地址空间里面。
回复

使用道具 举报

73

主题

1200

回帖

1419

积分

至尊会员

积分
1419
 楼主| 发表于 2020-9-2 08:47:55 | 显示全部楼层
eric2013 发表于 2020-9-1 22:37
不能定义到你option选项已经设置的地址空间里面。

那请问,有ac6的设置例程吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2020-9-2 11:06:34 | 显示全部楼层
wdliming 发表于 2020-9-2 08:47
那请问,有ac6的设置例程吗?

不需要例程,直接指定要你的MDK Option选项里面RW_IRAM1指定的以外地址空间即可
回复

使用道具 举报

73

主题

1200

回帖

1419

积分

至尊会员

积分
1419
 楼主| 发表于 2020-9-2 11:30:39 | 显示全部楼层
多谢多谢
回复

使用道具 举报

73

主题

1200

回帖

1419

积分

至尊会员

积分
1419
 楼主| 发表于 2020-9-2 11:38:53 | 显示全部楼层
微信图片_20200902113700.png
硬汉哥,我设置如下,64kram分成两个区域,我使用两个编译器分别编译,ac5的编译器都不用分sram区的,为啥ac6需要呢?
  1. #if defined(ARMCC_AC5)

  2.     uint32_t variable2 __attribute__((at(0x2000b000)));  // Place at 0x2000b000

  3.     uint32_t variable3 __attribute__((at(0x2000b004)));  // Place at

  4.     uint32_t variable __attribute__((at(0x2000a000)));  // Place at
  5.     uint8_t   UART_RX_BUF[10]  __attribute__((at(0x20001000)));    //就是将串口接收的数据定位到RAM中起始地址为0X20001000;
  6.     //#elif defined(ARMCC_AC6)
  7. #else
  8.     //在MDK VC6版本编译器下 将temp定义的0x100位置 如下
  9.     uint32_t  temp  __attribute__((section(".ARM.__at_0x20000010"))) = 0;
  10.         //uint32_t  temp  __attribute__((section(".ARM.__at_0x2000b000"))) = 0;
  11.         //uint32_t  temp;
  12.     //uint32_t  my_peripheral __attribute__((section(".ARM.__at_0X20001010")));
  13.     //uint32_t  temp_macro __AT_ADDR(0X20001004);
  14.     //uint32_t  *uiHeap = (uint32_t *)0X20001016;
  15.         uint8_t   UART_RX_BUF[10]  __attribute__((section(".ARM.__at_0x2000b000")));    //就是将串口接收的数据定位到RAM中起始地址为0X2000b000;
  16.     #define AD7793_COMM_ADDR(x) (((x) & 0x7u) << 3u)    /* Register Address */
  17.     uint8_t ad7793_var = 0x3;

  18. #endif
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2020-9-3 08:17:44 | 显示全部楼层
wdliming 发表于 2020-9-2 11:38
硬汉哥,我设置如下,64kram分成两个区域,我使用两个编译器分别编译,ac5的编译器都不用分sram区的,为 ...

AC6要指定的,最好不要包含到你MDK Option所定义0x2000 0000到0x2000 8000之间。

这个其实有更好用的版本,不知道适合你不

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

使用道具 举报

73

主题

1200

回帖

1419

积分

至尊会员

积分
1419
 楼主| 发表于 2020-9-3 08:27:04 | 显示全部楼层
eric2013 发表于 2020-9-3 08:17
AC6要指定的,最好不要包含到你MDK Option所定义0x2000 0000到0x2000 8000之间。

这个其实有更好用的 ...

多谢,指点,先睹为快
回复

使用道具 举报

73

主题

1200

回帖

1419

积分

至尊会员

积分
1419
 楼主| 发表于 2020-9-3 09:31:57 | 显示全部楼层
eric2013 发表于 2020-9-3 08:17
AC6要指定的,最好不要包含到你MDK Option所定义0x2000 0000到0x2000 8000之间。

这个其实有更好用的 ...

谢谢硬汉哥,已经成功了~~
回复

使用道具 举报

73

主题

1200

回帖

1419

积分

至尊会员

积分
1419
 楼主| 发表于 2020-9-3 10:29:04 | 显示全部楼层
这么看来,还是ac6语法比较严格 了,ac5好像是自动分配了,那请问硬汉,我ac6下分开了两个区域,如果不加__attribute__((section (".RAM_D1"))),那变量分配是什么原则,默认iram1吗?不够了自动分配到iram2吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2020-9-4 01:43:28 | 显示全部楼层
wdliming 发表于 2020-9-3 10:29
这么看来,还是ac6语法比较严格 了,ac5好像是自动分配了,那请问硬汉,我ac6下分开了两个区域,如果不加__ ...

对,是这样的。
回复

使用道具 举报

73

主题

1200

回帖

1419

积分

至尊会员

积分
1419
 楼主| 发表于 2020-9-30 14:30:34 | 显示全部楼层
本帖最后由 wdliming 于 2020-9-30 15:52 编辑

Demo\LIB_F103.sct(17): warning: L6329W: Pattern *(.RAM_D1) only matches removed unused sections.
硬汉哥,我使用ac5编译器,为啥这种方式会变错误??

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00008000  {  ; RW data
   .ANY (+RW +ZI)
  }
  ; RW data - 32KB SRAM
  RW_IRAM2 0x20008000 0x00008000 {
  *(.RAM_D1)
  }
}


#if defined(ARMCC_AC5)
        __attribute__((section (".RAM_D1"))) uint32_t AXISRAMBuf[10];
        __attribute__((section (".RAM_D1"))) uint32_t temp = 0;

    uint32_t variable2;// __attribute__((at(0x2000b000)));  // Place at 0x2000b000

    uint32_t variable3;// __attribute__((at(0x2000b004)));  // Place at

    uint32_t variable;// __attribute__((at(0x2000a000)));  // Place at
    uint8_t   UART_RX_BUF[10];//  __attribute__((at(0x2000c000)));    //就是将串口接收的数据定位到RAM中起始地址为0X20001000;
    //#elif defined(ARMCC_AC6)
#else


搞定了,原来是没有使用的警告。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2020-10-1 00:30:35 | 显示全部楼层
wdliming 发表于 2020-9-30 14:30
Demo\LIB_F103.sct(17): warning: L6329W: Pattern *(.RAM_D1) only matches removed unused sections.
硬 ...

对,就是个警告。
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
发表于 2023-2-21 11:11:24 | 显示全部楼层
本帖最后由 waitopen 于 2023-2-21 21:44 编辑

回复12楼,

避免警告,可以加个参数
[C] 纯文本查看 复制代码
__attribute__((used, section(".CCM_RAM")))

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 05:35 , Processed in 0.238708 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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