2014-11-22 165 views
1

我是ARM编程使用Keil Microvision V5.12编译器。 我不能编译一个简单的组装项目收到此错误:错误:L6236E:没有部分匹配选择器 - 没有部分是第一/最后

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

我试着搜索,但没有找到这个问题的任何解决方案。

这是我做的:

  1. 创建项目(没有启动文件)
  2. 添加一个新的汇编文件(learn.s)
  3. 点击Build Target

任何人都可以帮忙吗?

回答

4

源代码中没有“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) 
    } 
} 

的_First对象链接要放入图像被称为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  
这些处理器的

每个要声明,但你可以添加堆栈指针和复位处理程序上手。

+0

非常感谢!我有另一个问题。在您提供的代码中,如何从代码访问导出的数据(即__Vectors)? – Javid 2014-12-07 09:29:10

+0

在C?外部“C”值例如 extern“C”unsigned int __Vectors; 然后使用它(它将可能只读,如果在真实目标上使用) – SilverCode 2014-12-08 22:03:55

+0

不是C.看看这个问题: http://stackoverflow.com/questions/27371905/how-to-write-在-至少-两个区域合臂组件 – Javid 2014-12-09 05:16:04

2

对于ARM LPC启动组件文件是的Startup.s是这样的:

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

AREA RESET, DATA, READONLY 

bottom_of_heap SPACE 1

AREA RESET, DATA, READONLY 

StackUsr SPACE 1

刚刚更换的伎俩。

4

我说这个答案的新手,
因此,创建新的项目之后做的一样的画面:

enter image description here