繁体   English   中英

为什么我的STM32程序没有从第一行开始?

[英]Why is my STM32 program not starting at the first line?

我正在使用 arm-none-eabi-gdb,并且我正在研究 STM32F2xx。 它应该从第一行开始,但是我发现它跳过了一些行。

代码:

uint32_t SystemCoreClock = 12000000;
__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};

void SystemInit(void)
{
    /* Reset the RCC clock configuration to the default reset state ------------ */
    /* Set HSION bit */
    RCC->CR |= (uint32_t)0x00000001;

    /* Reset CFGR register */
    RCC->CFGR = 0x00000000;

    /* Reset HSEON, CSSON and PLLON bits */
    RCC->CR &= (uint32_t)0xFEF6FFFF;

    /* Reset PLLCFGR register */
    RCC->PLLCFGR = 0x24003010;

    /* Reset HSEBYP bit */
    RCC->CR &= (uint32_t)0xFFFBFFFF;

在我的 gdb 调试中,它开始如下:

(gdb) tar ext:4242
Remote debugging using :4242
0x08000354 in SystemInit () at system_stm32f2xx.c:154
154      RCC->CR &= (uint32_t)0xFFFBFFFF;
(gdb)

哪个不是从 uint32_t SystemCoreClock = 12000000; 开始的?

在这里编辑:我的后续问题是,即使变量在运行过程中被忽略,为什么它没有启动@ RCC->CR |= (uint32_t)0x00000001;? 谢谢

而我的 CFLAGS 作为

CFLAGS += -fno-common -Wall -O0 -g -mcpu=cortex-m3 -mthumb
CFLAGS += -ffunction-sections -fdata-sections

裸机嵌入式程序的执行从复位向量指向的地址开始,或者可能在固定的复位地址处开始,这取决于平台。

在 Cortex-M 系列上,复位向量位于地址 4,即闪存(或 RAM,取决于引导引脚)中的第二个 4 字节字。 读取此位置为您提供重置地址,该地址指向重置后执行的第一个函数。 该函数通常称为Reset_Handler ,它负责初始化全局变量,调用main()之前需要调用的任何内容(包括SystemInit() ),最后将控制权交给main() 汇编源代码通常位于名为startup_stm32f2xx.s或类似的文件中,具体取决于您的工具链。

您可以在Reset_Handler上设置断点,并查看全局变量是如何初始化的。 但是,您不会看到相应的变量定义; 它只是一个从闪存复制到 RAM 的固定表(数据部分,初始值不是 0 的变量),并用 0 填充其余部分(BSS 部分)。 要找出哪个变量属于哪个内存地址,可以查阅链接器生成的.map文件。

全局数据在main函数开始运行之前被初始化。 在定义时初始化的全局变量(如你展示的那些)实际上是由编译器初始化的,而不是在运行时初始化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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