一、嵌入式概念
1.硬件平台:CPU(51,avr,ARM,( ARM7[stm32] , ARM9[2440,2451] , ARM11[6410], cotex-A), mips, powerpc, x86(386,486)DSP)
2.软件平台:windows, linux ,android, ios, Vxworks, wince, ucosii
3.嵌入式技术:在已有的硬件平台上,移植操作系统之后,作相应的开发
二、Linux开发环境
嵌入式Linux编译器gcc,调试器gbd,工程管理器make,脚本语言shell
1.编译器gcc
GNU CC是GNU项目中ANSI C 标准的编译系统。可编译c,c++,java
Gcc 是一个交叉平台编译器,他能够在当前cpu平台上为多种不同体系,结构的硬件平台开发软件
源程序——可执行文件:源程序——预处理——编译——汇编——链接——可执行文件
1) 只预处理:gcc -E hello.c > hello.i(不做语法检查)
系统头文件存放目录:/user/include/stdio.h
预处理所处理的文件:头文件加载,宏定义,条件编译
条件编译
#include<stdio.h>
Int main()
{
Int a[max];
#ifdef max;
Printf(“1\n”); //已经设置max的值,输出1
#else
Printf(“2\n”); //没有设置max,输出2
#endif
Return 0;
}
2)编译 :gcc -c hello.c 生成hello.o
Gcc -c hello.c -o hi.o
进行语法检查,词法分析
3)汇编:gcc -w hello.c生产helllo.s
4)链接过程
目标代码不能直接执行,要想将目标代码变成可执行程序,还需要进行链接操作。才会生成真正可以执行的可执行程序。链接操作最重要的步骤就是将函数库中相应的代码组合到目标文件中。链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件。
关闭警告gcc -w hello.c(禁用)
开警告gcc -Wall hello.c
三级优化
Gcc -O1 main.c -o main
Gcc -O2 main.c -o main
Gcc -O3 main.c -o main
-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化.在编译大型程序的时候会显著增加编译时内存的使用.
-O2: 包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化.编译器不执行循环展开以及函数内联.此选项将增加编译时间和目标文件的执行性能.
-Os:专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项.并且执行专门减小目标文件大小的优化选项.
-O3: 打开所有-O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize优化选项.
预处理下 <> :在系统目录下寻找
“”:在当前目录下寻找不到在进入系统目录
调用外部函数:gcc main.c add.c
开警告,并且优化:gcc -Wall -O3 main.c add.c -o main
当add.h不在当前文件下:#include“include/add.h”
Gcc -Wall -O3 main.c add.c -o main -Iinclude(第三方目录下)
-I/root/0706/include(绝对目录下)
外部申明:extern int add(int int a,int b);
库函数:只能调用看不见其实现,存放在库文件中
库文件:看不见库函数中的函数和变量,但是可以实现
| 静态库 | 动态库 |
| .a | .so |
定义 | 在编译时将库函数中代码搬迁到执行文件中 | 在执行时将需要的库文件里的代码搬迁到可执行文件里 |
代码体积 | 大 | 小,轻便 |
执行效率 | 高 | 低 |
代码升级 |
| 易于软件升级 |
编译效率 |
| 更高,更快 |
代码布局 | 更方便 |
|
| 所需执行效率高 | 所需代码频繁升级 |
静态库:
根目录:/lib:系统运行依赖库文件
/user/lib :软件运行依赖文件
Printf scanf strcpy —— libc.a libc.so
Sin 等数学函数 —— libm.a libm.so
gcc main.c -lm[库名] (include<math.h>)
创建静态库程序:
gcc -c add.c ——add.o
ar rcs libadd.a add.o //将add.o封装在库文件中
rc:静态库不存在就创建 s:若存在则更新该库
gcc main.c-ladd -L. //表示在当前目录下
链接 -L/root/0706
或将ladd拷入lib中
动态库:
创建动态库程序:
gcc -shared -fPIC add.c -o libadd.so
gcc main.c ./libadd.so -L. -o add