[英]ARM Cortex M-3 GCC/newlib initialization
我刚刚开始深入研究ARM Cortex-M微控制器的世界,并且我决定不使用现有的开发板或易于使用的IDE,而是直接使用这些东西的裸机,因此我已经将自己的STM32F103焊接到原型板上,现在正尝试从Launchpad使gcc臂嵌入式工具链正常工作。 在辛苦阅读了有关链接脚本之类的手册之后,我现在编写了自己的链接脚本和启动代码,它们基本上什么也没做,只是将.data节从ROM复制到RAM,将.bss清零,然后调用SystemInit()从ST的标准外围设备库中进行基本的uC初始化,最后调用main()。
现在,从我发现的有关Cortex M-3开发的一些教程中,我看到它们使用链接器的-nostartfiles标志,但是现在我想知道:在这种情况下,我是否必须自己初始化newlib? 还是我应该使用GCC / newlib中的默认启动文件并删除-nostartfiles? 但是在那种情况下,我仍然必须进行一些初始化,例如将.data复制到RAM并设置向量表,这需要自定义链接描述文件。 那我该在哪里做呢?
而且我什至不想开始考虑C ++!
那么,初始化这种基于Cortex-M3的微控制器及其libc的推荐方法是什么(不计算外围设备)?
提前致谢!
据我所知,您不应该为裸露的C应用程序调用任何stdlib函数。 但是您应该使用C ++应用程序,因为这里有静态初始化程序,用于RTTI的vtable等要初始化。 据我所知,newlib本身包含来自stdlib的诸如mem*
, *printf
等功能,适用于ROM大小较小的MCU。
但是通常没有什么可以主动初始化的。 如果std函数确实具有全局数据,则希望将其声明并存储在.data
节中存储的某些变量中。 例如__errno
是此的候选人。 但是您不确定newlib的实现是做什么的,因为这取决于开发人员来决定,他们如何在自己的lib中设计内部工作流程。
看看下面的代码片段。 这是用C编写的启动例程(Reset-Handler)。ST将其启动文件作为汇编文件(* .s)交付,但是您也可以在C中进行。另一方面,NXP使用.c生成其项目。启动文件。
如果您的应用程序仅为C应用程序,则可以省略C ++注释下方的函数调用。 为符号_data
和_idata
通过接头(在链接描述文件所定义的)产生的。
__set_PSP((uint32_t)&_vStackTop); // set stack pointer
SCB->VTOR = (uint32_t)&VectorTable; // set the pointer to the vector table
pDest = &_data;
pSrc = &_idata;
// fill .data section
for ( ; pDest < &_edata; )
{
*pDest = *pSrc;
++pSrc;
++pDest;
}
// fill .bss section
for (pDest = &_bss; pDest < &_ebss; ++pDest)
{
*pDest = 0;
}
//
// Call C++ library initialization, if your app is an C++ app
//
__libc_init_array();
main(); // enter main
for(;;) // you shouldn't land here at anytime
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.