- 博客(70)
- 收藏
- 关注
原创 CAN 总线协议概述
在 CAN2.0B 中额外增加了扩展帧,它拥有 29 位标识符(ID),前 11 位与 CAN2.0A 的标识符相同,在此之后又增加了 18 位 CAN2.0B 专用的扩展标识符,其余结构完全相同,基于 2.0B 的总线网络既可以接收标准帧也可以接收扩展帧,但是在同一网络中通常只能出现一种帧格式,必须提前设定该网络是接收标准帧还是扩展帧,扩展帧结构如图 3-2 所示。时,发现总线实际电平和其发送的电平不一致,这时候,节点 A 会认为自己输掉了仲裁,会从一个发送节点转变为一个接收节点…
2025-03-30 09:22:26
1011
原创 SylixOS 中 select 原理及使用分析
select 是操作系统多路 I/O 复用技术实现的方式之一。select 函数允许程序监视多个文件描述符,等待所监视的一个或者多个文件描述符变为“准备好”的状态。所谓的”准备好“状态是指:文件描述符不再是阻塞状态,可以用于某类 IO 操作了,包括可读,可写,发生异常三种。
2025-03-26 22:09:45
898
原创 SPI 总线协议
SPI,是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。SPI,是一种高速的,全双工,同步的通信总线。主节点或子节点的数据在时钟上升沿或下降沿同步。主节点和子节点可以同时传输数据。SPI 接口可以是 3 线或 4 线。本文重点介绍流行的 4 线 SPI 接口。
2025-03-18 22:54:20
755
原创 I2C 总线协议
IIC(Inter-Integrated Circuit)协议也称为 I2C 总线,是一种串行通信协议,通常用于连接低速外设。它由 Philips(现在的NXP Semiconductors)公司于 1980 年代初开发,现在已经成为一个标准。IIC 总线只需要两条数据线,分别是串行数据线(SDA)和串行时钟线(SCL),这使得它成为一种非常简单的接口。I2C 有利于设计人员在系统的众多节点之间建立简单、双向、灵活的通信。I2C 仅使用两条双向线来发送和接收信息,从而降低了复杂性。
2025-03-17 23:14:37
1026
原创 ARM 架构下 cache 一致性问题整理
本篇文章主要整理 ARM 架构下,和 Cache 一致性相关的一些知识。本文假设读者具备一定的计算机体系结构和 Cache 相关基础知识,适合有相关背景的读者阅读。
2025-03-02 12:09:32
1296
原创 PCI 总线学习笔记(三)
BDF、BAR 空间、Primary、Secondary、Subordinate Bus Number Register、Base&Limit Register,PCI 总线树遍历
2025-01-24 18:01:56
892
原创 Linux delay相关函数实现
这里讨论基于 ARM 处理器架构的实现,udelay 实现在arch/arm/include/asm/delay.h中。gcc 的内建函数 __builtin_constant_p 用于判断 n 是否为编译时常数,如果 n 是常数,返回 1,否则返回 0。当然,从注释中我们可以看到,include/linux/delay.h 目录下只是通用的实现,可以被架构相关的实现覆盖掉。至此,loops_per_jiffy 变量就已经计算完毕,后面的 udelay 、BogoMIPS 计算都会用到该变量。
2024-01-28 14:45:50
1212
原创 X86_64 栈和函数调用
Intel 系列处理器通常称为x86,目前常用的笔记本或台式机都是 64 位的处理器,这些处理器使用的机器语言一般都是 x86_64,我记得以前学习微机原理课的时候,学习的还是 8086 处理器上的汇编。8086 是Intel的第一代16位的处理器,只有8个16位的寄存器,而现在的 64 位处理器对其进行了扩展,共有16个64位的寄存器。需要注意这里的栈是倒着画的,栈顶在下面,栈顶的内存地址是更小的,换句话说栈增长的方向是内存地址减小的方向。寄存器,这个寄存器中存储着栈顶的地址。到这里,函数栈情况如下图。
2023-10-15 11:34:17
787
原创 可执行文件 elf 和 bin
在 Embedded(嵌入式)中,如果上电开始运行,没有 OS 系统,如果将 ELF 格式的文件烧写进去, 包含一些 ELF 文件的符号表字符表之类的section,运行碰到这些,就会导致失败,如果用 objcopy 生成纯粹的二进制文件,去除掉符号表之类的 section,只将代码段数据段保留下来,程序就可以一步一步运行。在Linux OS上,为了运行可执行文件,他们是遵循 ELF 格式的,通常 gcc -o test test.c,生成的 test 文件就是 ELF 格式的。ELF 文件并执行。
2023-10-05 13:41:58
849
原创 关于内存对齐你需要了解的事
这篇文章的目的是带你了解什么是内存对齐,具体的内存对齐的细节、处理方式、不同架构则不会去详细讲解,只做科普文用。内存对齐和数据在内存中的位置有关。内存对齐以字节为单位进行,一个变量的内存地址如果正好等于它的长度的整数倍,则称为自然对齐。比如在32位 cpu 下,一个 u32 的内存地址为0x00000004 ,则属于自然对齐。内存空间按照字节进行划分,理论上可以从任意地址开始读取,实际上会要求读取数据的首地址是某一个值的整数倍。
2023-10-05 13:26:46
2200
原创 可执行文件的装载与进程
当我们在Linux系统的bash下输入一个命令执行某个ELF程序时,Linux系统是怎样装载这个ELF文件并且执行它的呢?首先在用户层面,bash进程会调用fork()系统调用创建一个新的进程,然后新的进程调用execve()系统调用执行指定的ELF文件,原先的bash进程继续返回等待刚才启动的新进程结束,然后继续等待用户输入命令。它的三个参数分别是被执行的程序文件名、执行参数和环境变量。在进入execve()系统调用之后,Linux内核就开始进行真正的装载工作。
2023-09-04 11:09:59
572
原创 静态链接过程
1、空间与地址的分配 现在的链接器空间分配的策略基本上都采用 “相似段合并” 的方式。通过将所有相同类型的 section 合并到一起,例如将所有输入目标文件的 .text 合并(按顺序合并)到输出文件的 .text 节中;然后,链接器根据运行平台中进程虚拟地址空间的划分规则,为所有输入目标文件中定义的节和符号分配运行时内存地址;完成之后,程序中的每条指令和符号都有唯一的运行时内存地址了。链接器的空间分配示意如下: 使用这种方法的链接器都采用两步链接的方法。 第一步,空间与地址分配。扫描所有的
2023-07-26 22:34:24
705
原创 ELF文件结构描述
经过上面的描述,我们了解到了强符号,弱符号,强引用,弱引用的概念。强符号可以替换弱符号。弱引用可以避免函数未定义的错误。强符号替换弱符号一些库中对外接口可以声明为弱符号。比如:实现一个 myadd(int num1,int num2) 接口,之后再将项目中的所有 add 替换为 myadd。这种方式可行,但是存在缺点:修改量大,并且后续人员不清楚背景,很有可能继续使用熟悉的 add 接口。更新 math 库,从更本解决此问题。这种方式比较推荐。
2023-07-22 16:57:08
348
原创 lwip - 链路层收发以太网数据帧
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度。封装后的数据包称为数据帧,数据帧的封装的信息决定了数据如何传输。
2023-04-22 23:14:37
1551
原创 Linux内核之文件描述符、文件表、i-node table
前言文件描述符在unix系统中几乎无处不在网络接口 select、poll、epoll 涉及到文件描述符IO接口 read、write 也涉及到文件描述符从形式上来看文件描述就是一个整数,那么我们可不可以更进一步去了解一下呢?1、文件描述符是一个int型整数2、文件描述符创建是有一定的规则。在创建文件描述符的时候系统会在files_struct数组中,去找到一个当前没有被使用的一个最小下标,作为一个新的文件描述符。3、程序开始运行时,有三个文件被自动打开了,打开时分别使用了这三个文件描述符
2021-04-27 16:44:30
1019
原创 C语言关键字、函数杂谈(1)
1、static关键字static关键的,是用来声明静态变量的。主要作用有两个:隐藏与隔离的作用(当同时编译多个文件)保持变量内容的持久性下面就这两个功能进行详解:(1)隐藏与隔离的作用(当同时编译多个文件): 上面已经阐述过,全局变量虽然属于静态存储方式,但并不是静态变量。全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,全局变量在各个源文件中都是有效的。 如果我们希望全局变量仅限于在本源文件中使用,在其他源文件中不能引用,也就是说限制其作用域只在定义该变量的源文件
2021-03-22 21:20:48
736
原创 C/C++中*和&的用法详解
C/C++中&和∗*∗的用法一直是非常让人头疼的难点,课本、博客上讲这些知识点一般都是分开讲其用法的,没有详细的总结,导致我在这方面的知识结构格外混乱。以下这篇文章系统、全面的讲解C/C++中的&和∗*∗。供大家参考~1. C语言中 1.1 ∗*∗乘法运算:x=y∗*∗z;乘法赋值运算:x∗*∗=y;相当于x=x∗*∗y注释:/∗*∗这里是你的注释∗*∗/指针的声...
2020-05-06 21:39:31
3650
原创 看完这篇区块链的文章,就有东西和别人扯皮了,而且扯的还很好
网上有很多关于区块链的文章,要么过于深奥,对于初学者很难弄懂,要么过于浅显,也很难想通。这篇文章从底层讲起,由浅入深,从密码学算法讲起,不断深入,算是一遍比较完备的区块链——比特币的文章。文章以比特币为例,来讲解区块链。因为区块链最初就是因为比特币被人们熟知的。坚持把这篇文章看完,比特币的知识就基本了解了。在辅以区块链的一些其他应用,就会真正在区块链这个方面上一个台阶。
2020-04-22 11:43:08
2457
2
原创 Linux入门基础——常用命令(四)
6.进程控制类命令ps功能:用来显示系统当下进程信息格式:ps [参数]-l:长格式输出-u:按用户名和启动时间的顺序来显示进程-j:用任务格式来显示进程-f:用树形格式来显示进程-a:显示所有用户的所有进程(包括其他用户)-x:显示无控制终端的进程-r:显示运行中的进程top功能:动态监视系统任务的工具,输出结果是连续的格式:top [参数]-b:以批量模式运行,但不...
2020-04-06 17:23:55
299
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人