gpt4 book ai didi

c - ARM Cortex M-3 GCC/newlib 初始化

转载 作者:太空宇宙 更新时间:2023-11-04 04:46:58 25 4
gpt4 key购买 nike

我刚刚开始深入研究 ARM Cortex-M 微 Controller 的世界,我决定不使用现有的开发板或易于使用的 IDE,而是直接进入这些裸机东西,所以我已经将自己的 STM32F103 焊接到原型(prototype)板上,现在正尝试使用 Launchpad 中的 gcc-arm-embedded 工具链进行操作。在艰难地阅读有关链接器脚本等的手册之后,我现在已经编写了自己的链接器脚本和启动代码,它们基本上什么都不做,只是将 .data 部分从 ROM 复制到 RAM,将 .bss 归零,然后调用 SystemInit()从 ST 的标准外设库中进行基本的 uC 初始化并最终调用 main()。
现在,从我找到的一些关于 Cortex M-3 开发的教程中,我看到他们使用 -nostartfiles 标志到链接器,但现在我想知道:在那种情况下我是否必须自己初始化 newlib?或者我应该使用 GCC/newlib 中的默认启动文件并删除 -nostartfiles?但在那种情况下,我仍然需要进行一些初始化,例如将 .data 复制到 RAM 并设置 vector 表,这需要自定义链接描述文件。那我该在哪里做呢?
而且我什至不想开始考虑 C++!

那么,初始化这种基于 Cortex-M3 的微 Controller 及其 libc(不包括外围设备)的推荐方法是什么?

提前致谢!

最佳答案

据我所知,您不应该为纯 C 应用程序调用任何 stdlib 函数。但是你应该为 C++ 应用程序,因为有静态初始化器、用于 RTTI 的 vtable 等要初始化。据我所知,newlib 本身包含来自 stdlib 的函数,如 mem**printf 等,适用于小 ROM 大小的 MCU。

但是通常没有什么可以主动初始化的。如果 std-function 确实有一个全局数据,它希望声明它并将其存储在一些变量中,这些变量存储在 .data 部分中。例如。 __errno 是这个的候选者。但是您不能确定您的 newlib 实现是做什么的,因为这取决于开发人员,他们如何在他们的库中设计内部工作流。

请看下面的代码片段。这是一个用 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
{

}

关于c - ARM Cortex M-3 GCC/newlib 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19890826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com