c - 查找 __attribute__(section) 中的最后一个变量

标签 c linker cross-compiling gnu xilinx

我目前正在开发嵌入式系统,为了满足时间限制,我需要将一些代码锁定在缓存中。我已使用部分变量属性将需要锁定缓存的所有函数放入 MEMORY_CACHEABLE 部分。

因为我正在使用的板为 1 兆字节的 block 设置了内存属性,所以我将 MEMORY_CACHEABLE 的大小设置为 1MB。

真正将代码锁定在缓存中时,我需要确定MEMORY_CACHEABLE 内部代码的高地址,因为它不会占用整个内存空间,我不想将未使用的内存锁定在缓存中。

我这样做的方法是在 MEMORY_CACHEABLE 中使用占位符,它是在我的 C 代码中定义的,位于 MEMORY_CACHEABLE 中的所有其他函数之后。每次调试时,我都确认占位符的地址高于其他函数。我一直使用这个值作为高地址,但它似乎有点 hacky。

我知道没有标准的方法可以在运行时确定 C 函数的大小,但是是否有更直接的方法来发现该特定内存部分中代码的高地址?

此外,我正在使用 arm-xilinx-eabi-gcc 进行交叉编译。

谢谢!

最佳答案

您可以为此使用链接描述文件。也许您已经在使用一个来指定内存段属性。

所以,只需添加:

MEMORY_CACHEABLE :
{
    BEGIN_MEMORY_CACHEABLE = .;
    *(MEMORY_CACHEABLE)
    END_MEMORY_CACHEABLE = .;
}

然后在C代码中:

extern char BEGIN_MEMORY_CACHEABLE, END_MEMORY_CACHEABLE;

并使用 &BEGIN_MEMORY_CACHEABLE 作为指向开始的指针,使用 &END_MEMORY_CACHEABLE 作为指向可缓存内存的尾数的指针。

关于c - 查找 __attribute__(section) 中的最后一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29901788/

相关文章:

在 CMake 中创建一个包含所有静态链接(包括 libc)的 .so 文件

c - 优化计算组合,避免溢出

c - 尝试在 C 中制作模板

c - 在 C 中分配指针时的显式转换

c++ - 无法编译 bnull-transform.c - Apache Traffic Server

linux - 交叉编译外部linux模块: M =`pwd` directory not found

c++ - 编写驱动程序时解决方案资源管理器中没有文件

boost - g++ 对 `boost::system::system_category()' 的 undefined reference

c - 未定义的函数引用

c++ - 如何在 x86_64 上交叉编译 Raspberry Pi 项目? (缺少 *.so 由于路径无效)