解决Keil软件中L6236E:NO Section Matches Selector-No Section to be FIRST/LAST报错问题
最近在学习汇编的过程中网上论坛看一些大佬的程序,照着写完之后编译出现error:L6236E:NO section matches selector-no section to be FIRST/LAST。然后跳转到.sct的文件中,
照着百度相似问题的解决方案并没有成功。后面发现是自己配置的问题,记录一下也算给自己留点总结。
首先NO section matches selector-no section to be FIRST/LAST这个问题确实是因为单片机无论使用C还是汇编语言都是要有启动文件的,没有加载文件的话编译器是无法通过的。因为对于单片机来说,不同款的单片机都有着不同的映射区域和启动地址。启动文件常规定了单片机上电之后的初始几步的启动流程。
因此解决这个问题最常见的就是我们忘记给工程项目文件加载启动文件了。
以STM32芯片为例,启动文件格式常为:startup_stm32xxfxx.md.s格式。一般来说启动文件都是用汇编指令写的,因此后缀是.s格式。不难从资源包中找到。但是芯片和启动文件注意要对应上,不一致的话程序是无法正常在单片机上运行的。
解决方法:在Manage Project Items中添加进去启动文件就可以了。
但是因为我是自己写了一份启动文件,一开始就加到Project中去了。并且这份文件在别的项目工程中运行也是正常的,我就没有再往启动文件的问题上怀疑。所以网上的启动文件的添加没有解决我的问题。
后面我检查自己配置情况的时候,发现是Options配置界面上勾选了Use memory layout from target Dialog。
解决方案:去掉Use memory layout from target Dialog这个选项的勾选,并且将Scatter file下面的文本框的路径要删掉,保证空白。重新编译就成功了。
原因分析:scatter文件提供内存映象中各个区域的分组和放置详细信息。勾选了Use Memory Layout from Target Dialog时使用的是The Memory Areas settings in Target Dialog自动生成的scatter文件,不勾选时使用的是scatter file框里的scatter file,你可以对它进行自定义编辑,它的内容一般来说是由取消勾选前由The Memory Areas settings in Target Dialog自动生成的。当你情空scatter框后会在链接命令后指明ro、rw的基地址。Read/Only Memory Areas中的起始地址和大小对应的是scatter文件中的映像文件的加载地址和加载存储区域的大小;映像文件中RO部分的加载地址等于运行地址;而Read/Write Memory Areas中的地址即RW部分的运行地址。
总而言之就是,我在偷懒使用了之前编译过的项目复制过来,重新写了程序,但是因为勾选了这个
The Memory Areas settings in Target Dialog,所以还保留的是上次使用的scatter file的配置。和这次使用的芯片的起始地址还有运行地址是不一致的。导致了无法正常识别启动文件。
可以归纳为两步,第一添加启动文件到项目中去,去掉默认的勾选并且确保下面scatter file里面的路径为空,让他自行编译就可以了。