1. 初识L6236E错误:从一次STM32CubeMX生成说起
那天我正在用STM32CubeMX生成一个STM32F103C8T6的初始化代码,整个过程看起来都很顺利。CubeMX弹出了成功生成的提示窗口,显示代码已经成功生成在指定路径下。但细心的我注意到下面还有一行小字:"项目的'MDK-ARM'文件夹生成时遇到一个问题"。这种提示往往藏着坑,我太有经验了。
打开Keil MDK,加载刚生成的项目,点击编译按钮。果然,问题来了——控制台赫然显示着:.\Objects\project.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.。这个错误信息对于新手来说确实有点懵,什么section?什么selector?FIRST/LAST又是什么鬼?
我第一反应是再编译一次,有时候Keil会抽风。但第二次编译同样的错误再次出现。双击错误信息,Keil跳转到了一个.sct文件,这是链接脚本文件。第7行显示着一些关于内存布局的配置,但具体问题还是不明显。这时候就需要我们深入理解这个错误背后的机制了。
2. 深入理解链接过程:FIRST和LAST的真正含义
要真正理解L6236E错误,我们需要先了解ARM编译器链接过程的工作原理。当我们编译一个嵌入式项目时,编译器会将源代码编译成目标文件,然后链接器将这些目标文件组合成最终的可执行文件。
在这个过程中,链接脚本(.sct文件)告诉链接器如何安排各个段(section)在内存中的位置。FIRST和LAST是链接脚本中的两个特殊选择器,它们定义了代码段的开始和结束位置。
FIRST选择器用于指定程序开始执行的位置,通常是中断向量表。在ARM Cortex-M架构中,处理器上电后首先从地址0x00000000读取初始栈指针值,然后从0x00000004读取复位向量的地址。这就是为什么我们需要一个明确的FIRST段——告诉链接器把中断向量表放在最前面。
LAST选择器则用于指定程序的结束位置

229

被折叠的 条评论
为什么被折叠?



