一、现代社会,当我们程序猿拿到一部智能设备,心里在想什么呢?当然是这个智能设备是由什么组成的啦。智能设备的组成包括它的硬件平台和软件平台。硬件平台就是指CPU,CPU有很多系列,常见的有51单片机,avr,ARM,mips,PowerPC等,其中ARM又分为ARM7(stm32),ARM9(2440,2451),ARM11(6410三星),和cotex-A系列;x86又分为386和486。软件平台就是操作系统,现在流行的操作系统有Windows,linux,ISO,Android,wince,VxWorks,μcosii等。
二、那么什么是嵌入式呢?嵌入式就是在已有的平台上移植(修改操作系统源码)操作系统(内核)后做相应的开发(应用软件开发,系统软件开发)。操作系统是用来管理硬件资源和软件资源的。目前做应用软件开发需要熟练掌握一门语言并且熟悉一款操作系统,而做系统软件开发则需要我们精通C语言,熟悉汇编,理解操作系统的实现和熟悉硬件操作原理。
三、现在有操作系统的就称为嵌入式,那么嵌入式的优势在哪里呢?首先操作系统提高了软件的可移植性,其次使得软件开发人员不在需要熟悉硬件的工作原理,再次操作系统提供了多任务机制(进程和线程),而且嵌入式技术提供了丰富的网络协议栈和很多开源 的工具,库和软件。
四、嵌入式操作系统的分类:按收费模式划分:①商用型:VxWorks(美国军方用,航空航天),Wince(Windows的一款,常用于出租车计价器,POS机,超市收银等)②免费性:Linux,μcLinux,μC/OS-II(源代码较少);按实时性划分(规定时间内完成规定操作):①硬实时:VxWorks②软实时:Wince,RTLinux,μC/OS-II(通过软件调度算法来实现)③无实时:Embedded Linux。
五、促进Linux发展的三大因素:第一、GPL计划,开源社区里的交流,更好的维护了Linux操作系统;第二、POSIX标准,在此标准下产生的软的软件都可以兼容Unix和Linux;第三、DNU计划,提出Linux于Unix的不同之处。
六、GCC编译器
GNU CC(简称GCC),它是GNU项目中符合ANSI C标准的编译系统,能够编译多种语言,包括C,C++,JAVA,Object C。gcc 是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件(不同的CPU哟不同的汇编,生成不同的机器码)。
从.c文件到可执行文件要经历四个过程:预处理阶段,编译,汇编,链接。
gcc -E 预处理阶段生成.i文件。预处理阶段主要完成三个功能:加载头文件,宏替换,条件编译,总得来说就是处理#开头的语句
gcc -c编译阶段生成.o文件即目标文件,分为可重入目标文件和不可重入目标文件。可重入即可以重复进入,目标文件在链接的过程中可以被中断,主要用于多任务环境中,不依赖于任何外部环境,切编译结果可预测,没有静态数据结构。不可重入目标文件的特征:用到了静态数据结构(内部存储器),malloc,free和标准I/O函数等,且多次链接的结果不一定相同。
gcc -S汇编阶段生成 .s文件
gcc file.c -o file 链接阶段 链接阶段是不可以停止的,主要操作:符号(函数名、变量名都称为符号)的导入,文件的加载(链接)
gcc -w file 关闭所有警告
gcc -Wall file 打开所有警告
gcc 的优化选项
-O0 默认优化选项,不优化
-O1 一级优化,减少目标文件大小以及执行时间,且不会是编译时 间显著增加(在编译大程序时显著增加编译内存的使用)
-O2 二级优化,包含几乎所有优化,编译器不执行循环展开以及函数内联
-Os 专门优化目标文件大小(执行所有不增加目标文件大小的-O2优化选项)
-O3 在O2的基础上增加了产生inline函数,使用寄存器等优化技术
#include<stdio.h>
在系统目录中找头文件,没有就报错
#include“hello.h”
在当前目录中找头文件,如果没有就到系统目录中找,如果还是没有就报错
** 外部声明 extern int add(int a,int b);写到 add.h中
当头文件不在当前目录中时 gcc -Wall -O2 main.c add.c -o main -Iinclude (到外部指定的第三方文件夹中找头文件)
** 库函数保存在库文件中。库函数:看不到函数的实现但可以在使用
库文件 :看不到库文件里定义的函数和变量,但可以使用
** sdk 系统开发包
**Linux的库文件存放在两个地方 ①根目录的lib中存放系统运行所依赖的库文件② 根目录的usr下的lib中存放的是软件运行所依赖的库文件
**库文件分为静态库文件和动态库文件
静态库文件 .a 在编译时将库文件里 的代码搬迁到执行文件中
动态库文件 .so 在执行时将需要的库文件里的代码搬迁到可执行文件中
**静态库文件和动态库文件的优缺点
静态库文件:代码体积大,执行效率高,不易于升级,编译效率低,布局方便
动态库文件:代码体积小,执行效率低,易于升级,编译效率高,布局难
**制作库文件
制作静态库文件
①制作 gcc -c add.c 生成add.o
ar rcs libadd.a add.o
②使用 gcc main.c -ladd -L/root/0706(绝对路径指定库的路径)
gcc main.c -ladd -L.(相对路径当前目录)
不需要写#include<add.h>
.a文件不能转化成.c文件
.o文件能转化成.c文件
制作动态库文件
①制作 gcc -share -fPIC add.c -o libadd.so
②使用 gcc main.c /root/0706/libadd.so -o main
gcc main.c ./libadd.so -o main