https://www.runoob.com/linux/linux-comm-ls.html
https://www.bilibili.com/video/BV1w4411B7a4?p=19&spm_id_from=pageDriver&vd_source=e7d12c9f66ab8294c87125a95510dac9
1
eMMC
eMMC(embedded MultiMediaCard)是一种集成电路,用于嵌入式设备中的内存存储。它是一种闪存技术,使用NAND闪存芯片,具有高速度和可靠性。eMMC通常用于手机,平板电脑,摄像机等嵌入式设备中,可以存储操作系统,应用程序,音频和视频文件等数据。
SD卡
SD卡(Secure Digital Memory Card)是一种可移动存储介质,使用闪存技术,通常用于相机,智能手机,平板电脑等设备中。SD卡有不同的容量和速度等级。它们可以存储照片,视频,音频,文档等数据。SD卡具有可擦除和可重写的特性,因此可以反复使用。
TF卡
TF卡(TransFlash Card)是一种小型储存卡,也被称为微SD卡。TF卡与SD卡类似,但更小,通常用于移动设备,如手机,MP3播放器等。TF卡容量和速度等级可以根据需求进行选择。TF卡可以存储照片,视频,音频,文档等数据。
USB
USB(Universal Serial Bus)是一种用于连接计算机和其他设备的通用接口标准。USB可以连接各种设备,如打印机,键盘,鼠标,外部硬盘驱动器,闪存驱动器等。USB闪存驱动器是一种便携式存储设备,可以存储数据,如文档,照片,视频等。USB闪存驱动器具有可擦除和可重写的特性,因此可以反复使用。USB 3.0接口速度更快,可以提高数据传输速度,同时向下兼容USB 2.0和USB 1.1接口。
USB闪存驱动器是一种方便的存储设备,因为它们非常小,可以轻松地放入口袋或钥匙链。它们也可以存储大量数据,容量范围从几GB到几TB不等。 USB闪存驱动器通常不需要电源,因为它们从计算机的USB端口获取电力。
sd卡和tf卡
https://baijiahao.baidu.com/s?id=1728073347207167716&wfr=spider&for=pc
为什么电脑接上usb数据线后会自动安装相关驱动,需要电脑连接网络吗
电脑接上USB数据线后会自动安装相关驱动是因为电脑需要识别并与连接的设备进行通信,以便能够使用设备。驱动程序是一些软件,它们告诉电脑如何与设备进行通信。因此,电脑需要安装适当的驱动程序才能正确地识别和使用连接的设备。
通常情况下,驱动程序已经预先安装在操作系统中。如果操作系统中没有该驱动程序,则电脑会自动从互联网上下载并安装所需的驱动程序。因此,连接网络是有助于电脑自动下载并安装驱动程序的。但是,如果已经有所需的驱动程序,电脑也可以通过读取本地存储设备上的驱动程序进行安装。
ubuntu和windos的简单比较和使用
dirls
ctrl+alt+T
windows 是各种盘符
ubuntu下是各种文件,没有盘符的概念
挂载在哪个分区
shell
取环境变量path中寻找程序
gcc -o hello hello.c
./hello
./hello weidongshan
设置环境变量
1 把文件复制到目录里
2sudo cp hello /usr/local/bin/hello2
临时
export PATH=$PATH:/HOME/BOOK永久
1 修改
sudo gedit /etc/environment
在path中添加内容, :/xxx/xxx”
2
修改 ~/.bashrc,在最后添加
export PATH=$PATH:/HOME/BOOK
目录和文件操作命令
pwd
./绝对路径 从根目录开始指定位置
cd ..家目录
cd ~
cd -
cd /mkdir 123
cd 123
echo abc > 1.txt
cd ..
rmdir 123rm 123 -rf 递归 强制 删除ls -l
文件拷贝
文件名中有空格会用单引号表示
cp 111.txt 222.txt
mv 222.txt ../
mv ../2.txt .cat 2.txt 显示文件内容touch xx。txt 修改文件时间 但不修改内容
文件权限和属性
ls -l hello
d 表示目录
- 表示常规文件拥有者的权限
同组其他用户的权限
其他用户 r-x 可读可执行read write x执行
chmod 777 hello
chmod -x hello
chmod +x hello 添加权限
chmod -R 以递归方式
ls -ld bin 查看目录信息修改文件用户
chown [-R] 账户名:组名 文件或目录
find 和 grep
find
grep 查找文件中符合字符串的内容
nw整词查找, 整个单词
r递归
压缩和解压缩
tar xjf
tar xzf
tar cjf abc.tar.bz2 abc
tar czf abc.tat.gz abc
网络
添加nat网卡
vi编辑器
gedit
https://www.runoob.com/linux/linux-vim.html
:set number
: 250
一般模式可用的光标移动、复制粘贴、搜索替换等
dw delete word
光标必须在字母开头/word 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用):%s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用)
嵌入式linux开发环境介绍
单片机/pc软件开发
有集成化的开发工具
兼具编辑/编译/运行的功能
window电脑 服务器 开发板
虚拟机双网卡
NAT网卡 用于和电脑 相连 通过windows 上网 转发 访问外网
桥接网卡用于和开发板相连
配置桥接网卡
1 使用外接的usb网卡
2 使用路由器
只需2选1
开发板通过网线连接到配套的有线网卡,usb连接到电脑
这个时候
虚拟机情况下, 要添加usb网卡作为桥接网卡,同时设置IP
Windos 和开发板都要设置IP,三方都为静态ip 网段要一致
插上网卡 连接到主机 ,在windows设备管理器中 查看 网络设备器, 查看 是否有
然后重新开启虚拟机, 添加新的网卡设置为桥接模式,在虚拟网络适配器中选择具体网卡,视频中为自动。 Vmnet
在虚拟机设置中配置网络, 设置静态IP。关掉后重新打开使设置生效。 第二个ens36就是设置的桥接网卡
windows下网卡断开状态
开发板上电后,window下的网卡禁止符号消失
之后打开串口软件,手工设置网卡ip
之后ping 192.168.5.10
修改配置文件设置 IP,修改一次即可,无需重复配置。修改开发板/etc/network/目录下
的 interfaces 文件,他视频里不同的开发板的代码还不太一样
stm32开头是 match
另一个是 atuo
如果存在问题,把域网络 防火墙等都关闭
路由器
开发板连接至路由器
ubuntu部分也连接至路由器
1 设置VMware 添加桥接网卡
2 选择网卡,用作桥接网卡, 虚拟网络编辑器以管理员身份运行
如果电脑是有线连接 就选择有线网卡
wifi就选择wifi网卡
windows和ubuntu自动获得ip,可以互通
3 三者ip配置
开发板的ip一般也是自动获得
如果之前配置了静态ip的文件,需要把他删掉,重启系统
安装软件文件
解压报错
window不支持linux的链接文件
开发板挂载nfs
nfs相当于 开发板上的网盘功能
1 权限 etc/export
2 启动 nfs服务
3 开发板挂载mount
home/book目录为 上述export中 cat 出现的
相当于 开发板和ubuntu共享某个目录下的文件
制作第一个app
需要用到板子的交叉工具链进行编译 获得的文件可以在板子上运行。 否则报错不支持的二进制文件
自己制作一个宏
他在
例如在那个 mobax 软件里
macros 栏中 录制一个宏 然后编辑挂载mout 目录
下面加一个回车
之后自动执行该代码
然后在开发板系统 到相应目录下,可以看到文件
在ubuntu下重新编译 输出hello,然后在开发板上执行程序,成功
gcc -o hello hello.c
arm-buildroot-linux-gnueabihf-gcc -o hello hello.c
第一个驱动程序
1 配置编译:内核,设备树,驱动
2 将该系列内容放到板子上
3 编译测试第一个驱动
make -j4
使用多核性能来提高编译速度
替换内核
在开发板下
uname -a
出现内核相关信息
挂载分区
更新内核 设备树
-r递归复制 f强制复制 d以前是链接文件,复制后仍旧为链接文件 从而使flash容量消耗减少
sync 同步一下,强制刷新flash文件
驱动程序
配置 编译内核,
将代码工程传到 ubuntu下的 与 开发板的共享文件夹下
修改 Makefile 文件“KERN_DIR”为自己的内核所在路径
需要根据开发板指定相应的内核源码路径
他视频里就是直接在 nfs目录下编译生成驱动文件的
然后 pdf中的拷贝操作就不需要了
lsmod
ls /dev/hello
cat /proc/dev
tsv flash 怎么划分,划分之后分区对应什么文件
他把 buildroot 编译出来的文件复制到windows下 然后再烧写到开发板上吗
此时更新内核了 内核时间变为2022
挂载
mount 把别的服务器某个目录 到 板子上的某个目录
-o option nolock 不然会卡住
-t 设备类型 nfs 类的
板子开关重启
file hello 查看文件信息
hello背后没那么简单
问1 .h / .c 有什么差别
.h头文件中声明, 头文件 函数需要什么参数 返回什么类型
c文件为实现
头文件在哪
系统目录
工具链目录
指定目录
-I dir
#include"../touh/speechmanager.h"
printf文件在哪
在库里面, 可以有系统目录,或自己指定
经常会遇到两个问题:
头文件中找不到 指定目录
函数未定义 缺了某些库
gcc 编译过程
电工
纸带打孔 - 机器码
开始用不同的助记符 代替 01
英文 汇编码
高级语言
gcc -v 查看详细过程
cc1 查找头文件 展开宏
编译
as .s文件转换为 .o目标文件 汇编
链接把多个程序组装在一起
collect2 操作
取库文件中 找到各种文件 然后 组装链接
4个步骤被一个 gcc合成
#ifdef
#endif
语法错误是在编译过程中发现的
gcc -E 可以
-s失败
gcc常用选项
各种 .o文件会链接到一起 形成最后的文件。一起编译,链接的坏处
假设有1000个文件。修改其中1个文件,
编译 但不链接,也就使分开编译
<> “”
当前目录 与 系统指定的工具目录
-v 显示查找目录
-v -I
要么使用 -I 选项 指明头文件目录
要么把文件放到默认的库里
静态库 动态库
编译的时候 如果 main。c使用到了 sub。c的函数 会失败
需要编译的时候把sub。c也加入。
ar 可以理解为压缩打包
动态库链接更为常用的方法为 使用 -l 省略库前缀与后缀
在library path中查找文件
可以把库文件放到该路径中,
小l 说明链接哪个库
大L 指明链接的库目录
使用file命令查看文件信息
链接时和运行时 不一样
链接时用L 表明库在哪里
运行时 可以通过把文件放到默认的文件夹下 比如 lib usr/lib
或者 给ld library path 添加
makefile
gcc命令的缺点在于队所有文件都要处理一遍, 可能就改了一个文件
修改了哪个文件,只要改哪个文件就行
如何判断哪些文件被修改了。
比较时间。 比较文件生成的时间, 时间更新的话就说明 更改了。
当依赖文件比目标文件新,执行新命令,重新生成文件
层层依赖,排查
执行 make命令
makefile语法
make 带上目标名 ,如果不带 就会默认执行第一个目标
如果目录下有与命令同名的文件
此时需要假想目标
.PHONY: clean
简单变量 延时变量
A:=10 即刻确定,定义时就确定
B = 10 使用时才确定
?= 如果是第一次定义才起效,如果在前面该变量已定义则忽略这句
+=
函数
P158
$ (foreach )f,$
filter
filter-out
wildcard pattern 判断哪些文件真实存在
patsubst 文字替换
从列表中取出每一个值,如果符合,将所有的 .c 替换为 .d ,
makefile 实例
改进支持头文件依赖,
百度 gcc生成依赖
gcc -M 打印出依赖
gcc -M -MF 把以来写入文件
生成d文件 存放
. $@.d 第一个. 表明隐藏文件。
https://www.bilibili.com/video/BV1w4411B7a4/?p=45&spm_id_from=pageDriver&vd_source=e7d12c9f66ab8294c87125a95510dac9
3.1.3 通用 Makefile 的解析
文件I/O
插上sd卡,sd卡内容访问,手动挂载
看是否自动挂载可以通过
cat /proc/mounts
对于真实硬件上的文件需要挂在后才能访问
mnt文件下的文件访问读写 就相当于是访问硬件上的文件
通过一系列标准接口 访问普通文件或者驱动程序
虚拟文件系统
也要先挂载
可以根据虚拟文件系统 查看内核信息
比如说 cat /proc/mounts 查看已经被挂载的设备
有 sysfs 系统文件
查看 ls /sys
查看内核有哪些 文件,然后手动挂载
mount -t sysfs none /mnt
这里none为 设备节点,对于虚拟系统,他不需要真实的设备节点。随便写
如何系统自动挂载
特殊文件 设备节点 硬件
ls /dev/* -l
char 字符设备驱动程序
block 块设备驱动程序
主设备号 次设备号,内核中的不同设备节点通过 主设备号确定对应哪一个驱动,通过次设备号确定对应哪一个设备号的硬件。
4.3 怎么知道这些函数的用法?
man 手册 多个手册,一个找不到去另一个找
man 2 open
man printf
man 7 printf
man 3 printf
man 2 open 可以加入 用户权限 第三个参数
不同的函数使用费干翻噶 调用 不同的头文件
mmap 可以把文件的内容映射给应用程序,可以把显存映射给应用程序
映射成功后直接把buf 里内容写入
系统调用怎么进入内核
linux系统中一切都是文件。
app 层面 读写文件,调用内核。
对于普通文件,使用文件系统相关代码去读写磁盘。
对于设备硬件,找到对应驱动程序,调用相关函数
应用程序怎么进入内核态
uclibc 是嵌入式裁剪的
app层面都是通过 swi svc 导致异常进入内核
ABI 应用二进制接口
内核中有一个系统调用函数的指针数组。
内核把 库函数传入的值取出后,就可以把值作为下标。在数组里找到调用的函数。
字符设备节点 以主备设号在内核里找到驱动。以后使用该驱动赖操作硬件
另一个以文件系统代码来操作硬件设备
framebuffer
汉字编码
如果不指定“-finput-charset”,GCC 就会默认 C 程序的编码方式为 UTF8,即使你是以 ANSI 格式保存,也会被当作 UTF-8 来对待。
但是视频中没有指定,是按照 c程序的编码来进行执行的。 源代码的保存格式不一样 ,执行效果不一样
这个时候 利用相关指令
文件是以什么编码 执行以什么编码
6.4.2 常见错误的解决方法
echo 'main(){}'| arm-buildroot-linux-gnueabihf-gcc -E -v -
他会显示各种信息,这里是把main函数设立,然后传到后面的交叉编译工具链中编译,查看编译信息
以后缺少什么头文件,可以手动把文件放到这些目录中。
库文件也是同理
6.6.3 怎么在指定位置显示一行文字
位置发生改变时
x - 0 = x1 - ao a0 = x1 - x
y - 0 = y1 - a1 a1 = y1 - y
单位为 1/64 像素
意味着 要除以 1/64 , 就是乘以 64.
比如说单位是1,那么就是1, 单位是 1/2 那么就要乘2. 尺度缩小为多少,数值要乘上多少倍
7.2 输入系统框架及调试
7.3.3 获取设备信息
内核中的文件 ioctl
包含相应的头文件 input.h ,在工具链中提供
所以要 include《linux/input.h》