完全可以的。无论windows或Linux系统下,MATLAB自带有工具(C Coder)将m文件转为相应C文件。在linux下,稍微调整下代码,再用GCC编译即可得到PC程序,用交叉编译器就能喜爱ARM上运行。
看到上面有评论说“痴人说梦”,我想,是你们几个该睡醒了!
汇编主要是要了解CPU指令及用法,常说的是PC机的x86汇编,指令是x86的复杂指令集。
arm汇编是arm的精简指令集,比x86容易学,程序格式倒是和x86汇编差不多。
C语言ARM的和x86的差不多,除了对硬件寄存器 *** 作不同,其它语法和流程都一样。
arm汇编程序每一行是指定arm core执行一条指令,每条指令都是硬件相关。
如:LDR R3, #1 ;用LDR指令将数值1放入R3寄存器准备参与运算
C语言与arm指令无关,只与逻辑运算有关,指定硬件地址的 *** 作才与硬件相关;
如果用arm编译器来编译,每行可能编译出1到多条arm指令。
如:i++; //变量 i 递增1等效于LDR R3,#1 ;
用LDR指令将数值1放入R3寄存器准备参与运算ADD R2, R2, R3 ;
用ADD指令将R2、R3寄存器里的数值相加后放回R2寄存器以上等效汇编的R2、R3寄存器只是为了举例,C语言不像汇编,不需要由程序员指定用哪个寄存器参与运算,编译器编译时会根据程序结构自动判断选择。
无论是c语言还是汇编语言,编译器编译后的结果是机器执行码,很多人因为汇编语言比较难懂及指令相关,所以以为它就是机器语言,其实它仍是人类设计的编写程序的语言,仍需要编译器编译成机器码才能执行,它只是比C语言更接近硬件而已。
段定义前加 PRESERVE8 伪指令试一下。
前两天刚好看到 ARM UCOS 汇编代码中用到PRESERVE8这个关键字(加在段定义之前),以前没见过的,于是百度。
1汇编代码没有保持8字节栈对齐而调用C或C++代码。
2ADS下的代码用RVDS22编译时,即使已经8字节栈对齐,连接器也将之当作非8字节栈对齐。
所以要用伪指令指明一下。
E文不好,故而附原文以供参详:
where assembler code (that does not preserve 8-byte stack alignment) calls compiled C/C++ code (that requires 8-byte stack alignment), and
when attempting to link legacy SDT/ADS objects with RVCT 2x objects Legacy SDT/ADS objects that do not have these attributes are treated as '~PRES8', even if they do actually happen to preserve 8-byte alignment
Android设备上的应用程序大都是用Java语言编写的,但有时我们需要用C语言进行一些底层的开发,但我们一般的PC机CPU都是Intel x86架构,而大多数移动设备CPU都是ARM架构,因此在Linux上编译运行的可执行程序是不能直接在Android手机上运行的,但是我们可以在PC机上交叉编译出能在ARM平台下运行的程序。
1安装交叉编译工具
首先,我们需要在Linux下安装 arm-none-linux-gnueabi-gcc 交叉编译工具链下载地址(找了好久~_~)
不多说了,放到usr/local/bin目录下,解压文件包,解压后得到一个arm-2009q1文件夹,然后把arm-2009q1下的bin目录配进环境变量
如果在终端下执行arm-none-linux-gnueabi-gcc -v可以成功的话,就说明配置成功了,如图
2编译C程序
接着我们就可以写C语言程序并且编译了,随便写一个HelloWorld程序
[cpp] view plain copy
#include <stdioh>
int main()
{
printf("Hello world!\n");
return 0;
}
然后用arm-none-linux-gnueabi-gcc编译(其实下面的编译命令有问题,具体后面再说)
[plain] view plain copy
arm-none-linux-gnueabi-gcc testc -o test
3赋予可执行权限
然后,把可执行文件拷贝到手机sdcard中
尝试运行一下test,结果Permission denied
明明有执行权限呀,后来得知原因是sdcard目录下是不可以执行程序的,而在根目录的/data/local目录下是可以执行的
先获得管理员权限,这样才能读写根目录
[plain] view plain copy
su
将程序cat到指定的目录中
[plain] view plain copy
cat test > /data/local/test
这时还只有读写权限,我们要添加可执行权限
[plain] view plain copy
chmod 777 test
再次尝试执行
结果是No such file or directory!
后来经过借鉴网友的经验,发现这个是因为我们的程序使用的是动态链接方式编译的,而Android和Ubuntu的链接库文件路径不同,导致找不到文件
可以用gcc -static命令改用静态链接的方式编译
[plain] view plain copy
arm-none-linux-gnueabi-gcc testc -o test -static
静态链接后程序大了不少,再重复上述步骤,终于可以成功运行了,Hello world!
#include <stdioh>
int main(int argc, const char argv[])
{
int data = 0, result = 0;
__asm__ __volatile__(
"movl $0, %[data]\n"
"movl $0, %0\n"
"loop1:"
"inc %[data]\n"
"addl %[data], %0\n"
"cmp $100, %[data]\n"
"jne loop1\n"
:"=r"(result), [data]"=r"(data) / Rotation result /
:/ Rotated value /
:/ No clobbers /
);
printf("result = %d, data = %d\n", result, data);
return 0;
}
gcc 的内联汇编 , 执行效果:
$ gcc mainc -o main
$ /main
result = 5050, data = 100
希望你满意!
以上就是关于怎么把MATLAB里面的m文件转化成ARM上运行的C语言全部的内容,包括:怎么把MATLAB里面的m文件转化成ARM上运行的C语言、arm编程与C语言的编程区别和方法、嵌入式ARM 混合编程,汇编调用C语言,在线等等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)