TCP/IP协议
table
{
margin: auto;
}
This is my study note of TCP/IP.
基础TCP\IP 的具体含义字面上来看就是指TCP、IP这两种协议,但很多情况下只是指我们用到IP协议的统称,具体来说IP、IMCP、TCP、UDP等都属于TCP/IP协议。TCP/IP泛指这些协议,有时候也称TCP/IP网际协议群。
数据包每个分层中都会对所发送的数据加一个首部。
网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结构由协议的具体规范详细定义。
数据处理流程
应用程序处理121.对数据进行编码处理相当于OSI的表示层。2.编码完的数据不会立即发送出去,何时建立通行以及何时发送数据是靠会话层决定的。
TCP模块的处理1根据应用的指示,建立端到端的连接,并将数据发送到对端,此时数据最前端要加入TCP、UDP首部。
IP模块的处理12IP将TCP打包下来的数据和IP首部合起来作为自己的数据,在TCP首部加入自己的IP首部,IP数据包生成后,参考路由控制表决 ...
线程池
This is my study note of thread pools.
table
{
margin: auto;
}
线程池核心就是线程池中的线程会持续查询任务队列是否有可用工作,如果有可用工作则将其取出并执行。
任务队列任务队列需要实现的就是插入、删除任务等操作。
判断队列是否为空 SafeQueue::empty()12345bool empty() // 返回队列是否为空{ std::unique_lock<std::mutex> lock(m_mutex); // 互斥信号变量加锁,防止m_queue被改变 return m_queue.empty();}
返回队列长度 SafeQueue::size()12345int size(){ std::unique_lock<std::mutex> lock(m_mutex); // 互斥信号变量加锁,防止m_queue被改变 return m_queue.size();}
插入任务 SafeQueue::enqueu ...
docker使用教程
This is my study note of docker.
table
{
margin: auto;
}
简介
什么是docker?docker镜像类似一个集装箱,你可以把你需要完成的所有任务(即所有代码以及代码运行需要的环境)全部打包到这个集装箱内部。需要的时候直接开启这个“集装箱”,在集装箱内部完成你的任务(即在打包好的环境里面运行你需要的代码)。docker就是管理这些docker镜像的码头,你可以使用docker进行导出、载入、开启、关闭镜像等操作。
什么场景需要docker?当你需要在其他PC上或者其他嵌入式开发板上运行当前的工程时,往往需要为这个工程配置繁杂的环境,有些环境的配置还很可能出现问题,这种情况下,可以在当前你的设备上将工程需要的环境打包为docker镜像,在目标设备上安装这个镜像,就可以在目标设备上直接运行你的项目了。
docker解决的问题?1.首先,如上述所述解决了项目的环境问题,即镜像中的环境与设备上的环境是隔离开的,我们只需要保证镜像是我们自己工程所依靠的镜像即可。2.隔离,docker在启动的时候已经限制好使用的最大C ...
DMA
table
{
margin: auto;
}
This is my study note of CAN.
概述CAN是Controller Area Network的缩写,主要用于汽车领域。有点可以减少汽车的线束,减少布线占的空间和车的重量。
协议及组成种类
ISO11898:针对通信速率为125Kbps~1Mbps的高速通信标准(闭环)
ISO11519:针对通信速率为125Kbps以下的低速通信标准(开环)
组成
CPU和CAN控制器集成在一起,再外接CAN收发器(stm32采用的方式)
CPU和CAN控制器分开,使用时需要配置CAN接口电路12CAN收发器用于TTL电平与差分电压信号相互转换的,TTL电平即单片机引脚直接提供的电平,逻辑0代表低电平,逻辑1代表高电平,差分电压信号则为固定的电压值。
通信CAN通信是通过两根线完成的:
CAN_High
CAN_Low123CAN_High - CAN_Low < 0.5v时为隐性的,表现为“逻辑1”,即高电平。CAN_High - CAN_Low > 0.9v时是显性的,表现为“逻辑0”,即低电平 ...
DMA
table
{
margin: auto;
}
This is my study note of DMA.
DMA基础介绍DMA全程Direct Memory Access,即直接存储器访问。核心是提供一条数据通路让数据由A拷贝B不经过CPU处理。
传输方向
外设到内存
内存到外设
内存到内存
传输参数
数据的源地址
数据传输位置的目标地址
传递数据多少的数据传输量
进行多少次传输的传输模式
优先级
很高
高
中
低
DMA传输
DMA传输时外设对DMA控制器发出请求
DMA控制器收到请求,触发DNA工作
DMA控制器从AHB外设获取数据,存储到DMA通道中
DMA控制器的DMA与总线矩阵协调,使AHB把外设获取到的数据存储到SRAM中,全过程不需要内核参与,不需要CPU的参与(每次传输执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目)
传输方式
DMA_Mode_Normal,正常模式
DMA_Mode_Circular,循环传输模式(存储器到存储器模式不能与循环模式同时使用)
指针递增1根据PINC和MINC位的状态,外设和存储器 ...
uboot
table
{
margin: auto;
}
This is my study note of Uboot.
u-boot 功能uboot被称为universal bootlooder,所以是通用的bootloder,uboot是bootloder的一种,不能说bootloder就是uboot,u-boot一般有如下两种方式,一种flash跟CPU封装在一起,另一种flash通过EMMC等控制器拓展到外部。
1234567891011以上两种方式中,Flash从低址到高址分别存储Uboot->内核->文件系统,uboot主要的任务是启动内核:1.即读flash把内核copy进内存 a.如果RAM或DDR的话,内存较小,需要进行初始化操作(如果是SRAM的话,内存较大,不需要进行初始化操作) b.初始化其他硬件,例如时钟等 c.将flash copy进内核里2.启动内核内核的主要任务是: a.能R/W读写flash,驱动程序 b.能R/W读写文件,文件系统 c.能找到并启动APP
XIP和非XIPCPU可以直接访问的就是XIP格式,如下:不可访问 ...
库、管道、共享内存
This is my study note of linux.
table
{
margin: auto;
}
库基本概念1库是一种二进制文件,由编译产生。
库的种类
静态库1234567静态库编译的时候会被链接到目标代码里,所以程序运行的时候不需要静态库了,体积比较大。静态库以lib开头,以.a结尾。静态库制作步骤: 1.编写或准备源码 2.将源码编译生成.o 3.使用ar命令创建静态库 arr cr libmylib.a mylib.o 4.测试库 gcc test.c -lmylib -L . 其中-l+库文件名 -L +文件路径
动态库1234567891011动态库编译的时候不会被链接到目标代码里,运行的时候仍需动态库的存在,体积较小。动态库以lib开头,以.so结尾。动态库制作流程: 1.编写或准备源码 2.编译源码生成.o 3.使用gcc生成.so, 例gcc -shared -o libmylib.so mylib.o 4.测试库 gcc test.c -lmylib -L . 其中-l+库 ...
平台总线驱动
This is my study note of platform.
table
{
margin: auto;
}
概念什么是总线模型也叫platform总线模型,是linux内核虚拟出来的总线,并不是真实的总线。平台总线模型就是将我们原来的驱动文件分为device文件和driver文件。设备、总线、驱动,主要是总线通过设备和驱动中相同的名字来进行匹配,实际上就是字符串比较。
platform设备注册主要写的是硬件资源,指的是寄存器的地址和中断号等。
1234567891011121314151617181920struct platform_device{ const char *name; // 设备名字用于后续匹配,可以在sys/bus目录下看到注册的设备 int id; // 我们的设备一般只有一个,填-1就行 struct device dev; // 内嵌的device结构体,一般用于实现release u32 num_resource; ...
device tree
This is my study note of device tree.
table
{
margin: auto;
}
基本知识基本名词
DT: 设备树
FDT(Flatten device tree): 开发设备树
dts: 设备树源码1路径:/linux/kernel/arch/arm(or arm64)/boot/dts
dtsi:通用的设备树源码(重复的部分)
dtb:编译设备树后得到的文件
dtc:编译设备树的编译器
编译设备树12dtc路径:/linux/kernel/scripts/dtc如果没有dtc文件,则:进入 /linux/kernel/.config文件中,将CONFIG_DTC设置为y
编译命令1dtc -I dts -O dtb -o xxx.dtb xxx.dts
反编译命令1dtc -I dtb -O dts -o xxx.dts xxx.dtb
语法
版本号
1/dts-v1/;
结点
1234567/{ // 根结点名为“/” led:led@19121 { // 标签( ...
rust基础
This is my study note of rust.
table
{
margin: auto;
}
Rust是一种系统级编程语言
零成本抽象1rust几乎没有运行时的抽象,它的抽象过程在编译时就已经执行完成了。
所有权系统12345所有权系统使得编译器在编译时进行内存管理,而无需运行的垃圾回收(GC)。什么叫做垃圾回收机制呢(garbage collection)?就是使用动态内存分配时,程序员往往会不小心忘记释放内存或者多次释放相同的内存,这时候就会导致程序运行错误,垃圾回收机制就是自动检测不再使用的内存对象将他们释放,主要是检测对象间的引用关系,当一个对象不再被引用时,垃圾回收器会在适当的时候回收他们的内存。
零成本的异常处理1rust使用Result和Option类型来处理错误和可选值,这些类型在编译过程中进行检查,不需要额外的运行开销。
内敛汇编1开发者可以直接在rust中嵌入汇编代码,以获得最佳的性能和对底层硬件的直接访问。
零开销的并发1提供内置的并发原语,避免常见的并发问题,例如数据竞争和死锁。
什么是cargo是Rust编程语言的官方构建系 ...