c高级篇。
嵌入式Linux操作系统
1.什么是操作系统
操作系统是管理和控制计算机硬件与软件资源的计算机程序 , 它是直接运行在 “ 裸机 ” 上的最基本的系统软件, 任何其他软件都必须在操作系统的支持下才能运行。2.操作系统的分类
1. 批处理操作系统 2. 分时操作系统 3. 实时操作系统 4. 嵌入式操作系统 5. 个人计算机操作系统 6. 网络操作系统 7. 分布式操作系统3.嵌入式操作系统
1.什么是嵌入式操作系统
嵌入式系统是 * * 以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于对功能、可靠 性、成本、体积、功耗有严格要求的专用计算机系统。
2.嵌入式系统应用领域
一.工业控制
机械手臂、集装箱起重机、工业机器人、电机驱动器、智能测量仪、智能控制器、智能数控机床等二、智能家居领域
智能扫地机器人、空调、冰箱、洗衣机、投影仪、智能门锁、智能门禁、可视对讲门铃、微波炉、电视 机、遥控器、水电表、扫地机器人等三、安防领域
人脸识别、监控设备、指纹识别、视网膜识别等四、汽车电子领域
行车记录仪、自动驾驶系统、车辆导航系统等五、交通物流领域
蜂巢快递柜、共享单车、智能分拣等六、健康医疗领域
生化分析仪、血液分析仪、 CT 等各类智能检测仪器、智能血压计、智能手环等七、通信领域
机顶盒、路由器、通信基站设备、交换机等八、金融领域
刷卡机、智能 ATM 终端等九、消费电子领域
手机、平板电脑、可穿戴设备、游戏机、数码相机、广告机、遥控玩具、音频视频播放器、自动售货机 等十、军事航空领域
卫星系统、无线传输系统、定位系统、无人机、雷达系统、火炮、导弹和智能炸弹制导引爆等控制装 置、各种智能坦克、舰艇、轰炸机等3.嵌入式系统分类
Linux μ C/OS windows CE Vxworks QNX4.嵌入式Linux
1.Linux历史
2.Linux版本

Linux操作系统的使用
1.认识shell
1.什么是shell
shell :命令行解释器 , 用户和内核之间的桥梁 shell 也是一个程序 , 提供给了我们一个界面 ,( 终端 )2.shell版本
Bourne Shell : 最早的 Shell C Shell Ksh Z Shell Bourne-again shell ( bash)2.shell命令的格式
shell 命令的三要素: 命令名称 [ 选项 ] [ 参数 ] 注意 :.
一条命令三要素之间必须要有空格隔开 . 若多个命令在一行书写 , 用分号 (;) 将各命令隔开 . 如果一条命令不能在一行写完 , 在行尾使用反斜杠 () 标明该条命令未结束3.Linux命令
1.用户系统相关命令
1.用户切换命令(su)
linux@ubuntu:~ $ sudo -i # 普通用户切换 root 用户 [sudo] password for linux: root@ubuntu:~ # su - linux linux@ubuntu:~ $2.系统管理命令
ps: 显示当前系统中由该用户运行的进程列表 在 windows 查看进程 ctrl+alt+Del
ps -ef : 查看所有进程及其 PID( 进程号 ), 系统时间 , 命令详细目录 , 执行者者
ps aux: 除可显示 -ef 所有内容之外 , 还可显示 CPU 及内存占用率 , 进程状态 
ps -w 加宽以显示较多的信息
top:动态显示系统中运行的程序 (一般为每隔几秒刷新一次)

linux@ubuntu:~$ kill -l
1 ) SIGHUP 2 ) SIGINT 3 ) SIGQUIT 4 ) SIGILL 5 ) SIGTRAP 6 ) SIGABRT 7 ) SIGBUS 8 ) SIGFPE 9 ) SIGKILL 10 ) SIGUSR1 11 ) SIGSEGV 12 ) SIGUSR2 13 ) SIGPIPE 14 ) SIGALRM 15 ) SIGTERM 16 ) SIGSTKFLT 17 ) SIGCHLD 18 ) SIGCONT 19 ) SIGSTOP 20 ) SIGTSTP 21 ) SIGTTIN 22 ) SIGTTOU 23 ) SIGURG 24 ) SIGXCPU 25 ) SIGXFSZ 26 ) SIGVTALRM 27 ) SIGPROF 28 ) SIGWINCH 29 ) SIGIO 30 ) SIGPWR 31 ) SIGSYS 34 ) SIGRTMIN 35 ) SIGRTMIN + 1 36 ) SIGRTMIN + 2 37 ) SIGRTMIN + 3 38 ) SIGRTMIN + 4 39 ) SIGRTMIN + 5 40 ) SIGRTMIN + 6 41 ) SIGRTMIN + 7 42 ) SIGRTMIN + 8 43 ) SIGRTMIN + 9 44 ) SIGRTMIN + 10 45 ) SIGRTMIN + 11 46 ) SIGRTMIN + 12 47 ) SIGRTMIN + 13 48 ) SIGRTMIN + 14 49 ) SIGRTMIN + 15 50 ) SIGRTMAX-14 51 ) SIGRTMAX-13 52 ) SIGRTMAX-12 53 ) SIGRTMAX-11 54 ) SIGRTMAX-10 55 ) SIGRTMAX-9 56 ) SIGRTMAX-8 57 ) SIGRTMAX-7 58 ) SIGRTMAX-6 59 ) SIGRTMAX-5 60 ) SIGRTMAX-4 61 ) SIGRTMAX-3 62 ) SIGRTMAX-2 63 ) SIGRTMAX-1 64 ) SIGRTMAX
clear: 清除屏幕上的信息 uptime: 显示系统已经运行了多长时间 关机 shutdown -h now 现在立刻关机 shutdown -h +30 30 分钟之后关机 重启 reboot 重启 shutdown -r now 重启 3.磁盘相关命令
free: 查看当前系统内存的使用情况 df: 查看文件系统的磁盘空间占用情况 du: 统计目录 ( 或文件 ) 所占磁盘空间的大小 du -sh fdisk 查看磁盘分区情况及对磁盘进行分区管理 fdisk -l 显示文件系统的分区情况.
使用 fdisk 必须拥有 root 权限 .IDE 磁盘 hda,hdb......,SCSI 硬盘是对应 sda,sdb......hda1, 第一个硬盘分区2.文件,目录相关命令
1.vim 编辑器
vi 的查找和替换 1. 查找 ( 命令模式下 ) /< 要查找的字符 > 向下查找要查找的字符 ?< 要查找的字符 > 向上查找要查找的字符 2. 替换 (底行模式下) :%s/str1/str2/g # 字符串 str2 替换正文中所有出现的 str12.chmod:改变文件的访问权限

方法二:


3.chown:修改文件的所有者和组别

4.chgrp:改变文件的组所有权
5.cat 查看比较短的文档
linux@ubuntu:~/23072/C补习/day8$ cat 1.c
#include
int a=10;
int main(void)
{
return 0;
} 6.more适合查看比较长的文档
按空格 (space) 向下走一页 按回车 (Enter) 向下走一行 按 B 向上走一页 按 q 退出7.less是more的增强版
按空格 (space) 向下走一页 按回车 (Enter) 向下走一行 按 B 向上走一页 按 q 退出 支持上下箭头8.grep: 在指定文件中搜索特定的内容,并将含有这些内容的行标准输出
linux@ubuntu:~/23072/C补习/day8$ grep -n scores arr.c #在arr.c这个文件中查找scores这个字符串
4://编写一子函数,将scores数组中的元素进行输出
5://参数1: 数组的首地址 float * scores 参数2:元素的个数 int n
7:void output(float * scores,int n);
8:void output1(float scores[5],int n);
9:void output2(float scores[],int n); //[]表示你传过来的是个数组,该数组中的每个元素是
float
11:void output2(float scores[],int n)
16: printf("%.1f ",scores[i]);
22:void output1(float scores[5],int n)
24: printf("sizeof(scores)=%ld\n",sizeof(scores));
26:void output(float * scores,int n)
31: printf("%.1f ",*(scores+i));
37: float scores[SIZE]={90,98,96,78,83};
38: output1(scores,SIZE);
39: //output(scores,SIZE); //output(&scores[0]) 9.常用的特殊符号
.
重定向符号 > 文件不存在 , 则新建 , 文件存在 , 覆盖原文件中的内容linux@ubuntu:~$ cal > 1.txt
linux@ubuntu:~$ cat 1.txt
七月 2023
日 一 二 三 四 五 六1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 . 追加重定向符号 >> 文件不存在则新建,文件存在,则追加在文件的末尾 date >> 1 .txt . 反引号 `` linux@ubuntu:~$ echo today is date
today is date
linux@ubuntu:~$ echo today is `date` #将date当成命令来执行
today is 2023年 07月 30日 星期日 20:11:52 PDT . 通配符
10.ln (创建链接文件)---->类似于windows快捷方式
硬链接
ln 源文件路径 硬链接文件----------ln /home/linux/23072/LinuxC/day2/1.txt ying1.txt
软链接 ln -s 源文件路径 软链接文件 注意:.ln
命令会保持每一处链接文件的同步性 , 也就是说 , 你不论改动哪一处 , 其他的文件也都会发生相同的变 化 . 软链接它只会在选定的位置上生成一个文件的镜像 , 不会重复占用磁盘空间 硬链接它会在选定的位置上生成一个和源文件大小相同的文件。11.find 在指定目录下搜索文件,它的使用权限是所有用户
find [ 路径 ] [ 选项 ] [ 描述 ] 当前路径 -name3.压缩打包命令
1.压缩
1.gzip

2.tar: 对文件目录进行打包和解包
-c , --create # create a new archive ( 创建包文件 ) -f # 指名包文件名 -x # 解包 -v # 显示打包的过程 -z # 自动调用 gzip,gunzip -j # 自动调用 bzip21.先打包生成mynew.tar


4.解包
linux@ubuntu:~$ tar -xvf my
3.打包+压缩
linux@ubuntu:~/23072/LinuxC$ ls
1.txt day1 day2 day3
linux@ubuntu:~/23072/LinuxC$ tar -cvzf mynew.tar.gz day1 day3 1.txt
day1/
day1/demo1.c
day1/demo1
day3/
day3/k.c
day3/j.c
day3/c.c
1.txt
linux@ubuntu:~/23072/LinuxC$ ls
1.txt day1 day2 day3 mynew.tar.gz 4.解压+解包
linux@ubuntu:~/23072/LinuxC $ ls day2 mynew.tar.gz linux@ubuntu:~/23072/LinuxC $ tar -xvzf mynew.tar.gz day1/ day1/demo1.c day1/demo1 day3/ day3/k.c day3/j.c day3/c.c 1 .txt linux@ubuntu:~/23072/LinuxC $ ls 1 .txt day1 day2 day3 mynew.tar.gz4.文件比较命令diff
5.Linux环境变量
1.临时修改变量的值 PATH
2.永久修改变量的值 PATH
vim /etc/profile
Linux软件管理
1.离线安装
linux@ubuntu:~/Desktop$ sudo dpkg -i sl_3.03-17build2_amd64.deb
Selecting previously unselected package sl.
(Reading database ... 484364 files and directories currently installed.)
Preparing to unpack sl_3.03-17build2_amd64.deb ...
Unpacking sl (3.03-17build2) ...
Setting up sl (3.03-17build2) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) .. 2.apt高级软件包管理工具
linux@ubuntu:~$ sudo apt-get install vim #安装
Reading package lists... Done
Building dependency tree
linux@ubuntu:~$ sudo apt-get update #下载更新软件包列表
linux@ubuntu:~$ sudo apt-get install openssh-server #安装
Reading package lists... Done
Building dependency tree
linux@ubuntu:~$ sudo apt-get remove openssh-server #卸载 shell编程
1.什么shell编程:
一堆shell命令集合
2.shell执行过程

1.创建一个.sh文件
linux@ubuntu:~/23072/LinuxC/day3$ touch 1.sh #1.创建.sh文件 2. 修改文件的权限 linux@ubuntu:~/23072/LinuxC/day3$ chmod +x 1.sh #2.修改文件的权限
linux@ubuntu:~/23072/LinuxC/day3$ ls -l
total 0
-rwxrwxr-x 1 linux linux 0 7月 31 19:01 1.sh 3. 执行 linux@ubuntu:~/23072/LinuxC/day3$ ./1.sh 3.注释
4.变量
1.用户自定义变量
1.命名规范:
.
由数字 , 字母 , 下划线组成,首字母不能为数字 . 不能为关键字和保留字 . 尽量见名知意,尽量大写2.访问shell变量

2.位置参数即命令行参数
由系统提供的参数为位置参数

3.预定义变量
$# 包含命令行参数的个数 $@ 包含所有命令行参数 :"$1 $2 ...$9" $* 包含所有命令行参数 :"$1,$2.....$9" linux@ubuntu:~/23072/LinuxC/day3 $ ./1.sh $$: 包含正在执行进程的 ID 号 $? 包含前一个命令退出的状态4.环境变量
5.shell程序和语句
1.说明性语句
#!/bin/bash
2.功能性语句
算术运算命令 expr
test命令
1. 测试字符串 s1 = s2 测试两个字符串的内容是否完全一样 s1!= s2 测试两个字符串的内容是否有差异 -z s1 测试 s1 字符串的长度是否为 0 -n s1 测试 s1 字符串的长度是否不为 0 2. 测试整数 a -eq b 测试 a 与 b 相等 (equal) a -ne b 测试 a 与 b 不相等 a -gt b 测试 a 是否大于 b (great) a -ge b 测试 a 是否大于等于 b a -lt b 测试 a 是否小于 b a -le b 测试 a 是否小于等于 b 3. 文件属性 -d name 测试 name 是否为一个目录 -f name 测试 name 是否为普通文件 -L name 测试 name 是否为符号链接 -r name 测试 name 是否存在且可读 -w name 测试 name 是否存在且可写 -x name 测试 name 是否存在且为可执行 -s name 测试 name 是否存在 , 且长度不为 0 f1 -nt f2 测试文件 f1 是否比文件 f2 更新 f1 -ot f2 测试文件 f1 是否比文件 f2 更旧3.结构性语句
1.顺序
1.read 输入
read -p " 请输入一个整数 " NUM12.echo 输出
echo "NUM1= $NUM " # 默认换行 echo -n "NUM1= $NUM " # 表示不换行2.选择
1.单分支
if [ 条件为真 ] then 语句 fi
2.双分支
if [ 条件为真 ] then 语句 1 else 语句 2 fi
3.多分支
if [ 条件 1 为真 ] then 语句 1 elif [ 条件 2 为真 ] then 语句 2 elif [ 条件 3 为真 ] then 语句 3 ..... else 语句 n + 1 fi
3.循环
1.for
.
带列表的for
#!/bin/bashfor I in 12 15 12.5 "helloworld" 'hello'
doecho $I
done
#!/bin/bashfor I in {1..10..2}
do echo $I
done . 不带列表的 for #!/bin/bashfor I
do echo $I
done . 类似于 C 的 for #!/bin/bashfor(I=1;I<=10;I++)
doecho $I
done 2.while
while [ 条件为真 ] do 语句 done 3.break : 跳出循環 4.continue: 结束本次循环,继续下一次循环函数
1.函数的定义
1.方式一
函数名 () { 函数体 }2.方式二
function 函数名 () { 函数体 }2.函数的调用
方式一
value_name = `function_name arg1 arg2` 变量名 = ` 函数名 参数 1 参数 2` 函数的所有标准输出都传递给了主程序的变量方式二
function_name arg1 arg2 函数名 参数 1 参数 2 echo $? #$? 上一个命令退出的状态#!/bin/bash
#遍历$HOME下file-dir dir-dir
for dir in $HOME/file-dir $HOME/dir-dir
do
if [ -d $dir ] #判断该文件夹是否存在
then #文件夹存在
read -p "是否删除该目录" op
case $op in
Y|y|yes|Yes)
rm -r $dir
mkdir $dir
;;
N|n|NO|no|No)
exit
;;
esac
else #文件不存在
mkdir $dir
fi
done
fileCount=0
dirCount=0
read -p "请输入路径名
" dirname
flist=`ls $dirname` #显示文件夹中的文件和目录
#遍历该文件夹中的内容
for file in $flist
do
if [ -d $dirname/$file ] #尽量使用绝对路径,否则只能复制当前路径下
then
cp -r $dirname/$file $HOME/dir-dir #复制文件夹
dirCount=`expr $dirCount + 1`
elif [ -f $dirname/$file ]
then
cp $dirname/$file $HOME/file-dir #复制文件
fileCount=`expr $fileCount + 1`
fi
done
echo "文件的个数为$fileCount"
echo "目录的个数为$dirCount" 结构体
1.如何创建结构体数据类型
#include
#define N 20
#define M 3
//定义一个学生的数据类型
struct student
{
char name[N];
int height;
float scores[M];
};
//定义一个学生的数据类型: struct student
//给结构体数据类型取了别名
typedef struct student Stu; //给struct student 取了个别名叫Stu
//该句话是前两句话的简化
typedef struct student
{
char name[N];
int height;
float scores[M];
}Stu; 2.如何创建结构体变量

#include
//定义一个学生的结构体数据类型
struct student
{
char name[20];
int height;
float scores[3];
};
//定义一个结构体数据类型,该名字叫struct student
int main(void)
{
//类型名 变量名;
//定义一个结构体变量并进行初始化
struct student s1={"lisi",183,{90,89,78}};
return 0;
} 3.如何访问变量的值

#include
//定义一个学生的结构体数据类型
#define N 20
#define M 3
struct student
{
char name[N];
int height;
float scores[M];
};
//定义一个结构体数据类型,该名字叫struct student
int main(void)
{
//类型名 变量名;
//定义一个结构体变量并进行初始化
struct student s1={"lisi",183,{90,89,78}};
int i=0;
//输入
printf("请输入姓名,身高,三门成绩\n");
scanf("%s%d",s1.name,&s1.height);
for(i=0;i 4.如何操作结构体的指针
// 定义一个指向 int 的指针 int * pi = NULL ; //sizeof(pi)=8 pi+1 sizeof(int) // 定义一个指向结构体 (struct student) 的指针 struct student * ps = NULL ; //sizeof(ps)=8 ps+1 (struct student)
#include
//定义一个学生的结构体数据类型
#define N 20
#define M 3
struct student
{
char name[N];
int height;
float scores[M];
};
//定义一个结构体数据类型,该名字叫struct student
int main(void)
{
//类型名 变量名;
//定义一个结构体变量并进行初始化
struct student s1={"lisi",183,{90,89,78}};
//定义一个指向int的指针
//int * pi=NULL; pi=&i; i<===>*pi
//定义一个指向结构体的指针
struct student * ps=NULL;
ps=&s1; //ps指向s1 s1<===>*ps
//结构体指针访问 指针名->成员名
int i=0;
printf("请输入姓名,身高,三门成绩\n");
scanf("%s",ps->name);
scanf("%d",&ps->height);
for(i=0;iscores[i]);
}
printf("%10s",ps->name);
printf("%5d",ps->height);
for(i=0;iscores[i]);
}
printf("\n");
//通过ps访问
/*printf("s1 name=%s height=%d ",(*ps).name,(*ps).height);
for(i=0;i 在堆区分配空间和释放空间
1.分配空间
#include
//参数:你要分配空间的大小
//返回值:void * void (表示空) void * (任何数据类型的地址)
//分配成功返回空间的首地址,失败则返回NULL
//malloc分配的空间未进行清空
void *malloc(size_t size); 2.释放空间
#include
//参数1:释放空间的首地址
void free(void *ptr); #include
#include //malloc的头文件
int main(void)
{
//int * pi=NULL; //栈区
//pi=(int *)malloc(4); //堆区,分配4个字节的空间
//pi=(int *)malloc(sizeof(int)); //堆区,分配4个字节的空间
//1.分配空间
int * pi=(int *)malloc(sizeof(int));
//2.出错判断
if(NULL==pi)
{
perror("malloc error:"); //标准出错,会将错误原因显示出来
return -1; //-1:一般表示异常结束
}
printf("请输入一个整数\n");
scanf("%d",pi);
//*pi=5;
printf("%d\n",*pi);
//3.释放空间
free(pi);
pi=NULL;
return 0;
} 结构体和堆区空间关联起来
自定义头文件
1.自定义头文件的要求.h

2.如何引入自定义头文件
#include "stu.h"

3.“” 和<>的区别
“” 和 <> 的区别 “” : 编译器从用户的工作路径开始搜索头文件 <> : 编译器从标准库路径开始搜索头文件4.条件编译
1.作用:避免头文件被重复引入
2.语法
//stu.c
#ifndef _STU_H
#define _STU_H
//.引入库头文件
//.宏定义
//.结构体类型的定义
//.枚举类型的定义
//.函数声明
//.引入库头文件
#include
//.宏定义
#define N 20
#define M 3
#define SIZE 5
//.结构体类型的定义
//该句话是前两句话的简化
typedef struct student
{
char name[N];
int height;
float scores[M];
}Stu;
//.枚举类型的定义
//.函数声明
void output(Stu * ps,int n);
void menu(void);
void input(Stu * ps,int n);
Stu *calpmaxheight(Stu *ps,int n);
void sortHeight(Stu * ps,int n);
#endif
gcc工作原理
1.分阶段执行
1.预处理
gcc -E main.c -o main.i
2.编译
gcc -S main.i -o main.s
3.汇编
gcc -c main.s -o main.o
4.链接:
在连接阶段将输入的机器代码文件 *.o (与其它的机器代码文件和库文件)汇集成一个可执行的二进制代码文件2.将四阶段合为一步
gcc stu.c -o stu
Make工程管理器
1.make工作原理
2.Makefile



3.Makefile中假目标
1.执行假目标

2.假目标出现的问题

3.如何解决和假目标同名的问题

4.Makefile变量
1.自动变量
.$@
目标文件 .$^ 所有的依赖文件 .$< 第一个依赖文件2.预定义变量
Makefile 预定义变量包含了常见编译器 , 汇编器的名称及其编译选项.CC C
编译器的名称 , 默认为 cc .CFLAGS C 编译的选项 , 无默认值 .RM 文件删除程序的名称 , 默认值为 rm -f3.自定义变量
5.Makefile中变量的展开方式
1.递归展示方式
2.简单展开方式
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
