c - ARM ASM : Bad Instruction end

标签 c assembly arm embedded cortex-m

在我当前的项目中,我们使用 Segger embOS 作为 RTOS。 目标系统是ARM Cortex-M MCU

RTOS 有一些用汇编语言编写的代码。 但是 ASM 代码会产生错误:

RTOS.s:69:错误:错误指令“结束”

根据 ARM 汇编程序引用指南 http://infocenter.arm.com/help/topic/com.arm.doc.dui0489f/DUI0489F_arm_assembler_reference.pdf

(第6.8.5章)指令“END”存在(我不确定汇编程序是否区分大小写) 尽管这条指令存在,但程序集不会编译。

每个包含文件都以 .end(注意“.”和小写字母)

文件 RTOS.s


#define OS_RTOS_S_INCLUDED

/*******************************************************************
*
*       Code section includes selected code
*
********************************************************************
*/
#if (defined __ARM_ARCH_6M__) || (defined __ARM_ARCH_8M_BASE__)
  //
  // Cortex-M0
  //
  #include "RTOS_CM0.S"

#elif (defined (__VFP_FP__) && defined (__SOFTFP__))
  //
  // Cortex-M3 or Cortex-M4 without VFP
  //
  #include "RTOS_CM3.S"

#elif (defined (__VFP_FP__) && !defined (__SOFTFP__))
  //
  // Cortex-M4 with VFP
  //
  #include "RTOS_CM4F.S"

#else
  #error "No RTOS.S for selected CPU available, check configuration"
#endif

/********************************************************************/

        END//Line 69

/*****  End of file  ************************************************/

将 END 切换为 .end 接缝以解决编译错误。然而,链接器找不到汇编程序脚本中定义的函数(尽管这可能是不同的问题)

所以我的问题是:为什么指令 END 是错误的指令?

最佳答案

END directive是 armasm 指令,而不是 ARM 汇编指令。也就是说,它是在代码的构建 期间对汇编器 的指令,而不是对处理器的指令。 .end是 GNU 作为(GNU 汇编器)的等价物。

不同的工具链使用不同的汇编指令和语法。您正在尝试使用不兼容的 gas(GNU 汇编程序)构建 armasm 源代码。您肯定会遇到除此之外的其他问题,这些问题会阻止您使用 GNU 工具链构建特定于 ARM 工具链的源代码/对象 - 尤其重要的是,除了技术问题外,还有法律问题 embOS licences是特定于工具链的。

每个 Segger embOS 许可证都是为特定的工具链提供的。如果你想使用不同的工具链,你将需要一个新的许可证和不同的工具链特定代码/库——即使你有源代码许可证;这不仅是一个法律问题,而且是一个技术问题——Segger 不提供所有工具链的代码和单个工具链的许可证。如果您只有一个目标代码许可证,如果使用与构建目标代码不同的工具链(或者在某些情况下甚至不同的工具链版本),它可能无法链接。

您需要检查一下,但很可能您拥有 Keil ARM MDK 工具链(包括 armcc/armasm 等)的许可证。不管怎样,它都不是免费工具,您需要为 GNU 购买 embOS 许可证,或者获得您拥有 embOS 许可证的工具链的许可证。

在任何情况下,您都可以更新您的 Segger 支持和维护许可证,这样您就可以获得他们的技术支持。

关于c - ARM ASM : Bad Instruction end,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57821937/

相关文章:

c - 使用 KEIL 4,lpc2148 中断或 IRQ 不会执行

仅当我包含 .c 文件时,C 代码才会编译

无法读取C中的输入行

c - 为什么使用 -fPIC -shared 编译的共享对象文件的反汇编会引入像 "call 4"和 "add 2"这样的虚拟地址?

windows-mobile - 获取 ARM 汇编中的 PC 值

linux - 使用触摸屏和 tslib 的数据流是怎样的?

c - 在 C/Linux 中显示不断更新的图像的简便方法

c - 如何一次重命名多个变量名称 (c/c++)

assembly - 如何在 NASM Assembly 中对大字节序列进行位移位?

linux-kernel - 在 Uni 处理器(基于 ARM Cortex A8 的 SOC)上运行支持 SMP 的 Linux 内核是否有任何性能损失?