研究程序移植痛苦了两周,只要搞清你要做什么,程序移植还是比较简单的事情!

您所在的位置:网站首页 鸿蒙系统用什么语言编写的 研究程序移植痛苦了两周,只要搞清你要做什么,程序移植还是比较简单的事情!

研究程序移植痛苦了两周,只要搞清你要做什么,程序移植还是比较简单的事情!

2023-08-19 17:41| 来源: 网络整理| 查看: 265

由上可知,如果是在各种嵌入式linux(除了uClinux以外,还有好几种)平台上开发,那么针对该平台以及linux平台上的源代码都可以使用,但是要牢记他们之间的差异。在系统中需要实现网络监控,就可以使用snmp协议,该协议和http,ftp一样属于应用层的成熟协议,专用于网络管理。已经有一些针对该协议成熟的代码,最有名的是ucd-snmp,不光软件本身功能强大,可移植性也比较好,在linux,unix等平台上都可以移植,于是决定将它移植到ARM+uClinux平台上(别看现在说的这么轻松,当时接这活时都有点哆嗦)。

简单总结一下,移植应用程序的前提是有源代码,移植的关键工具是编译器,源代码中和硬件平台相关的东西越少越好(这里主要指使用了汇编,或做了针对自己平台的事,比如将指针指向特定地址然后操作),另一方面,如果该程序是基于某个操作系统(利用了操作系统提供的特殊服务,即 API),要看自己的操作系统是否提供了相关服务。

下面简单列出一些移植时需要考虑的问题:

(1) 自己的操作系统的特点以及在当前版本下支持的特性。

例如:uClinux不支持MMU,同样就无法支持相应的特性。

(2) 硬件资源。

因为嵌入式系统资源比较紧张,硬件资源考虑必须要周全:

(1) 软件存储空间的大小

这一般要等用目标编译器重新编译完以后可能才会知道,所以只能大概估算,但千万不要看这个程序在linux下只有几十k,就认为程序很小,这是因为linux下程序多时使用动态库,而在嵌入式系统中,很有可能是把用到的库都链接在一起,所以程序的尺寸会大大增加。

(2) 程序运行空间。

(3) 硬件以及相应的驱动是否完备

以上工作应该尽量做,但有时事先无法把握,只能听天由命了(有没有搞错!!)

可能有人已经要晕菜了,振奋一下大家,如果找到了好的源代码(可移植性好),那么剩下的如要工作就是玩转你的编译器,只要你能顺利的把源代码用你的编译器重新编译一下。90%的工作就完成了(不是吗)

上回已经介绍了一些编译器方面的东西,下面针对ARM编译器的具体参数来讲解一些编译器主要参数的设置。

假如我已经有了hello.c,在x86的linux平台下编译链接一下。

gcc –c hello.c 产生.o

gcc –o hello hello.o 产生可执行文件,上回说过,主机编译器参数都有环境变量保存,所以看起来很简单。这里我故意分两个步鄹。

下面看一下用我的编译器编这个程序(心脏不好的先吃药)。

arm-elf-gcc -Iroot/uClibc/include -msoft-float -mcpu=arm7tdmi -fomit-frame-pointer -fsigned-char -mcpu=arm7tdmi -Os –Wall -DEMBED -D_uClinux_ -c hello.c

这只是编译,将参数逐一讲解。

Arm-elf-gcc 是gnu的arm编译工具

1)Include地址:参数:-I 值:root/uClibc/include(这是在主机上我的uClinux的头文件路径) 用法:-I root/uClibc/include

-I参数保证后面的头文件路径在搜索系统头文件路径前被搜索从而有可能替代系统的头文件,如果有多个这样的参数,则搜索的顺序是从左到右,然后是系统的头文件。

2)-m 是针对CPU的选项。

-mcpu=arm7tdmi 说明CPU类型

-msoft-float 产生包含浮点库的输出

-fsigned-char 让char类型有符号

-fomit-frame-pointer 对所有不需要帧指针的函数都不将其保存在寄存器中。

3) -Os –Wall

-Wall:所有警告都显示

Os:优化尺寸,该选项使能所有所有不增加尺寸的O2优化,并且进一步根据尺寸优化

4) = -DEMBED -D_uClinux_

-D: 将-Dmacro 后的macro定义为字符串1。

以下是链接:

arm-elf-ld -L/root/uClibc/lib -L/usr/local/gnu/arm-elf/lib -L/usr/local/gnu/lib/gcc-lib/arm-elf/3.0.1 -elf2flt –o hello /root/uClibc/lib/crt0.o /usr/local/gnu/lib/gcc-lib/arm-elf/3.0.1/crtbegin.o hello.o

/usr/local/gnu/lib/gcc-lib/arm-elf/3.0.1/crtend.o -lc -lgcc –lc

其中

1) 链接工具: arm-elf-ld

2) -L指明需要链接的库的路径,用法和-I一样,自己的库的路径也可以在这里加入。

-L/root/uClibc/lib -L/usr/local/gnu/arm-elf/lib

-L/usr/local/gnu/lib/gcc-lib/arm-elf/3.0.1

3) –o 后面紧跟生成的最终的文件名

4)/root/uClibc/lib/crt0.o /usr/local/gnu/lib/gcc-lib/arm-elf/3.0.1/crtbegin.o OBJECTS.o

/usr/local/gnu/lib/gcc-lib/arm-elf/3.0.1/crtend.o

这是需要链接在一起的.o文件

5) -lc -lgcc –lc -l 后面紧跟的是需要链接的库的名字,一般库的名字是libxxx.a,使用时为-lxxx即可,不加lib和.a。还要注意位置,自己的库文件应该加在他的库前面。

编译通过后,移植就算完成了,对于比较小的源代码都可以这样,即先分析他的编译选项(用到了那些头文件,库文件等),然后用自己的编译器对照相应参数重新编译一下就行了。

特别推荐

返回搜狐,查看更多



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3