硬件平台:CPU (51,avr,ARM(ARM(stm32),ARM9(2440,2451),ARM11(6410),cotex-A),mips,powerpc,x86),DSP
软件平台:windows,linux,android,ios,Vxworks,winCE,μcosⅡ
(操作系统的作用:管理资源(硬件资源,软件资源))
只要操作系统变,硬件不管怎么变,软件不变
嵌入式操作系统的好处:
①提高软件的移植性
②软件开发人员不需要再熟悉硬件工作原理
③提供多任务机制(进程&线程)
④提供丰富的网络协议栈
⑤提供很多开源的工具库以及软件
嵌入式操作系统的分类:
按收费模式划分:
商用型:Vxworks,WinCE
免费型:Linux μC/OS-Ⅱ(实时型)
按实时型划分:
硬实时:Vxworks
软实时:WinCE,RTLinux
无实时:Embedded Linux
GNU CC(简称gcc),符合ANSI C标准的编译系统,gcc又是一个交叉平台编译器,能在当前CPU平台上为多种不同体系结构的硬件平台开发软件
使用GCC编译时,需经历哪些阶段:
1、预处理(不做语法检查)----宏定义,条件编译
ls /usr/include/stdio 系统文件存放目录
(1)头文件展开(头文件用来函数声明)
(2)宏替换#define M
(3)条件编译#if #ifdef #endif
2、编译阶段(语法检查、词法分析)
gcc -c test.c -o test.o
3、汇编阶段
gcc -s test.c :生成test.s汇编
4、链接阶段( 链接过程中经历哪些步骤?)
链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可执行代码的过程
(1)静态链接
在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。
(2) 动态链接
在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。
对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。
库文件:看不到库文件里定义的函数和变量,但可以使用
Linux库文件分类:静态库.a动态库.so
静态库的特点:在编译时将库文件里的代码搬迁到执行文件里(优点:执行效率高,代码布局更好 缺点:可执行文件最终生成体积大,不易升级需要重新编译)
动态库的特点:在执行时将需要的库文件里的代码搬迁到可执行文件里(优点:可执行文件最终生成体积小,易于升级无需重新编译,编译效率高,速度快 缺点:代码布局更难)
库文件的存放路径:
/lib:系统运行依赖的库文件
/usr/lib:程序、软件所需要运行的库
“<stdio.h>”中“<>”表示在系统中查找,找不到则报错
“”stdio.h””中“”””表示在当前目录中查找,找不到再到系统中查找
gcc -w test.c:关闭警告
gcc -Wall test.c:显示所有的警告
gcc -O1 test.c -o test:一级优化
优化:
-O0:默认模式,不做任何优化。
-O1:优化。该模式下对于一个大的函数或功能会花费更多的时间和内存。在-O1下:编译会尝试减少代码体积和代码运行时间。但是并不执行会花费大量时间的优化操作。
-O2:进一步优化.GCC执行几乎所有支持的操作但不包括空间和速度之间权衡的优化。-O2优化等级下,并不执行循环展开和函数“内联”。与-O1比较该优化-O2将会花费更多的编译时间当然也会生成性能更好的代码。-O2除了打开-O1的所有优化参数外还打开优化选项。
-O3:更进一步优化
gcc -Wall -O3 main.c add.c -o main -I/root/0706/include:指定头文件第3方搜索路径
gcc main.c -lm:在c库中找不到,则到m库中查找
静态库:
gcc -c add.c
ar rcs libadd.a add.o:将add.o封装在库里(将add.c变成库文件)
gcc main.c -ladd -L(.):指定库的搜索路径(加“.”表示指定当前目录)
动态库:
gcc -shared -fPIC add.c -o libadd.so
gcc main.c (./)libadd.so -o add:(./)表示当前目录,若为(/root/)表示绝对路径
附:
main.c:
#include<stdio.h>
#include "add.h"
{
printf("add=%d\n",add(3,6));
return 0;
}
add.c:
int add(int a,int b)
{
return a+b:
}
add.h:
extern int add(int a,int b);