1. Linux
1.1 Linux 概述和操作系统概述
Linux 是针对于嵌入式设备,物联网设备常用的操作系统。操作系统解决的问题是将硬件和用户之间的关系拉近,同时对于开发而言,可以更好的使用操作系统对硬件资源,任务,操作更为简单化。
Linux 是需要嵌入式开发工程师必须掌握的操作系统。嵌入式设备中首选的 Linux 操作系统是 Ubuntu,后续开发中可以基于 Ubuntu Linux 内核进行移植,增删,修改。
1.2 Linux 操作
主要分为
界面化操作,在一般的设备中,直接移除 Linux GUI 界面,将必要的界面资源释放提供给后续的代码执行,增强设备的性能。
终端命令操作,最常用的方式,需要熟悉 Linux 基本操作
1.3 Linux 常用命令
1.3.1 Linux 路径关系和目录结构【重点】
目录相关
Linux 中所有的目录结构,所有的文件都是通过【文件夹】进行管理,没有分区分盘概念。整个系统从【根目录】开始按照不同的功能模块,使用文件夹对整个系统所有资源内容进行区分管理。
从 Linux 目录结构中,逐步形成对于项目代码中分模块管理思维,方便后续的开发要求。
对于当前的 Linux 操作需要知晓的两个核心目录
根目录
家目录/用户目录,任何程序,任何配置,任何资源,在家目录中操作不会影响操作系统和其他用户。在 Linux 中对应的家目录真实路径/绝对路径
/home/username
,我的电脑真实家目路径/home/qf
路径相关初步了解
相对路径【使用较多】
在 Linux 中是以【根目录】开始的绝对路径。每一个文件或者文件夹的绝对路径【唯一】,例如
/home/qf, /etc/init.d/samba, /home/C_Code
绝对路径
绝对路径中需要知晓的两个概念
【工作目录】简单理解为当前操作所在的文件夹是哪一个文件夹,当前文件就是目前程序或者操作的【工作目录】,对于操作系统而言,工作目录的标记/简写
.
【工作目录的上级目录】当前工作目录父级目录,上级目录,对于操作系统而言,当前工作目录的上级目录的标记/简写
..
1.3.2 ls 查看命令
主要用于在终端中查看工作目录或者指定目录中文件和文件夹
案例说明
qf@qf:~$ ls # 当前工作目录为家目录,ls 查看当前家目录下的文件或者文件夹【名称】 examples.desktop 公共的 模板 视频 图片 文档 下载 音乐 桌面 # 使用 ls 命令行参数 -a a ==> all qf@qf:~$ ls -a # 查看当前工作目录下的所有文件和文件夹,包括隐藏文件,在 Linux 中,隐藏文件或者文件夹对 # 应的文件名称之前有 . 前缀 . .bashrc .dotnet .ICEauthority ........ # 使用 ls 命令行参数 -l l ==> list qf@qf:~$ ls -l # 文件或者文件夹详情列表方式查看当前工作目录下的文件和文件夹信息 # 包括【类型】,【权限】,【归属】,【最后修改时间】,【文件或者文件名称】 总用量 44 -rw-r--r-- 1 qf qf 8980 8月 26 17:14 examples.desktop drwxr-xr-x 2 qf qf 4096 8月 27 09:11 公共的 drwxr-xr-x 2 qf qf 4096 8月 27 09:11 模板 # 同时使用 ls 命令行参数 -a 和 -l, 参数形式为 -al qf@qf:~$ ls -al # ls 使用 -al 命令行参数,可以查看当前工作目录下所有文件和文件夹,包括隐藏文件和隐藏文件 # 夹,同时可以查看对应的列表详情信息。
补充说明 ls 列表详情模式信息内容
1.3.3 cd 切换工作目录
终端默认工作目录是【家目录】,但是开发中或者 Linux 操作需要进行其他目录使用,在终端中需要对工作目录位置进行调整,使用
cd change directory
命令完成cd 切换工作目录可以使用相对路径和绝对路径
# 操作案例,相对路径案例 qf@qf:~$ cd 桌面 # 当前工作目录为家目录,cd 桌面 是切换工作目录到家目录下的桌面文件夹中 qf@qf:~/桌面$ # 在 : 之后的路径已经发生改变,明确告知当前工作目录的地址。 qf@qf:~/桌面$ cd 1 # 切换工作目录到当前 桌面文件夹中 1 文件夹 qf@qf:~/桌面/1$ cd .. # .. 表示当前工作目录的上级目录 qf@qf:~/桌面$ # 操作案例,绝对路径 qf@qf:~$ cd /etc/python3 # 利用绝对路径切换到目标文件夹 qf@qf:/etc/python3$ # 当前 Linux 终端提示的路径信息完整 # 其他小技巧 qf@qf:/etc/python3$ cd # 在终端中任意工作目录下,都可以直接使用 cd 回到用户家目录 qf@qf:~$ cd - # 可以回到上一次工作目录,从哪来回哪去
1.3.4 mkdir 和 touch
mkdir 创建文件夹
touch 创建普通文件
# mkdir qf@qf:~/桌面/1$ mkdir a # 在当前工作目录中创建 a 文件夹 qf@qf:~/桌面/1$ mkdir b c d # 可以进行批量文件夹创建,要求每一个文件夹名称之间使用空格隔开 qf@qf:~/桌面/1$ mkdir a mkdir: 无法创建目录"a": 文件已存在 # 如果对应文件已存在,无法进行二次创建 # touch qf@qf:~/桌面/1$ touch 1.txt qf@qf:~/桌面/1$ touch 2.txt # 提供对应的文件名和后缀名可以创建文件 qf@qf:~/桌面/1$ touch 3.txt 4.txt 5.txt # 同样可以批量创建普通文件,需要提供对应的文件名和文件夹名 qf@qf:~/桌面/1$ touch 1.txt # 如果文件已存在,当前操作对源文件内容没有任何的影响,可以理解为仅更新了修改时间
1.3.5 mv, cp, rm
mv 移动文件或者文件夹
cp 复制文件或者文件夹
rm 删除文件或者文件夹【慎用】
# mv 操作 qf@qf:~/桌面/1$ mv 1.txt abc.txt # 将当前工作目录下的 1.txt 文件重命名为 abc.txt qf@qf:~/桌面/1$ mv 2.txt a # 将当前工作目录下的 2.txt 文件移动到当前工作目录下的 a 文件夹中 qf@qf:~/桌面/1$ mv 3.txt a/fff.txt # 将当前工作目录下的 3.txt 文件移动到当前工作目录下的 a 文件夹中,同时重命名为 fff.txt qf@qf:~/桌面/1$ mv b a # 将文件夹 b 移动到 a 文件夹中,要求 a b 文件夹都在当前的工作目录中存在 qf@qf:~/桌面/1$ mv a aaa # 将 a 文件夹重命名为 aaa 名称,要求 a 文件夹存在,在当前工作目录中 aaa 文件不存在 # cp 操作 qf@qf:~/桌面/1$ cp 4.txt dnf.txt # 复制当前工作目录 4.txt 文件,复制目标路径是当前工作目录,同时复制的目标文件名称为 # def.txt qf@qf:~/桌面/1$ cp dnf.txt aaa # 将当前工作目录 dnf.txt 文件复制到当前工作目录下的 aaa 文件夹中 qf@qf:~/桌面/1$ cp dnf.txt c/lol.txt # 将当前工作目录 dnf.txt 文件复制到当前工作目录下的 c 文件夹中,同时目标文件名称为 # lol.txt qf@qf:~/桌面/1$ cp c ccc cp: -r not specified; omitting directory 'c' # 错误提示 qf@qf:~/桌面/1$ # 当前 c 是一个文件夹,cp 命令操作需要 -r 参数 qf@qf:~/桌面/1$ cp -r c ccc # 正确效果 # rm 操作【慎用】 # rm 删除文件或者文件夹不是放入回收站,是直接在磁盘中抹掉数据. qf@qf:~/桌面/1$ rm 4.txt # 删除指定文件,需要提供完整的文件名和后缀名 qf@qf:~/桌面/1$ rm *.c qf@qf:~/桌面/1$ rm *.cpp qf@qf:~/桌面/1$ rm *.txt # 利用 * 号通配符删除对应类型的文件 qf@qf:~/桌面/1$ rm 1.* qf@qf:~/桌面/1$ rm 2.* qf@qf:~/桌面/1$ rm 3.* # 利用 * 号通配符删除限制文件名称,不限制文件类型的所有文件 qf@qf:~/桌面/1$ rm *.* # 删除当前工作目录下的所有文件,但是要求文件必须有文件名和后缀名,如果没有后缀名的文件 # 无法通过 rm *.* 删除 qf@qf:~/桌面/1$ rm c # rm: 无法删除'c': 是一个目录 # c 是一个文件夹,无法直接删除,需要提供 -rf 命令 qf@qf:~/桌面/1$ rm -rf c # 删除文件夹 qf@qf:~/桌面/1$ rm -rf * # 删除当前工作目录下的所有文件和文件夹,但是不包括隐藏文件和隐藏文件夹 # 隐藏文件和隐藏文件夹 需要通过指定名称删除.
1.3.6 补充小命令
ip addr
: 查看当前计算机网络情况,可以获取到 ip 地址,在 Ubuntu 18.04 以上版本支持,在 Ubuntu 16.04 获取其他 Linux 系统中,常用的网络情况获取命令是ipconfig
, 玉龙补充ip -c a
更好看!---迟到的吉来表示不服!
ping
: 可以测试当前计算机到目标 IP ,域名的网络连接情况
pwd
:查看当前工作目录的绝对路径
clear
orCtrl + L
: 清理整个终端屏幕,---迟到的吉来表示咱们也被 Clean 了!
↑ ↓
:方向键上下,可以用于回顾命令
tab
: 可以进行补齐命令,文件名,文件夹名称,后续代码中,尽量保证代码名称唯一。
1.3.7 chmod 修改权限
修改目标文件或者文件夹的权限内容
权限标记 | 权限内容 | 权限数值 |
---|---|---|
r | 可读 | 4 |
w | 可写 | 2 |
x | 可执行 | 1 |
- | 无此权限 | 0 |
案例分析
-rwxr-xr-x # 当前对应的是一个普通文件 # 拥有者: rwx 可读可写可执行,对应数值 4 + 2 + 1 = 7 # 同组用户: r-x 可读不可写可执行,对应数值 4 + 0 + 1 = 5 # 访客: r-x 可读不可写可执行,对应数值 4 + 0 + 1 = 5 # 当前权限为 755 权限
chmod
可以利用数值描述权限方式对文件或者文件夹进行权限修改,同时需要使用sudo
命令支持。
sudo
命令是开启超极管理员权限,也可以认为是root
权限,开启需要提供当前用户名对应的密码。
qf@qf:~/桌面/1$ ls -l 总用量 0 -rw-rw-r-- 1 qf qf 0 9月 20 16:06 1.txt qf@qf:~/桌面/1$ # 664 权限 qf@qf:~/桌面/1$ # 修改为 775 权限 rwxrwxr-x qf@qf:~/桌面/1$ sudo chmod 775 1.txt [sudo] qf 的密码: # 提供当前用户对应的密码。Linux 不会有任何的密码提示和占位 qf@qf:~/桌面/1$ ls -l 总用量 0 -rwxrwxr-x 1 qf qf 0 9月 20 16:06 1.txt qf@qf:~/桌面/1$ # 修改为 664 权限 rw-rw-r-- qf@qf:~/桌面/1$ chmod 664 1.txt qf@qf:~/桌面/1$ ls -l 总用量 0 -rw-rw-r-- 1 qf qf 0 9月 20 16:06 1.txt
2. C 语言第一行代码
2.1 Hello World
Ubuntu 记事本完成第一个 C 语言代码
qf@qf:~/桌面/Code/02-C/Day01$ touch 01-hello.c qf@qf:~/桌面/Code/02-C/Day01$ ls 01-hello.c qf@qf:~/桌面/Code/02-C/Day01$ gedit 01-hello.c # gedit 利用 Ubuntu 记事本打开目标文件
/* C 语言头文件,stdio.h 是 C 语言标准 IO 头文件也是一个基础头文件。 --迟到的吉来表示要当 ETC */ #include <stdio.h> /* argc, argv当前函数的参数,在 C 语言中不可以省略!!! argc argument count 参数个数 argv argument value 参数值 */ int main(int argc, const char * argv[]) { /* printf 是在控制台/终端中打印内容 */ printf("Hello World!\n"); return 0; }
2.2 编译执行 C 语言代码
C 语言是一个高级语言,编程语言无法直接让 CPU 执行。需要通过编译操作将可视化的文本代码文件,编译成对应的可执行二进制文件,同时编译器会根据当前计算机对应的 CPU 和操作系统环境,编译得到不同的结果。
C语言编译结果可以直接交给 CPU 执行,C 语言支持裸机程序。
编译使用工具
GCC 工具
qf@qf:work_directory$ gcc C语言文件.c # 编译之后如果没有任何的文件,默认可以到的一个 a.out 可执行文件.
执行操作方式
qf@qf:work_directory$ ./a.out # 执行二进制文件,运行当前程序
整体流程
qf@qf:~/桌面/Code/02-C/Day01$ ls -l 总用量 4 -rw-rw-r-- 1 qf qf 428 9月 20 16:26 01-hello.c qf@qf:~/桌面/Code/02-C/Day01$ gcc 01-hello.c # 编译 01-hello.c C 语言源文件 qf@qf:~/桌面/Code/02-C/Day01$ ls -l 总用量 16 -rw-rw-r-- 1 qf qf 428 9月 20 16:26 01-hello.c -rwxrwxr-x 1 qf qf 8304 9月 20 16:37 a.out # 编译得到的 a.out 可执行二进制文件 qf@qf:~/桌面/Code/02-C/Day01$ ^C qf@qf:~/桌面/Code/02-C/Day01$ ./a.out # 执行文件,得到运行结果 Hello World! # 程序运行结果