C 皮质M3罐';t柄记忆集
我正在尝试为Cortex M3构建一个简单的项目。我遇到的问题是,编译器为memset和其他mem*函数(memcpy、memcmp)包含了错误的库。每次执行接近C 皮质M3罐';t柄记忆集,c,gcc,makefile,arm,cortex-m3,C,Gcc,Makefile,Arm,Cortex M3,我正在尝试为Cortex M3构建一个简单的项目。我遇到的问题是,编译器为memset和其他mem*函数(memcpy、memcmp)包含了错误的库。每次执行接近memset(arr,0x55,10)时,都会导致硬故障 在列表文件中,它的编写方式类似于blx。 我正在使用arm none eabi gcc编译器。我不使用arm none eabi ld进行链接,而是使用arm none eabi gcc(4.8.2) 对于gcc编译器,我使用以下标志:-mthumb-mcpu=cortex-m3
memset(arr,0x55,10)时,都会导致硬故障代码>
在列表文件中,它的编写方式类似于blx
。
我正在使用arm none eabi gcc编译器。我不使用arm none eabi ld进行链接,而是使用arm none eabi gcc(4.8.2)
对于gcc编译器,我使用以下标志:-mthumb-mcpu=cortex-m3-msoft float-Os-gdwarf-2-g3-Wall-Wextra-Wimplicit函数声明-Wredundant decls-Wmissing原型-Wstrict原型-Wundef-Wshadow-fno公共-fffunction节-fdata节
对于链接器脚本,我使用以下标志:-L$(工具链目录)-L$(LIBGCC)-static-Wl,--start group-lc-lgcc-lnosys-Wl,--end group-nostartfiles-Wl,--gc sections-Wl,--allow-multiple-definition-mthumb-mcpu=cortex-m3-msoft float-Wl,--print gc sections-T$(链接器脚本)
$(链接器脚本)是我自己的链接器脚本
$(工具链_DIR)-libc.a、libnosys.a库的路径
$(LIBGCC)-LIBGCC.a库的路径
arm none eabi gcc版本为4.8.2
所以,我的问题是:哪里可能出现问题?为什么字符串.h中的memset和其他函数根本不起作用?你能告诉我我错过了什么吗
仅适用于dwelch的特殊部分:
我不能给你提供这段代码,因为我已经没有那个工具链了。你看,当你向我要汇编程序时,我已经重新编译了一个工具链,并得到了关于这个错误的反馈。一个新的工具链会产生完全不同的asm代码,这是可行的。你想让我给你提供一个已经不存在的东西。这很容易。最后,我明白了blx指令。此外,还有很多话题,人们抱怨mem*功能。在这些主题中,人们通常会忘记向链接器添加架构标志
相信我,我已经研究这段代码很长时间了,我在网络上看到了很多例子。基本上,它看起来像:08004c10 blx/*这里有一个错误*/
现在看起来像<代码>08004a14 BL
!!!它工作时没有任何异常和硬故障。因此,重新编译工具链是一个解决方案。在这种情况下,您要求一个不再存在的代码,并试图说我不理解一个问题,这是非常错误的
特别部分的结尾#fordwelchonly这不完全是一个答案。。。但仍然如此。我不得不重新构建一个工具链。所以,现在一切看起来都和想象的一样。 在重新编译工具链之前,确实导致硬故障的管线如下所示:
08004c10 blx <memset>
08004c10 blx
重新编译工具链后,这一行代码是:
08004a14 bl <memset>
08004a14 bl
显然,工具链是以错误的方式配置和构建的
最接近我刚才所做的事情是这篇帖子:
如果有人有类似的问题,请查看我上面发布的链接
补充:看看马丁对这个话题的评论。马丁对链接库的看法是正确的
补充:我在代码中看不到blx标签的原因很简单——Cortex M3没有arm状态<斯特朗>伊戈尔·斯科金斯基指出了这一点。Cortex M3仅在thumb和debug状态下工作+实现thumb2指令集。此外,armv7m手册还指出,它只在拇指状态下工作。也就是说,我们有一个原因,为什么它不起作用。谢谢伊戈尔和马丁的帮助 嗯。。是否确实正在使用正确的库集进行链接?您为互通指定-mthumb,但调用blx始终会导致对thumb模式的更改。。。不是在Allsure发生了什么,但我打赌这是一些手臂/拇指/互通问题:(是的,我确定。我试过使用和不使用-mthumb和-mthumb交互。结果仍然是一样的。是的,我读过关于这个问题的文章,但目前似乎没有解决方案。这是一个gcc错误还是我有罪?请发布显示问题的反汇编。我发布了它;问题的原因是blx-line。请阅读Martin的公司mment和我下面的答案。你错了,Cortex-M3不能进入ARM状态。只有Cortex-R和Cortex-A系列支持ARM代码。这就是为什么你永远不能在M3代码中看到
BLX
指令的原因之一(BLX reg
)。