Stm32 启动脚本不初始化全局对象

Stm32 启动脚本不初始化全局对象,stm32,cortex-m,startupscript,Stm32,Cortex M,Startupscript,我有一个stm32f4芯片的自定义链接器脚本,大部分工作正常;应用程序启动和运行、全局数组和变量已正确初始化,但全局对象未正确初始化 我找到了一些关于ctor用法而不是_init_数组的参考资料,但这些似乎是较旧的方法 在LD中,我添加了以下部分: . = ALIGN(4); .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array*)) PROVIDE_HIDD

我有一个stm32f4芯片的自定义链接器脚本,大部分工作正常;应用程序启动和运行、全局数组和变量已正确初始化,但全局对象未正确初始化

我找到了一些关于ctor用法而不是_init_数组的参考资料,但这些似乎是较旧的方法

在LD中,我添加了以下部分:

. = ALIGN(4);
.preinit_array     :
{
  PROVIDE_HIDDEN (__preinit_array_start = .);
  KEEP (*(.preinit_array*))
  PROVIDE_HIDDEN (__preinit_array_end = .);
} >FLASH
. = ALIGN(4);
.init_array :
{
  PROVIDE_HIDDEN (__init_array_start = .);
  KEEP (*(SORT(.init_array.*)))
  KEEP (*(.init_array*))
  PROVIDE_HIDDEN (__init_array_end = .);
} >FLASH
. = ALIGN(4);
.fini_array :
{
  PROVIDE_HIDDEN (__fini_array_start = .);
  KEEP (*(SORT(.fini_array.*)))
  KEEP (*(.fini_array*))
  PROVIDE_HIDDEN (__fini_array_end = .);
} >FLASH
以及完整的启动脚本:

extern unsigned long _data_flash;
extern unsigned long _data_begin;
extern unsigned long _data_end;
extern unsigned long _bss_begin;
extern unsigned long _bss_end;
extern void (**__preinit_array_start)();
extern void (**__preinit_array_end)();
extern void (**__init_array_start)();
extern void (**__init_array_end)();


inline void static_init()
{
  for (void (**p)() = __preinit_array_start; p < __preinit_array_end; ++p)
    (*p)();

  for (void (**p)() = __init_array_start; p < __init_array_end; ++p)
    (*p)();
}

void reset_handler(void)
{
  unsigned long *source;
  unsigned long *destination;

  // default zero to undefined variables
  for (destination = &_bss_begin; destination < &_bss_end;)
  {
    *(destination++) = 0;
  }

  // Copying data from Flash to RAM
  source = &_data_flash;
  for (destination = &_data_begin; destination < &_data_end;)
  {
    *(destination++) = *(source++);
  }


  SystemInit();

  static_init();

  // starting main program
  main();

  while(1)
  {
    ; //loop forever, but we should never be there
  }
}
该报告:

preinit 080506E9 080506E9<\r><\n>
init 080506E9 00000000<\r><\n>
preinit2 BB4FF8E9 BB4FF8E9<\r><\n>
init2 BB4FF8E9 20000418<\r><\n>
preinit 080506E9 080506E9
初始080506E9 00000000
预初始化2 BB4FF8E9 BB4FF8E9
初始2 BB4FF8E9 20000418

这很有趣,好像“{ in ITITA AlayaEnthEnter”不知怎么不是KePup

< P>发现<代码>后,ItIITAYAYAYEN EXYAX地址错误,我试图在链接器脚本中看得更深,决定尝试AtLoCtudio为C++使用的变型。(请注意,前面的链接器脚本取自st标准外围设备示例)


与工作链接器脚本的区别主要在于
.bss
没有
NOLOAD
属性和初始化堆的不同方法,并且
.data
设置为
>ramat>FLASH
而不是仅
>RAM

您正在使用C引导C?它是嵌入式系统的启动脚本,它将建立RAM并调用C++构造函数。它引导环境。这当然意味着您不能使用尚未初始化的内容。不确定你所说的“bootstrap C”是什么意思。你在生成的代码中看到了什么。检查闪光灯,然后相应地修改代码。你试过调试它吗?这是第一步。@old_timer现在很多初创公司都在向C迈进;甚至还有来自ST的官方示例,我计划在下一个月进行测试days@old_timer我使用类似的方法,即在C函数中初始化数据段,没有问题。当然,对于使用不同工具链的人来说,对我有用的东西可能是无用的。
preinit 080506E9 080506E9<\r><\n>
init 080506E9 00000000<\r><\n>
preinit2 BB4FF8E9 BB4FF8E9<\r><\n>
init2 BB4FF8E9 20000418<\r><\n>