错误: L6236E: 没有部分与选择器匹配 - 没有部分作为FIRST/LAST。

11

我是用 Keil Microvision V5.12 编译器新手,正在学习 ARM 编程。

当我尝试编译一个简单的汇编项目时,遇到了以下错误:

.\Objects\learn.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.

我已经尝试搜索,但找不到解决这个问题的方案。

这是我的做法:

  1. 创建一个项目(不要启动文件)
  2. 添加一个新的汇编文件(learn.s)
  3. 点击构建目标

有人可以帮忙吗?

5个回答

21

我为新手添加了这个答案,创建新项目后,请按照图片进行操作:

输入图像描述


1
我选择您的答案作为被接受的答案,因为它比之前被接受的答案获得了更多的赞同。 - Javid

7

您的源代码中没有“FIRST”对象。您的分散文件可能如下所示:

LR_IROM1 0x08000000 0x00040000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00040000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x0000A000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

链接器想要放到映像中的第一个对象是被称为 RESET 的区域。你的代码中没有 RESET 区域。 请添加类似于下面的内容:

AREA    RESET, DATA, READONLY

将执行起始点指向您的汇编文件。

创建一个带有启动文件的项目,并查找AREA RESET.....声明并复制它。

对于Cortex,它看起来像:

                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0     

每个处理程序都需要声明,但你可以只添加堆栈指针和重置处理程序就可以开始了。

非常感谢!我还有一个问题。在您提供的代码中,我如何访问代码导出的数据(即__Vectors)? - Javid
在C语言中,使用extern "C"关键字声明变量可以使其具有C语言的链接属性。例如: extern "C" unsigned int __Vectors; 然后可以使用它(如果在实际目标上使用,则可能是只读的)。 - SilverCode
不是C语言。看一下这个问题: http://stackoverflow.com/questions/27371905/how-to-write-at-least-two-areas-in-arm-assembly - Javid

3
对于ARM LPC,启动汇编文件Startup.s大致如下:

AREA MyStacks,DATA,NOINIT,ALIGN=2 IrqStackSpace空间IRQ_STACK_LEGTH * 4
FiqStackSpace空间FIQ_STACK_LEGTH * 4
AbtStackSpace空间ABT_STACK_LEGTH * 4
UndtStackSpace空间UND_STACK_LEGTH * 4

    AREA    RESET, DATA, READONLY

堆底 空间 1

    AREA    RESET, DATA, READONLY

StackUsr 空格 1

只需替换即可。


0
如果您在CubeMX中的时钟配置中选择了HSI,但已经在RCC中选择了HSE,则会出现此错误。如果您选择其中一个(HSI / HSE),则可以解决此问题。

0

我遇到了同样的问题。源文件(.c)和(.uvproj)文件应该在同一个位置,你不能从其他位置复制。所以要创建一个新的文件夹来存放它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接