Compilation 在编译时固定函数的内存位置

Compilation 在编译时固定函数的内存位置,compilation,function-pointers,allocation,freertos,Compilation,Function Pointers,Allocation,Freertos,是否可以设置功能启动时的记忆位置?我想知道是否有可能在编译、链接甚至代码中这样做 另外,我正在与FreeRTOS合作,这也可能吗?您使用什么工具链?有些编译器对此有特殊语法(例如,使用单词“absolute”),但如果您使用的是GCC,则应编辑链接器文件(.ld)。 乍一看,它的语法相当晦涩,但它有一个文档,可以解释一切。简言之,您应该将函数标记为属于以下节: __attribute__((section(".mysection"))) void reflashable_function(...

是否可以设置功能启动时的记忆位置?我想知道是否有可能在编译、链接甚至代码中这样做


另外,我正在与FreeRTOS合作,这也可能吗?

您使用什么工具链?有些编译器对此有特殊语法(例如,使用单词“absolute”),但如果您使用的是GCC,则应编辑链接器文件(.ld)。 乍一看,它的语法相当晦涩,但它有一个文档,可以解释一切。简言之,您应该将函数标记为属于以下节:

__attribute__((section(".mysection"))) void reflashable_function(...
  .mysection:
{
  *(.mysection)
  *(.mysection*)
  ./sources/dir/reflashable_file.o(.text) /*this is to add a full file, not just one function */
  ./sources/dir/reflashable_file.o(.rodata)
} >BOOTFLASH
然后将以下文本添加到所有现有节之后的MyProject.ld文件中:

.mysection 0xS0MEADDRESS:
{
  *(.mysection)
  *(.mysection*)
}
另外,在makefile中添加一个类似“-Map=output.Map”的键以生成mapfile,然后在output.Map中查找函数名以检查其地址是否正确。例如,内联函数或内联函数中的某些内容可能会有额外的困难,因此我建议将其放在单独的.c文件中。 您还可以将.ld文件的G可刷新内存添加到内存部分,在这种情况下,您不需要添加地址,但需要添加内存名称,如下所示:

__attribute__((section(".mysection"))) void reflashable_function(...
  .mysection:
{
  *(.mysection)
  *(.mysection*)
  ./sources/dir/reflashable_file.o(.text) /*this is to add a full file, not just one function */
  ./sources/dir/reflashable_file.o(.rodata)
} >BOOTFLASH

您还可以将EXCLUDE_FILE指令添加到其他节中,这样它就不会包含在其他节中。检查.map文件以查看结果。

为什么需要此文件?把函数指针放在一个已知的位置?我想在一个集合中编译主程序,然后在内存的另一部分中包含某个函数的代码。如果我想这样做,我将只刷新函数,而不是主程序。函数指针可以解决这个问题,在程序集void(*some_func)(int param1,int param2);某些函数foo=0x34223(精确内存位置)。但我觉得还是比较好:)。这个问题可以通过一些特殊的模式来解决,比如维护模式。将设备置于模式,写入闪存->从闪存重新启动设备,这是一种更新功能。问题是,为了降低网络成本,OTA更新的大小应该尽可能小。这就是为什么我只想闪烁的功能。根据@Dostojevski所说,我必须在二进制创建配置文件中设置内存地址。对吗?谢谢。不幸的是,我没有在这个问题上工作。我将把这个链接传递给我的同事,看看是否合适