上篇文章简单说了下ARM编译器的选择,本篇文章通过一些例子演示下。
测试代码如下:
void main(int argc, char **argv)
{
double c = 1.0000000000000000001;
for(int i=0;i<1000000000;i++)
c *= c;
printf("c = %.300fn", c);
}
一、平台1测试(ARMV7指令集,支持硬件浮点)
floathard程序是编译时指定浮点计算为硬件浮点,指令集为V7。
floatsoft程序是编译时指定浮点计算为软件浮点,指令集为V7。
测试截图如下,可以看到硬件浮点的计算要快。
二、平台2测试(ARMV7指令集,不支持硬件浮点)
floathard程序是编译时指定浮点计算为硬件浮点,指令集为V7。
floatsoft程序是编译时指定浮点计算为软件浮点,指令集为V7。
测试截图如下,可以看到运行硬件浮点的程序时提示错误为 "not found",今后如果编写的程序执行时碰到类似错误提示可以考虑下是否为编译器的浮点选项配置不正确。
三、平台3测试(ARMV5指令集,不支持硬件浮点)
floathard程序是编译时指定浮点计算为硬件浮点,指令集为V7。
floatsoft程序是编译时指定浮点计算为软件浮点,指令集为V7。
测试截图如下,由于V5指令集的硬件无法运行V7指令集的程序,可以看到运行程序时提示错误为 "syntax error: unexpected word",今后如果编写的程序执行时碰到类似错误提示可以考虑下是否为编译器的指令集配置不正确。
float111程序是编译时指定浮点计算为软件浮点,指令集为V5。
可以看到程序正常运行了,由于此CPU主频低,架构老,程序执行时间非常长。
四、windows下能开发linux应用吗?
这里说的windows是不使用虚拟机,wsl的情况。
答案是肯定的,可以使用msys2。
我的方案是先安装scoop,通过scoop再安装msys2,在msys2中再通过pacman安装各种需要的软件和库。
在msys2,c盘对应于/c目录,d盘对应于/d目录,以此类推。
如果msys2的pacman中的ARM编译器的版本不满足要求,可以从下面网址安装指定版本的编译器:
https://releases.linaro.org/components/toolchain/binaries/
通过上述方法可以满足嵌入式linux开发绝大多数的工作,唯一不方便的地方是涉及到文件系统的时候,主要是根文件系统的制作,因为windows不支持软链接,编译出来一个库之后,linux下的.so是链接到底层的.so.x.x.x,而windows下.so其实也是一个真实文件,和.so.x.x.x是相同的文件。
欢迎大家关注我的公*号:embedded_bug