在我当前的项目中,我们使用Segger embOS作为实时操作系统。目标系统为ARM Cortex-M单片机。
RTOS有一些用汇编程序编写的代码。但是,ASM代码会产生一个错误:
RTOS.s:69: Error: bad instruction `end'
根据ARM汇编程序参考指南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接缝以解决编译错误。但是,链接器找不到汇编程序脚本中定义的函数(这可能是不同的问题)。
所以我的问题是:为什么指令的结尾是一个糟糕的指令?
发布于 2019-09-07 11:07:47
末端指令是一个armasm指令,而不是ARM程序集指令。也就是说,它是在构建代码期间对汇编程序的指令,而不是对处理器的指令。.end是GNU (GNU汇编程序)等效的。
不同的工具链使用不同的汇编程序指令和语法。您正在尝试使用gas (GNU汇编程序)构建armasm源代码,这是不兼容的。您肯定会遇到其他问题,这些问题将阻止您使用GNU构建ARM工具链特定的源代码/对象--尤其是除了技术问题之外,还有一些法律问题,因为embOS许可证是特定于工具链的。
每个Segger embOS许可证都为特定的工具链提供。如果您希望使用不同的工具链,您将需要一个新的许可证和不同的工具链特定代码/库--即使您有源代码许可证;这不仅是一个法律问题,也是一个技术问题-- Segger不为所有工具链提供单一工具链的许可证。如果您只有一个对象代码许可证,则如果使用与构建对象代码不同的工具链(在某些情况下甚至使用不同的工具链版本),则它可能不会链接。
您需要检查,但很可能您拥有Keil ARM MDK工具链(包括armcc/armasm等)的许可证。它不是一个免费的工具,你需要购买一个embOS许可的GNU,或许可的工具链,你有embOS许可证。
在任何情况下,您都可以很好地更新您的Segger支持和维护许可证,这样您就可以从它们获得技术支持。
https://stackoverflow.com/questions/57821937
复制相似问题