Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 查找属性中的最后一个变量(节)_C_Linker_Cross Compiling_Gnu_Xilinx - Fatal编程技术网

C 查找属性中的最后一个变量(节)

C 查找属性中的最后一个变量(节),c,linker,cross-compiling,gnu,xilinx,C,Linker,Cross Compiling,Gnu,Xilinx,我目前正在开发一个嵌入式系统,为了满足时间限制,我需要在缓存中锁定一些代码。我已经使用section variable属性将所有需要锁定缓存的函数放入了section MEMORY\u CACHEABLE中 因为我使用的电路板设置了1MB块的内存属性,所以我将内存设为1MB大小的可缓存内存 在实际锁定缓存中的代码时,我需要确定可缓存内存中代码的高地址,因为它不会占用整个内存空间,而且我不想将未使用的内存锁定在缓存中 我这样做的方式是在MEMORY\u CACHEABLE中使用占位符,它是在我的C

我目前正在开发一个嵌入式系统,为了满足时间限制,我需要在缓存中锁定一些代码。我已经使用section variable属性将所有需要锁定缓存的函数放入了section MEMORY\u CACHEABLE中

因为我使用的电路板设置了1MB块的内存属性,所以我将内存设为1MB大小的可缓存内存

在实际锁定缓存中的代码时,我需要确定可缓存内存中代码的高地址,因为它不会占用整个内存空间,而且我不想将未使用的内存锁定在缓存中

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

我知道在运行时没有确定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\u MEMORY\u CACHEABLE
作为指向开始的指针,使用
&END\u MEMORY\u CACHEABLE
作为指向可缓存内存过去一端的指针。

这非常有效!我不知道您可以引用链接器脚本中的那些值作为外部变量。谢谢@MrMojo:那是因为链接器处理符号地址,所以这些值只是其他外部符号的值。这就是为什么您需要
&
运算符的地址来访问实际值。获取函数的代码大小的一种简单方法是获取目标函数的地址和下一个函数的地址,然后进行减法运算