c高级篇。

嵌入式Linux操作系统

1.什么是操作系统
        操作系统是管理和控制计算机硬件与软件资源的计算机程序 , 它是直接运行在 裸机 上的最基本的系统软件, 任何其他软件都必须在操作系统的支持下才能运行。
2.操作系统的分类
1. 批处理操作系统 2. 分时操作系统 3. 实时操作系统 4. 嵌入式操作系统 5. 个人计算机操作系统 6. 网络操作系统 7. 分布式操作系统
3.嵌入式操作系统
1.什么是嵌入式操作系统
嵌入式系统是 * * 以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于对功能、可靠 性、成本、体积、功耗有严格要求的专用计算机系统。
 2.嵌入式系统应用领域

.工业控制
机械手臂、集装箱起重机、工业机器人、电机驱动器、智能测量仪、智能控制器、智能数控机床等
二、智能家居领域
智能扫地机器人、空调、冰箱、洗衣机、投影仪、智能门锁、智能门禁、可视对讲门铃、微波炉、电视 机、遥控器、水电表、扫地机器人等
三、安防领域
人脸识别、监控设备、指纹识别、视网膜识别等
四、汽车电子领域
行车记录仪、自动驾驶系统、车辆导航系统等
五、交通物流领域
蜂巢快递柜、共享单车、智能分拣等
六、健康医疗领域
生化分析仪、血液分析仪、 CT 等各类智能检测仪器、智能血压计、智能手环等
七、通信领域
机顶盒、路由器、通信基站设备、交换机等
八、金融领域
刷卡机、智能 ATM 终端等
九、消费电子领域
手机、平板电脑、可穿戴设备、游戏机、数码相机、广告机、遥控玩具、音频视频播放器、自动售货机
十、军事航空领域
卫星系统、无线传输系统、定位系统、无人机、雷达系统、火炮、导弹和智能炸弹制导引爆等控制装 置、各种智能坦克、舰艇、轰炸机等
3.嵌入式系统分类

Linux μ C/OS windows CE Vxworks QNX
4.嵌入式Linux
1.Linux历史
2.Linux版本

3.Linux:Ubuntu ( 乌班图 ) www.ubuntu.com

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:动态显示系统中运行的程序 (一般为每隔几秒刷新一次)

 

kill 输出特定的信号给指定 PID( 进程号 ) 的进程

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 替换正文中所有出现的 str1
2.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.lessmore的增强版

按空格 (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 [ 路径 ] [ 选项 ] [ 描述 ] 当前路径 -name

3.压缩打包命令

1.压缩

1.gzip

2.bzip2
2.tar: 对文件目录进行打包和解包

-c , --create   # create a new archive ( 创建包文件 ) -f                  # 指名包文件名 -x                  # 解包 -v                 # 显示打包的过程 -z                  # 自动调用 gzip,gunzip -j                   # 自动调用 bzip2

 1.先打包生成mynew.tar

2. 再进行压缩 gzip

 

3. 先解压

 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.gz

4.文件比较命令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 " 请输入一个整数 " NUM1
2.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 -f

3.自定义变量

5.Makefile中变量的展开方式

1.递归展示方式

2.简单展开方式


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章