我试着用GCC为Cortex-M3处理器构建外部函数接口库。根据http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html
-mthumb
为拇指指令集生成代码。默认情况是使用32位ARM指令集.此选项自动启用基于-mcpu=name和-march=name选项的16位拇指-1或混合16/32位拇指-2指令。此选项不会传递给汇编程序。如果希望强制汇编程序文件被解释为拇指代码,可以将`.thumb的指令添加到源代码中,或者将-mthumb选项直接传递给汇编程序,方法是在汇编程序的前面加上-Wa。
我试图将各种参数传递给汇编程序,但似乎找不出答案。典型产出如下:
构建文件:../source/ffi/sysv.S
调用: GCC汇编程序
臂裸_newlib_cortex_m3_nommu gcc -Wa,-m拇指-互操作-Wa -o"source/ffi/sysv.o“../source/ffi/sysv.S”。
./source/ffi/sysv.S:汇编程序消息:
./source/ffi/sysv.S:145: Error:所选处理器不支持ARM操作码
./source/ffi/sysv.S:147:错误:尝试在只使用拇指的处理器上使用ARM指令--“`stmfd sp!,{r0-r3,fp,lr}”
..。
我可以在没有成为装配专家的情况下在Cortex-M3上使用libffi吗?
值得注意的是,当我直接调用arm-bare_newlib_bare_M3_nommu时,我会得到不同的错误。
发布于 2011-02-07 18:32:35
我不想这么说,但这是一项移植工作。可行,不一定非得是一个汇编程序专家,但需要学习一些。从拇指到手臂是很容易的,thumb2,我得查一下,thumb2的大部分都是拇指指令。拇指与手臂指令有一对一的映射,但不是相反的。拇指大部分限制你在所有的工作指令下的8个寄存器,特别的版本或特别的指令使用上寄存器。所以你的手臂指令会变成不止一个拇指指令。
最初,查看是否有一个build选项可以在不使用汇编程序的情况下构建这个包,或者进入该目录,并查看在makefile中是否可以使用C程序而不是汇编程序。我认为使用C有一个严重的性能问题,这就是为什么一开始就有汇编程序。从理论上讲,thumb2比arm更有效,但这并不一定意味着从arm到Thumb2的直接端口。因此,通过一些经验,您可能能够将端口交给thumb2并保持一些性能。
编辑:
下载了相关文件。预先定义的东西意味着它同时知道拇指和armv7m。这就是你要改变stm来推动的地方吗?
发布于 2012-11-01 02:55:04
我将sysV.S修改为折叠,错误是由".arm“指令引起的,当使用cor-m3时,应该注释掉。
#ifdef __ARM_ARCH_7M__ /* cortex-m3 */
#undef __THUMB_INTERWORK__
#endif
#if __ARM_ARCH__ >= 5
# define call_reg(x) blx x
#elif defined (__ARM_ARCH_4T__)
# define call_reg(x) mov lr, pc ; bx x
# if defined(__thumb__) || defined(__THUMB_INTERWORK__)
# define __INTERWORKING__
# endif
#else
# define call_reg(x) mov lr, pc ; mov pc, x
#endif
/* Conditionally compile unwinder directives. */
#ifdef __ARM_EABI__
#define UNWIND
#else
#define UNWIND @
#endif
#if defined(__thumb__) && !defined(__THUMB_INTERWORK__)
.macro ARM_FUNC_START name
.text
.align 0
.thumb
.thumb_func
#ifdef __APPLE__
ENTRY($0)
#else
ENTRY(\name)
#endif
#ifndef __ARM_ARCH_7M__ /* not cortex-m3 */
bx pc
nop
.arm
#endif
UNWIND .fnstart
/* A hook to tell gdb that we've switched to ARM mode. Also used to call
directly from other local arm routines. */
#ifdef __APPLE__
_L__$0:
#else
_L__\name:
#endif
.endm发布于 2011-01-16 05:08:52
汇编程序告诉你的真相-手臂组装代码不能成功地工作在拇指-2-像M3这样的处理器上。汇编程序无法将ARM指令助记符映射为对Cortex-M3有意义的操作码。您需要将程序集文件移植到拇指-2程序集代码中,才能正常工作。根据最初的程序集代码所做的,您可能会很幸运,并且能够移植到C,但这可能会使您付出很大的性能损失。
https://stackoverflow.com/questions/4703917
复制相似问题