根据以下链接: ARM compiler 6

ARM编译器6不再支持"attribute((at()",取而代之的是"attribute((SECTION(".ARM._at"))"

如果我想使用ARM编译器6将一个变量放在位置0x20000000,我会执行如下操作:

int var __attribute__((section(".ARM.__at_0x20000000")));

但是我把地址隐藏在#define ADDR 0x20000000下 并将其用作:

#define ADDR 0x20000000

int var __attribute__((section(".ARM.__at_ADDR")));

我从链接器收到错误,如下所示: L6974E:地址没有基地址

有没有办法使用#定义来指定放置变量的地址?

推荐答案

您可以使用‘stringify’和字符串连接.

// Traditional stringify.
#define xstr(s) str(s)
#define str(s) #s

#define ADDR 0x20000000

int var attribute((section(".ARM.__at_" str(ADDR))));

字符串连接就是将两个相邻的字符串常量连接在一起.

‘str(Addr)’转换为"0x20000000",因此您最终得到的字符串是".ARM.__at_0x20000000",我相信这就是您想要的.


对于更新的问题,其中的值是计算的,没有简单的方法来实现这一点在‘C’.从技术上讲,这是可能的,但需要大量的条件句枚举,所以这是不实际的.

例如,#define ADDR (0x20000000 + (1024 * 16))个,期望产生,

int var attribute((section(".ARM.__at_0x20004000")));

可以同时定义ADDRADDR_fixed,然后有条件地比较它们是否相等.

#define ADDR (0x20000000 + (1024 * 16))
#define ADDR_Fixed 0x20004000

#if ADDR!=ADDR_Fixed
#error "Miscalculation of ADDR."
#endif

编译过程之外的工具/脚本可以计算值,然后将其作为编译器参数传递,例如-DADDR_Fixed=0x20004000,这可以用来替换ADDR定义以满足链接器.通常,您可以添加注释或其他标识符以使解析更容易.或者,如果可以在单个文件中收集;而不是分布在整个源代码中,这方面更容易.Python、Perl、BC等可以在解析后处理数学运算.

关于如何实现此脚本的问题完全超出了原始问题的范围,并且已经有许多关于堆栈溢出的示例,具体取决于所选的语言.

C++相关问答推荐

DPDK-DumpCap不捕获端口上的传入数据包

自定义应用程序上的日志(log)轮换问题

ESP32在vTaskDelay上崩溃

#If指令中未定义宏?

在C++中头文件中声明外部 struct

是否可以使用指针算法在不对齐的情况下在 struct 中相同类型的字段的连续序列之间移动?

如何使用[BTStack]BLE发送大型(>;2kb)信息包

插座打开MacOS组件

在句子中转换单词的问题

S在本文中的价值观到底出了什么问题?

如何仅使用软件重新初始化STM32微控制器中的USB枚举?

用C++高效解析HTTP请求的方法

在C中使用无符号整数模拟有符号整数

Linux/C:带有子进程的进程在添加waitid后都挂起

将char*数组深度复制到 struct 中?

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

execve 不给出which命令的输出

std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同

从管道读取数据时丢失

为什么创建局部变量的指针需要过程在堆栈上分配空间?