繁体   English   中英

ARM Cortex M-3 GCC / newlib初始化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM