首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Libffi能为Cortex-M3建造吗?

Libffi能为Cortex-M3建造吗?
EN

Stack Overflow用户
提问于 2011-01-16 05:05:32
回答 4查看 1.8K关注 0票数 3

我试着用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时,我会得到不同的错误。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-07 18:32:35

我不想这么说,但这是一项移植工作。可行,不一定非得是一个汇编程序专家,但需要学习一些。从拇指到手臂是很容易的,thumb2,我得查一下,thumb2的大部分都是拇指指令。拇指与手臂指令有一对一的映射,但不是相反的。拇指大部分限制你在所有的工作指令下的8个寄存器,特别的版本或特别的指令使用上寄存器。所以你的手臂指令会变成不止一个拇指指令。

最初,查看是否有一个build选项可以在不使用汇编程序的情况下构建这个包,或者进入该目录,并查看在makefile中是否可以使用C程序而不是汇编程序。我认为使用C有一个严重的性能问题,这就是为什么一开始就有汇编程序。从理论上讲,thumb2比arm更有效,但这并不一定意味着从arm到Thumb2的直接端口。因此,通过一些经验,您可能能够将端口交给thumb2并保持一些性能。

编辑:

下载了相关文件。预先定义的东西意味着它同时知道拇指和armv7m。这就是你要改变stm来推动的地方吗?

票数 1
EN

Stack Overflow用户

发布于 2012-11-01 02:55:04

我将sysV.S修改为折叠,错误是由".arm“指令引起的,当使用cor-m3时,应该注释掉。

代码语言:javascript
复制
#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
票数 2
EN

Stack Overflow用户

发布于 2011-01-16 05:08:52

汇编程序告诉你的真相-手臂组装代码不能成功地工作在拇指-2-像M3这样的处理器上。汇编程序无法将ARM指令助记符映射为对Cortex-M3有意义的操作码。您需要将程序集文件移植到拇指-2程序集代码中,才能正常工作。根据最初的程序集代码所做的,您可能会很幸运,并且能够移植到C,但这可能会使您付出很大的性能损失。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4703917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档