STM32(IAR编译) 堆栈溢出 程序跑飞
扫描二维码
随时随地手机看文章
问题一、上电程序跑飞或者运行几步程序跑飞,IAR提示堆栈溢出。
1、首先确认程序入口地址。NVIC_Configuration();// 嵌套向量中断控制器配置 。我这里是STM32f100c8t6b芯片。
在IAR OPTIONS->C/C++ Compiler->Preprocessor 里面定义了VECT_TAB_FLASH 这样程序入口地址就是0X08000000+0X3000(既0X08003000)。这里为什么是0X08000000呢因为STM32主程序存储地址是从0X08000000开始,加上0X3000是为了用户引导程序预留一段空间。不然每次一上电就跑程序没有引导程序是不太现实的吧。不过测试的时候无所谓应该吧。
2、IAROPTIONS里面设置好程序下载地址。
这次是在Linker->Config 下面打钩后点Edit 跳出上面对话框,第一个Vector Table 就是向量表起始位置,这里根据第一步设置向量表的起始地址。
3、下载编译
可以看到main 函数入口地址是0X08000d42开始。为什么不是0X08000000呢?因为main函数执行之前还有一些变量、函数的定义,所以main不是从0X08000000开始的。
STM32指导手册中有存储器组织介绍,我们的程序应该写在上图主存储块位置。可见到地址正好是0X08000000 开始的,共有128个Sectors(扇区),每个扇区1K字节,共128K,中等容量的芯片。
结果:下载后程序没有再跑飞,之前貌似是程序写到了别的地址,好像是写到了RAM区,这个芯片RAM才8K不溢出才怪呢。