我已经设置了一个简单的项目来使用 stm32f103rbt 设备测试 embos,我只是使用默认设置,在将默认编译器警告更改为 MISRA 兼容并将 C 标准更改为 C99 并将 C++ 更改为 C++11 后,大多数错误都会消失走了,但还是有两个错误
.\Objects\marlin.axf:错误:L6218E:未定义符号 Stack_Mem (引用自 os_initsysstackinfo.o)。 .\Objects\marlin.axf:错误: L6218E: 未定义的符号 __initial_sp (引用自 os_initsysstackinfo.o).
所以在搜索之后我想我应该在启动程序集文件中导出这些符号,所以我尝试像这样在启动程序集文件中使用这些行
Stack_Size EQU 0x00000400
; EXPORT the Stack_Mem and __initial_sp symbols for use in C files
EXPORT Stack_Mem
EXPORT __initial_sp
但是会产生这样的错误
.\Objects\marlin.axf:错误:L6002U:无法打开文件 .\objects\startup_stm32f10x_md.o:没有这样的文件或目录
另一个解决方案是注释这些行
OS_SysStackBaseAddr = (unsigned long) &Stack_Mem;
OS_SysStackSize = (unsigned int) ((unsigned long)&__initial_sp - (unsigned long)&Stack_Mem);
OS_SysStackLimit = (unsigned long) &__initial_sp;
在 OS_InitSysStackInfo 函数中,现在项目将被构建,当我尝试调试它时它会崩溃,那么我应该如何测试这个操作系统?
我假设你的程序集启动文件看起来像这样 startup_stm32f10x_md.s 文件,堆和堆栈地址都定义如下:
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
并在矢量表中设置
__initial_sp
并使用 EXPORT
导出,如图所示。
链接器错误(请参阅编译器错误和警告参考指南)您可以来:
"Options for File [...]"
,然后确认该文件被视为 Assembly file
而不是 Source file
。您还可以通过进入此窗口的 Asm
面板来检查汇编程序如何理解汇编,并检查是否已在 Auto Select
上设置。