嵌入式学习【第三周】

day1

1、 结构体

1.1 概念

一类相关事物属性的集合,是一种自定义的数据类型

1.2 定义

struct 结构体名
{
属性1;
属性2;

属性n;
};
描述一个人的姓名、年龄
struct people
{
char name[20];//姓名
int age;//年龄
};
定义了一个结构体,结构体的数据类型为(struct people)struct 结构体名

1.3 初始化

int a =10;//初始化 数据类型 变量名 = 初值;
int a;
a = 10;//赋值

数据类型 变量名 = {…};
struct people pe = {“zhangsan”,18};

1.4 访问

(1)通过结构体变量来访问

结构体变量.成员

(2)通过结构体指针来访问

指针变量名->成员
整型指针:指向整型的指针
数组指针:指向数组的指针
结构体指针:指向结构体的指针

数据类型 *指针变量名;
struct people * p = NULL; sizeof§ = 4byte

1.5 字节对齐

一次性分配多少个字节
自然对齐方式(32OS):
int:4字节对齐
short:2字节对齐
float:4字节对齐
double:占8个字节,分配的时候还是按4字节分配,分配两次
char:1字节对齐
选成员中最大的那个对齐
节省结构体空间的办法:
(1)将数据类型大的放到最前面
(2)位域/位段

1.6 结构体的嵌套

在这里插入图片描述

1.7 给结构体取别名

方式1:
在这里插入图片描述
方式2:
在这里插入图片描述

1.8 结构体数组

概念:元素为结构体的数组
数据类型 数组名[元素个数];
Stu stu[3];

day2

1、malloc函数

头文件:#include <stdlib.h>

void *malloc(size_t size); //void *:任意类型的指针
函数功能:申请空间
参数:要申请的空间的大小
返回值:成功返回申请到的空间的首地址,失败返回NULL
注意:(1)malloc申请到的空间是没有名字的
(2)malloc申请到的是一片连续的内存空间

void free(void *ptr);
函数功能:释放空间
参数:申请到的空间的首地址

//描述一个学生的姓名、年龄、三门成绩
#define N 20
#define M 3
#define SIZE 3
typedef struct student
{
char name[N];//姓名
int age;//年龄
float scores[M];//三门成绩
}Stu;
用malloc申请SIZE个Stu这么大的空间

2、memset

头文件:#include <string.h>

void *memset(void *s, int c, size_t n);
函数功能:重置内存空间
参数1:要重置的内存空间的首地址
参数2:要重置的值
参数3:要重置的内存空间的大小

3、自定义头文件

.h文件
在这里插入图片描述

“” :编译器从用户的工作路径搜索头文件
<> :编译器从标准库路径(/usr/include)搜索头文件

4、文件编译

作用:防止头文件重复定义
#ifndef 文件名(将文件名大写,所有的.换成_)
#define 文件名
在这里插入图片描述

#endif

day3

1、gcc工作原理

gcc的编译流程:预处理(处理以#开头的文件)、编译(生成了汇编语言)、汇编)(将汇编语言转成机器代码)、链接(与其它机器代码整合,生成可执行的二进制代码)
方法1:
预处理:gcc -E main.c -o main.i
编译:gcc -S main.i -o main.s
汇编:gcc -c main.s -o main.o
链接:gcc main.o -o main
方法2:
将gcc的前四步合四为一:gcc main.c -o main

2、多文件编译(解决单独编译出错的问题)

2.1 将gcc的前三步合3为1

gcc -c stu.c -o stu.o
gcc -c io.c -o io.o
gcc -c sort.c -o sort.o
gcc -c sumScores.c -o sumScores.o
gcc -c swap.c -o swap.o
gcc -c calPmaxAge.c -o calPmaxAge.o

2.2 将所有的.o文件链接生成可执行文件

gcc stu.o io.o sort.o sumScores.o swap.o calPmaxAge.o -o stu

3、make工程管理

make命令会在当前路径下找一个叫做Makefile(M大写或小写都可以)的文件

3.1 Makefile命名规范

目标文件1:依赖文件1
(Tab键)依赖文件1如何生成目标文件1
目标文件2:依赖文件2
(Tab键)依赖文件2如何生成目标文件2

注意:
(1)如果两个目标之间没有联系,默认执行目标文件1
(2)一个Makefile中可以有多个目标
(3)调用make命令时,必须指定要执行的目标,如果没有指定目标,默认执行目标文件1
注意:make之后会在构建yyds之前,先构建test

3.2 解决假目标

在clean前面加上.PHONY
注意: .PHONY必须使大写
在这里插入图片描述

3.3 预定义变量

CC:C编译器的名称,默认为CC
CFLAGS:c编译器的选项,无默认值
RM:程序删除的名称,默认为rm -rf

3.4 自定义变量

OBJ:用于存放可执行文件的名称
OBJS:所有的目标文件

3.5 自动变量

$@:表示目标文件
$^:表示所有的依赖文件
$<:表示第一个依赖文件

3.6 变量定义的方式

3.6.1 递归方式 VAR=var

在这里插入图片描述
注意:后面的值会影响前面的结果

3.7 嵌套Makefile

bin(可执行文件)、include(.h文件)、src(.c文件)、obj(.o文件)
(1)编写总控Makefile、书写自定义变量和预定义变量
(2)编写src中的Makefile,将所有的.c文件生成.o文件,并将所有的.o文件移动到obj目录中
(4)编写obj中的Makefile,将所有的.o文件编译生成可执行文件,并将可执行文件移动到bin目录中
(5)先执行src中的Makefile(make -C src),再执行obj中的Makefile(make -C obj)

4、枚举

作用:使程序变得更加语义化
在这里插入图片描述

5、共用体+大小端

特点:所有成员共用同一块首地址(大小有成员中最大的那个决定)
在这里插入图片描述
判断是大端序还是小端序
在这里插入图片描述

day4

1、递归

给计算机制定规则,自己调用自己
5!
54! return 5 * 24
4
3! return 4 * 6
32! return 3 * 2
2
1! return 2 * 1
1! return 1

2、函数指针

定义一个指向int的指针:int *
定义一个指向char的指针:char *
定义一个指向数组的指针:int (*p)[3];
定义一个指向结构体的指针
struct student
{
char name[20];
int age;
};
struct student *ps = NULL;
定义一个指向函数的指针:
int add(int m,int n); //数据类型 int (int,int)
int (p)(int,int) = NULL;//数据类型 int ()(int,int)

3、指针函数

返回值为指针的函数

4、Linux的发展史

在这里插入图片描述

5、shell

作用:负责用户和内核之间的交互

shell命令、shell、shell脚本的本质区别

shell命令:用户向系统内核发出的控制请求
shell:将用户命令解析为操作系统能识别的指令,实现用户与操作系统之间的交互
shell脚本:一堆命令的集合

5.1 shell的类型

Bourne Shell: 最早的Shell
C Shell
Ksh
Z Shell
Bourne-again shell(bash)

5.2 shell命令

命令 [选项] [参数]
注意:[]表示可以省略
选项:功能
参数:要操作的对象
注意:
(1)一条命令的三要素之间要用空格隔开
(2)若将多个命令书写在一行,用;将命令隔开
(3)如果一条命令不能在一行写完,用反斜杠()表明该命令未结束

5.3 用户系统相关命令

1、用户切换命令

su - 用户名
注意:用户的工作路径以及环境变量都会发生改变
注意:
(1)工作路径及其环境变量都未发生改变
(2)一般情况下不要切换成root用户,要使用root用户在最前面添加sudo

2、系统管理命令

ps:显示当前系统中该用户运行的进程列表
ps -ef:查看所有进程及其(PID)进程号
ps -aux:除了-ef显示的内容外,还会显示cpu的内存占用率、进程状态

top:动态显示系统中运行的程序

kill:发送信号给指定的进程
kill -l:列出所有可用的信号名称

3、磁盘相关命令

free:查看当前系统内存的使用情况
df:查看文件系统的磁盘占用情况
du:统计目录或文件所占磁盘空间的大小

fdisk -l:列出文件系统的分区情况
注意:必须使用root权限

4、文件、目录相关命令

Linux下有7中文件类型:
-:普通文件
d:目录文件
b:块设备文件
c:字符设备文件
p:管道文件
l:链接文件
s:套接字文件(socket文件)

4.1 chmod

作用:改变文件的访问权限
-rw-rw-r-- 1 linux linux 399 12月 1 18:24 fun_p.c
注意:第一个字母:表示文件类型
rw- rw- r–
文件拥有者 用户所在组 其他人
修改文件权限的方式:
方式1:
u:文件拥有者
g:所属的用户组
o:其他人
a:所有人

+:表示增加权限
-:删除权限
=:设置权限
方法2:

注意:有权限用1表示,-表示没有权限,用0表示
rw- rw- r–
文件拥有者 用户所在组 其他人
110 110 100
6 6 4

4.2 chown

作用:修改文件所有者和组别
注意:必须使用root权限
修改文件所属用户:

4.3 chgrp

作用:修改文件所属组

4.4 grep

作用:在指定的文件中搜索特定的内容
grep 字符串 文件
-n :显示行号

4.5 查看文档

cat :适合看比较短的文档
more:适合看比较长的文档(按回车向下翻一行,空格向下翻一页,q退出)
less:加强版的more(回车向下翻一行,空格向下翻一页,支持上下箭头,q退出)

4.6 find

作用:在指定目录中搜索文件(若省略路径,默认为当前目录)
find -name 文件名

4.7 alias

作用:起别名(一次性的),想要永久生效的话添加到.bashrc文件中

5、特殊符号

` `:当作命令来处理
|:管道(一般不单独使用),将前一个命令的输出作为后一个命令的输入
通配符:
*:匹配任意长度的字符串(任意个字符)
?:匹配一个长度的字符(任意一个字符)
[]:匹配其中指定的一个字符
[-]:匹配指定一个字符范围
[^…]除了其中指定的字符,均可匹配
> :输出重定向,如果文件不存在则新建,如果文件存在覆盖文件中内容
>>:追加重定向,如果文件不存在则新建,如果文件存在则追加在文件的末尾
wc -c :统计有多少个字符
wc -l :统计有多少行

< file:输入重定向,将file文件重定向为输入源
2>&> :将产生的错误信息输出到文件中

6、硬链接和软链接

硬链接:利用Linux中为每个文件分配的物理编号,建立链接
创建硬链接:
在这里插入图片描述
软链接(符号链接):利用文件的路径名来建立链接
创建软链接:
在这里插入图片描述
区别:
硬链接会在用户选定的位置上生成一个和源文件大小相同的文件
软链接会在用户选定的位置上生成一个镜像文件,不会重复占用磁盘空间(平时使用最多的就是软链接)
相同点:
ln命令会保持每一处链接文件的同步性,不论改动了哪一处,其它的文件也会发生相同的变化

5.4 用户管理命令

相关配置文件
1、/etc/passwd 系统能够识别的用户清单
2、/etc/shadow 加密的用户清单
3、/etc/group 组的名称和组中的成员列表

1、创建用户

sudo adduser 用户名

2、删除用户:

sudo deluser --remove-home 用户名
注意:删除的时候连同用户的主目录一起删除

3、修改用户密码

sudo passwd 用户名

4、创建组

sudo groupadd 组名

5、修改用户所属组

sudo usermod -g 目标组 要修改的用户

6、删除组

sudo groupdel 组名

day5

1、压缩打包相关命令

压缩工具:gzip(后缀为.gz)、bzip2(后缀为.bz2)
注意:只能压缩文件

压缩:
gzip 文件名;//后缀为.gz
bzip2 文件名; //后缀为.bz2

解压:
方式1:
-d:将压缩文件解压
gzip -d 文件名;
bzip2 -d 文件名;
方式2:
gunzip 文件名;
bunzip2 文件名;

tar 打包(后缀为.tar)
相关参数:
-c:打包
-x:解包
-v:显示相关信息
-f: 指定包文件名(必须放在最后一个)
-z:调用gzip/gunzip
-j:调用bzip2/bunzip2
先打包,再压缩
先解压,再解包

2、Linux环境变量

env:查看所有的环境变量

2.1 临时添加

在这里插入图片描述
注意:只对当前终端有效,如果当前终端关闭,添加的环境变量就不存在了

2.2 永久添加

将环境变量添加到/etc/profile中,这样在任何时候都有效
(1)使用管理员权限打开/etc/profile
(2)在文件末尾添加:export PATH=$PATH:/home/linux/22111/linuxC/day5
(3)重启or source /etc/profile
重启:sudo reboot
关机:sudo shutdown -h now

3、Linux下共享文件设置

方法1:
虚拟机–>设置–>选项–>共享文件夹
在这里插入图片描述

4、Linux网络配置

4.1 测试是否有网

在这里插入图片描述

4.2 网络基础知识介绍

1、IP地址

ip地址:是主机的唯一表示
ip地址:网络地址+主机地址

ip地址根据网络地址的不同,主要分为A、B、C、D、E类
A类IP地址:
1个字节网络地址+3个字节主机地址(网络地址最高位必须是0)
地址范围:1.0.0.0 ~126.255.255.255
B类IP地址:
2个字节网络地址+2个字节主机地址(网络地址最高为必须是10)
地址范围:128.0.0.0 ~ 191.255.255.255
C类IP地址:
3个字节网络地址+1个字节主机地址(网络地址最高位必须是110)
地址范围:192.0.0.0 ~ 223.255.255.255

2、子网掩码

作用:判别主机发送的数据包是向外网发送还是向内网发送
网络地址全是1,主机地址全是0
3个字节网络地址+1个字节主机地址
1111 1111 1111 1111 1111 1111 0000 0000
255 255 255 0

192.168.0.1 192.168.0.118 192.168.3.100
& 255.255.255.0
192.168.0.0 192.168.0.0 192.168.3.0

3、网关
4、DNS服务器

解析器和域名服务器组成的
注意:域名必须对应一个IP地址,IP地址不一定有域名

5、Linux软件管理

换源:sudo /etc/apt/sources.list

下载软件:
sudo apt-get update
sudo apt-get install 包名;

卸载软件:
sudo apt remove 包名;

6、shell脚本

shell脚本:一堆命令的集合
C语言:强类型语言(对数据类型分的比较清楚)、编译性语言
shell脚本:弱类型语言,不需要编译,直接运行就可以了

6.1 如何创建设立了脚本

1、新建一个文件(后缀为.sh)
2、编辑该文件
vim 1.sh
3、运行的时候没有可执行权限,需要人为去添加
chmod 777 1.sh
4、运行
./1.sh

6.2 用户自定义变量

shell允许用户建立 变量存储类型
注意:任何赋给变量的值都被shell解释为一串字符

命名规范:
1、由数字、字母、下划线组成
2、首字母不能为数字
3、shell中的变量一般用大写表示
注意:
(1)要取用一个变量的值时,在变量名前加$
(2)在赋值时,等号的左右两侧不能有空格

6.3 位置参数

在这里插入图片描述

6.4 预定义变量

$#:包含命令行参数的个数
$@:包含所有命令行参数
$*:包含所有命令行参数
$?:包含前一个命令的退出状态,正常退出返回0,反之为非0(shell中0为真,非0为假)
$$:包含正在执行的进程的ID号

6.5 shell程序和语句

6.5.1 说明性语句
注释:#
6.5.2 功能性语句
1、输出
echo “hello shell”
echo -n “hello shell” //不换行
6.5.3 算术运算
expr主要用于进行简单的整数的算术运算、+、-、*、/、%
注意:expr与变量以及变量与运算符之间必须有空格

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值