嵌入式的组成
硬件子系统,软件子系统
嵌入式:为了降低传统单片机软硬件耦合度过高,创建了操作系统,从而实现跨平台移植,增强系统的兼容性,实现多进程管理
嵌入式 软件--------上层----应用软件开发;如:Linux C, Android, ios
操作系统----底层----系统软件开发;如:BSP, 驱动, 内核
硬件
&.为什么要移植操作系统?
1.提高软件的可移植性
2.使软件开发人员不需要了解硬件知识,提高开发效率
3.操作系统提供了许多开源的软件,工具,库
4.实现多任务
5.提供大量网络协议栈
缺陷:操作系统使对硬件的要求提高,成本相应更高
(移植性:软件移植需要改动的多少)
&.其他部分嵌入式系统
Vxworks:用于航空航天及军事,不开源,硬实时
WinCE:用于金融方面,不开源
µC/OS-Ⅱ:用于单片机,代码很少,约五千行
Linux无实时性
(实时性:在规定时间内完成动作; 硬实时:软件硬件共同决定)
&.Linux与Unix关系
1.Unix与Linux遵循POSIX标准(可移植操作系统)
2.GNU计划:GNU is not Unix
3.GPL协议:源码共享及修改优化共享
(Unix之父丹尼斯里奇同样是C语言之父,Unix基于C语言)
&.Linux预备
Linux特性及原则:一切皆文件
分类:
普通文件:“-”开头
目录文件:“d”开头
设备文件:“c”或“b”开头(c,字符设备; b,块设备;eth0,网络设备)
链接文件:“l”开头
共享文件:“s”开头
管道文件:“p”开头
&.根目录下的子目录
bin:储存普通用户命令
sbin:储存超级用户命令
dev:系统设备文件
etc:系统配置文件
lib:库文件
net:网络文件
usr:第三方软件安装默认目录
usr/include:系统头文件目录
proc:虚拟文件系统,存在内存上
sys:挂载点
IDE:集成开发环境
开发工具:
gcc:编译器;静态库和动态库
gdb:调试器;找段错误
make:工程管理;Makefile的格式与编写
shell:脚本语言
交叉编译器,在一个平台编译可在另一个平台运行
gcc编译过程
1.预处理(-E)生成 .i文件
(1)头文件展开
(2)宏替换
(3)条件编译
2.编译(-S)生成 .s文件
把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件
3.汇编(-c)生成 .o文件,即目标文件
将汇编代码转变成机器可以执行的命令
4.链接(-O)
链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件
编译器优化 -O1,-O2,-O3
&.-O1,-O2,-O3,-Os都优化了什么?
-O1:编译会尝试减少代码体积和代码运行时间。但是并不执行会花费大量时间的优化操作
-O2:进一步优化.GCC执行几乎所有支持的操作但不包括空间和速度之间权衡的优化。-O2优化等级下,并不执行循环展开和函数“内联”优化操作。与-O1比较该优化-O2将会花费更多的编译时间当然也会生成性能更好的代码
-O3:更进一步优化。-O3打开-O2指定的所有优化操作并且打开:-finline-functions,-funswitch-loops,-fgcse-after-reload
-Os:针对程序空间大小优化(多用于嵌入式系统)。-Os使能-O2中除去会增加程序空间的所有优化参数。同时-Os还会执行更加优化程序空间的选项
宏函数和普通函数区别:
宏函数在预处理阶段完成,无法发现错误;普通函数在编译阶段能发现错误;
在频繁调用确认无误的函数是用宏函数可提高效率
头文件
例: 声明变量,函数
#include<stdio.h> 头文件展开
#define MAX 100 宏替换
{
ifndef MAX
printf(“Hello/n”); 条件编译
else
printf(“Hi/n”);
return 0;
}
&.<>和“”区别
<>只包含系统自带文件,先在系统头文件目录了搜索
“”包含自定义头文件,先在当前目录搜索
Linux部分常用命令:
命令行:
cd:切换当前目录
1. cd /root/Docements # 切换到目录/root/Docements
2. cd ./path # 切换到当前目录下的path目录中,“.”表示当前目录
3. cd ../path # 切换到上层目录中的path目录中,“..”表示上一层目录
ls:查看文件与目录,list之意
1. -l :列出长数据串,包含文件的属性与权限数据等
2. -a :列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用)
3. -d :仅列出目录本身,而不是列出目录的文件数据
4. -h :将文件容量以较易读的方式(GB,kB等)列出来
5. -R :连同子目录的内容一起列出(递归列出),等于该目录下的所有文件都会显示出来
grep:分析一行的信息,若当中有我们所需要的信息,就将该行显示出来
1.-a :将binary文件以text文件的方式查找数据
2. -c :计算找到‘查找字符串’的次数
3. -i :忽略大小写的区别,即把大小写视为相同
4. -v :反向选择,即显示出没有‘查找字符串’内容的那一行
find:查找
cp:复制文件
1. -a :将文件的特性一起复制
2. -p :连同文件的属性一起复制,而非使用默认方式,与-a相似,常用于备份
3. -i :若目标文件已经存在时,在覆盖时会先询问操作的进行
4. -r :递归持续复制,用于目录的复制行为
5. -u :目标文件与源文件有差异时才会复制
mv:移动文件、目录或更名
1. -f :force强制的意思,如果目标文件已经存在,不会询问而直接覆盖
2. -i :若目标文件已经存在,就会询问是否覆盖
3. -u :若目标文件已经存在,且比目标文件新,才会更新
1. mv file1 file2 file3 dir # 把文件file1、file2、file3移动到目录dir中
2. mv file1 file2 # 把文件file1重命名为file2
rm:删除文件或目录
1. -f :就是force的意思,忽略不存在的文件,不会出现警告消息
2. -i :互动模式,在删除前会询问用户是否操作
3. -r :递归删除,最常用于目录删除
ps: 将某个时间点的进程运行情况选取下来并输出
1. -A :所有的进程均显示出来
2. -a :不与terminal有关的所有进程
3. -u :有效用户的相关进程
4. -x :一般与a参数一起使用,可列出较完整的信息
5. -l :较长,较详细地将PID的信息列出
kill:中止
file:判断接在file命令后的文件的基本数据,因为在Linux下文件的类型并不是以后缀为分的
tar:对文件进行打包,默认情况并不会压缩,如果指定了相应的参数,它还会调用相应的压缩程序(如gzip和bzip等)进行压缩和解压
1. -c :新建打包文件
2. -t :查看打包文件的内容含有哪些文件名
3. -x :解打包或解压缩的功能,可以搭配-C(大写)指定解压的目录,注意-c,-t,-x不能同时出现在同一条命令中
4. -j :通过bzip2的支持进行压缩/解压缩
5. -z :通过gzip的支持进行压缩/解压缩
6. -v :在压缩/解压缩过程中,将正在处理的文件名显示出来
7. -f filename :filename为要处理的文件
8. -C dir :指定压缩/解压缩的目录dir
1. 压缩:tar -jcv -f filename.tar.bz2 要被处理的文件或目录名称
2. 查询:tar -jtv -f filename.tar.bz2
3. 解压:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
cat:查看文本文件的内容,后接要查看的文件名
chgrp:改变文件所属用户组
chown:改变文件的权限
权限三个一组,用二进制三位之和
r可读 w可写 x可执行
vim:文本编辑,它接一个或多个文件名作为参数,如果文件存在就打开,如果文件不存在就以该文件名创建一个文件
gcc:把C语言的源程序文件,编译成可执行程序
time:用于测算一个命令(即程序)的执行时间
底行:
/----查找
s/hello/hi/g-----选择hi替换hello
sp demo.c 分屏
3,14 w demo.c----另存(复制)至demo.c
15 r demo.c----在15行读入(粘帖)demo.c内容
w----保存
q----退出
工作行:
yy-----复制
p-----粘帖
u----撤销