【发布时间】:2020-08-25 19:08:59
【问题描述】:
我正在使用https://github.com/ARM-software/CMSIS_5/blob/develop/Device/ARM/ARMCM33/Source/startup_ARMCM33.c 文件并进行了以下修改:
_NO_RETURN void Reset_Handler(void)
{
__set_MSPLIM((uint32_t)(&__STACK_LIMIT));
SystemInit(); /* CMSIS System Initialization */
lpuart_init(&m33_uart, (void*)LPUART0_BASE, LPUART); // Initialize LPUART
__PROGRAM_START(); /* Enter PreMain (C library entry point) */
}
__PROGRAM_START(); 将跳转到_start,它将执行crt0.o 中提到的所有运行时配置,然后跳转到main(有关详细信息,请参阅https://embeddedartistry.com/blog/2019/04/08/a-general-overview-of-what-happens-before-main/)。
在上面的 sn-p 中,我在 _start 之前进行 LPUART 初始化。调试.elf后,我知道当程序到达main时,这个LPUART初始化会丢失。
令人惊讶的是,如果我在main 中进行 LPUART 初始化,同样的程序也可以工作:
void main() {
lpuart_init(&m33_uart, (void*)LPUART0_BASE, LPUART);
/* some more code
...... */
}
似乎crt0.o 正在做一些会导致 LPUART(或平台)配置丢失的事情。我无法弄清楚原因。有什么帮助吗?
编辑:
void lpuart_init(lpuart_info_t* p_info, void* base_addr, uint32_t version)
{
p_info->base_addr = base_addr;
p_info->version = version;
}
【问题讨论】:
-
静态变量初始化是在你的函数之后执行的,这有效地将你的所有更改归零。你在
lpuart_init()做什么?您是否设置了任何全局变量?I got to know that this LPUART initialization gets lost您究竟是如何检测到“此 LPUART 初始化丢失”的?它到底“迷路了”是什么意思? -
lpuart_init设置 LPUART 终端的基地址和版本。简而言之,printf将使用哪个终端。 LPUART 驱动下有一个base_addr变量。它的值应该是 0x12345678,但到达main时变为 0。因此,将不会配置 LPUART,并且执行将停留在驱动程序内的while循环。 -
sets base address and version代码说 1000 个单词。请优先显示代码,而不是解释它。There is a base_addr这个变量是在文件范围内定义的吗?如所问,您是否从函数中修改全局变量? -
这就是它在
main下工作的原因。无论如何在描述中添加了代码。 -
在引导 C 之前无法运行 C 代码,这不是事情的工作方式。