
嵌入式开发
文章平均质量分 87
芯片,总线,外设的学习
物随心转
子曰:“学而时习之,不亦说乎?”
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
UART、RS232、RS485基础知识
UART是一种采用异步串行、全双工通信方式的通用异步收发传输器功能。硬件电路:•简单双向串口通信有两根通信线(发送端TX和接收端RX)•TX与RX要交叉连接•当只需单向的数据传输时,可以只接一根通信线•当电平标准不一致时,需要加电平转换芯片串口通信最重要的参数是端口(com)、波特率、数据位、停止位和奇偶的校验。对于两个需要进行串口通信的端口,这些参数必须匹配,共同遵守,这也是能够实现串口通讯的前提。UART存在问题。原创 2025-05-25 23:06:41 · 854 阅读 · 0 评论 -
独占内存访问工作原理
前面已经介绍了 LDXR 指令。LDXR 是内存加载指令的一种, 不过它会通过独占监视器(exclusive monitor)来监控对内存的访问。一、什么是独占监视器LDXR 指令本质上也是 LDR 指令, 只不过在 ARM64 处理器内部使用一个独占监视器的硬件来监视它的状态。独占监视器一共有两个状态——开放访问状态(Open)和独占访问状态(Exclusive )。原创 2025-05-25 22:31:13 · 598 阅读 · 0 评论 -
内存屏障指令
DMB 指令保证的是DMB 指令之前的所有内存访问指令和 DMB 指令之后的所有内存访问指令的执行顺序。DMB 指令不会保证内存访问指令在内存屏障指令之前完成, 它仅仅保证内存屏障指令前后的内存访问的执行顺序。2.2 数据同步屏障(Data Synchronization Barrier, DSB)指令: 比 DMB 指令要严格一些,仅当所有在它前面的内存访问指令都执行完毕后,才会执行在它后面的指令,即任何指令都要等待 DSB 指令前面的内存访问指令完成。ARMv8 指令集提供了 3 条内存屏障指令。原创 2025-05-21 23:00:38 · 358 阅读 · 0 评论 -
独占内存访问指令LDXR/STXR
一、原子操作的介绍在计算机领域里,如果要在多线程的情况下要保持数据的同步,需要引入称作Load-Link(LL)和Store-Conditional(SC)的操作,通常简称为LL/SC。LL操作返回一个内存地址上当前存储的值,并且处理器会监控这个内存地址, 看其他处理器是否修改该内存地址,后面的SC操作,会向这个内存地址写入一个新值。但是,。这个操作非常重要,是很多平台实现基本原子操作的基础。原创 2025-05-21 22:37:34 · 314 阅读 · 0 评论 -
缓存一致性问题与MESI协议
缓存一致性关注的是同一个数据在多个高速缓存和内存中的一致性问题。那为什么会产生缓存一致性问题呢?举个例子:CPU0 有自己的 L1 高速缓存, CPU1 也有自己的 L1 高速缓存。如果 CPU0率先访问内存地址 A, 这个地址的数据就会加载到 CPU0 的 L1 高速缓存里。如果 CPU1 也想访问这个数据,那应该怎么办呢?它应该从内存中读,还是向 CPU0 要数据呢?这种情况下就产生了缓存一致性问题。原创 2025-05-18 22:30:39 · 653 阅读 · 0 评论 -
磁盘I/O子系统
当进程尝试改变数据,进程首先修改内存中的数据,这时候,磁盘和内 存中的数据就不一致了,内存中的数据就叫做脏缓冲(dirty buffer)。脏缓冲应该尽快同步到 磁盘上,否则,如果突然崩溃,内存中的数据会丢失。数据会定时刷新(kupdate),或者当内存中的脏缓冲到了阀值的比例的时候 (bdflush)。现代处理器的访问速度已经远远超过了主存储器的访问速度,为了解决这个问题,在CPU和内存之间添加一个高速内存, 这个高速内存容量小,只用来存储CPU执行时常用的指令。高缓存命中率是提升性能的关键。原创 2025-05-17 22:08:52 · 795 阅读 · 0 评论 -
高速缓存的原理
对于系统级别的缓存一致性,需要实现一种缓存一致性总线协议。在现代处理器中,处理器的访问速度已经远远超过了主存储器的访问速度,比如一条加载指令需要上百个时钟周期才能从主存储器读取数据到处理器内部的寄存器中,这会导致使用该数据的指令需要等待加载指令完成才能继续执行, 处理器处于停滞状态, 严重影响程序的运行速度。高速缓存一般是集成在CPU处理器内部的 SRAM(Static Random Access Memory), 相比外部的内存条,它造价昂贵,因此,高速缓存的容量一般比较小,成本高,但是访问速度快。原创 2025-03-16 10:53:27 · 569 阅读 · 0 评论 -
汇编的伪指令
伪指令是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有对应机器码,只用于汇编过程中为汇编程序提供汇编信息,帮助编译器编译。当汇编结束时,伪指令的使命也就结束了。符号定义;数据定义和对齐;汇编控制;汇编宏;段描述;原创 2025-03-09 17:00:22 · 542 阅读 · 0 评论 -
内存管理——页表、页表项、页目录、多级页表
我们想申请8M内存,我们就创建2个4K的二级页表。在虚拟地址空间里可按照固定大小来分页,典型的页面粒度为 4 KB,8KB或16KB等,而在物理内存中, 空间也分成和虚拟地址空间大小相同的块, 称为页帧(page frame)。因为页表一定要覆盖全部虚拟地址空间,所以在 32 位的环境下,虚拟地址空间共有 4GB,假设一个页的大小是 4KB(2^12),那么就需要大约 100 万 (2^20) 个页,每个「页表项」需要 4 个字节大小来存储,那么整个 4GB 空间的映射就需要有 4MB 的内存来存储页表。原创 2025-03-09 16:49:28 · 1329 阅读 · 0 评论 -
ARMV8的64位指令
ARMv8 体系结构最大的改变是增加了一个新的 64 位的指令集,这是早前 ARM 指令集的有益补充和增强。它可以处理 64 位宽的寄存器和数据并且使用 64 位的指针来访问内存。这个新的指令集称为 A64 指令集,运行在 AArch64 状态。ARMv8 兼容旧的 32 位指令集——A32指令集,它运行在 AArch32 状态。注意:A64 指令集的指令宽度是 32 位,而不是 64 位。原创 2025-03-08 21:52:46 · 1124 阅读 · 0 评论 -
ARMv8寄存器的介绍
ARMv8中有34个寄存器,包括31个64 位通用寄存器、1个64 位的程序计数(Program Counter, PC)指针寄存器、栈指针(StackPointer, SP)寄存器以及异常链接寄存器(Exception Link Register, ELR)。一个处理器状态寄存器PSTATE来表示当前的处理器状态(processor state),1、通用寄存器AArch64执行状态支持31个64位的通用寄存器,分别是X0-X30寄存器,而AArch32状态支持16个32位的通用寄存器。原创 2025-03-08 20:48:53 · 1166 阅读 · 0 评论 -
I/O函数
但是有一个例外,如果以O_APPEND方式打开,每次写操作都会在文件末尾追加数据,然后将读写位置移到新的文件末尾。O_NONBLOCK 对于设备文件,以O_NONBLOCK方式打开可以做非阻塞I/O(Nonblock I/O) ,非阻塞I/O在下一节详细讲解。是I/O操作的主体,而ioctl命令传送的是控制信息,其中的数据是辅助的数据。每个打开的文件都记录着当前读写位置,打开文件时读写位置是0,表示文件开头,通常读写多少。的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。原创 2025-03-02 20:10:00 · 936 阅读 · 0 评论 -
文件描述符(File Descriptor)
内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。文件描述符是 Linux 中管理文件和 I/O 操作的核心概念。通过文件描述符,程序可以访问文件、管道、套接字等资源。理解文件描述符的工作原理对于编写高效的 Linux 程序至关重要。文件描述符(File Descriptor)简介-优快云博客。原创 2025-03-02 19:54:35 · 986 阅读 · 0 评论 -
Linux的缓存I/O和无缓存IO
现在我们在用户层建立另一个缓存区(用户层缓存区或者叫流缓存),假设流缓存的长度是50字节,我们用标准C库函数的fwrite()将数据写入到这个流缓存区里面,流缓存区满50字节后在进入内核缓存区,此时再调用系统函数write()将数据写入到文件(实质是磁盘)上标准IO操作fwrite()最后还是要掉用无缓存IO操作write,这里进行了两次调用fwrite()写100字节也就是进行两次系统调用write()函数。linux对IO文件的操作分为不带缓存的IO操作和带缓存的IO操作(标准IO操作)。原创 2025-03-02 18:14:43 · 1019 阅读 · 0 评论 -
MMU原理
现代操作系统普遍采用虚拟内存管理(Virtual Memory Management) 机制,这需要处理器中的MMU(Memory Management Unit,内存管理单元) 提供支持。它是一种负责处理CPU的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换、内存保护、中央处理器高速缓存的控制,原创 2025-03-01 16:55:56 · 1052 阅读 · 0 评论 -
CPU的原理
有些寄存器只能用于某种特定的用途,比如eip用作程序计数器,这称为特殊寄存器(Special-purpose Register) ,而另外一些寄存器可以用在各种运算和读写内存的指令中,比如eax寄存器,这称为通用寄存器(General-purpose Register)。中央处理器(Central Processing Unit,简称CPU)总是周而复始地做同一件事:从内存取指令,然后解释执行它,然后再取下一条指令,再解释执行。如x86就是这样的体系结构,目前主流的处理器是32位或64位的。原创 2025-02-16 22:25:37 · 967 阅读 · 0 评论 -
GPMC介绍
ory Controller)是TI处理器特有的通用存储器控制器接口,是AM335x、AM437x、AM5708、AM5728等处理器专用于与外部存储器设备的接口,如:● 异步SRAM内存和专用集成电路ASIC)设备。● 异步,同步,和页面模式(仅适用于非复用模式)突发NOR闪存设备。● NAND闪存。●ADC器件。原创 2025-01-25 11:30:20 · 873 阅读 · 0 评论 -
Linux内核编译出来的Image文件解析
一、介绍Linux内核提供了一个用户界面,使我们能够与操作系统进行交互,处理进程管理、内存管理、设备驱动程序和系统安全等任务。在某些情况下,我们需要生成和构造自定义内核镜像,当我们编译自定义内核时,可以将其生成为以下内核镜像之一:vmlinux,.bin,和。内核镜像是包含内核代码和其他组件的二进制表示形式的文件。内核镜像格式因压缩、体系结构和特定用例而异。二、创建image镜像文件在Linux中,通常使用工具如dd或cpio来创建镜像文件。原创 2025-01-19 21:59:00 · 1068 阅读 · 0 评论 -
加载地址、运行地址以及链接地址
加载地址:存储代码的物理地址,在GNU链接脚本里称为LMA。例如,ARM64处理器上电复位后是从异常向量表开始取第一条指令的,所以通常这个地方存放代码最开始的部分,如异常向量表的处理代码。运行地址:程序运行时的地址,在GNU链接脚本里称为VMA。链接地址:在编译、链接时指定的地址,编程人员设想将来程序要运行的地址。程序中所有标号的地址在链接后便确定了,不管程序在哪里运行都不会改变。当。原创 2025-01-19 18:27:00 · 1076 阅读 · 0 评论 -
SD/MMC驱动开发
MMC的全称是”MultiMediaCard”――所以也通常被叫做”多媒体卡”,是一种小巧大容量的快闪存储卡,特别应用于移动电话和数字影像及其他移动终端中。MMC存贮卡只有7pin,可以支持MMC和SPI两种工作模式。SD卡,数字安全记忆卡(SecureDigitalMemoryCard),是用于移动设备的标准记忆卡。SD卡数据传送和物理规范由MMC发展而来,增加了两个主要特色:SD卡强调数据的安全安全,可以设定所储存的使用权限,防止数据被他人复制。另外一个特色就是传输速度比2.11版的MMC卡快。原创 2025-01-19 17:50:49 · 609 阅读 · 0 评论 -
flash驱动
NANDFlash是一种非易失存储介质(掉电后数据不会丢失),常见的U盘、TF卡/SD卡,以及大部分SSD(固态硬盘)都是由它组成的。原创 2025-01-19 17:09:48 · 943 阅读 · 0 评论 -
Linux内核的启动
处理器首先执行ROMCode的代码,处理器中还有一部分存储空间即内部SRAM可以执行代码,但是SRAM通常都比较小,不能放下Linux内核的压缩image,这样就需要有个中间过渡的模块,该模块的主要功能是进行系统加载,叫做bootloader.。内核相关的初始化既要有体系结构相关的部分,又要有板级相关的部分。另外现在的处理器从内存解压比从外部存储读取速度快得多,所以通常在内存中解压启动也会快,这就需要Linux内核初始化的时候,能够将压缩的image进行解压,当然解压功能应该由Linux内核提供。原创 2025-01-15 21:44:23 · 749 阅读 · 0 评论 -
从硬件设备看Linux
DM3730通过各种连接方式连接了各种设备,输入输出设备根据不同的类型大体可以分为电源管理、用户输人、显示输出、图像采集、存储以及无线设备等。我们可以将DM3730与这些设备的数据接口分为总线和单一的数据接口总线。总线的显著特点是单个总线上可以连接多个设备;单一的数据接口只连接单一类型的设备,用户显示LCD输出的DSI接口)。各种不同类型的数据连接接口其设计思想以及功能是不同的,例如IIC通常用于设备的控制,McBSP用于音频数据的传输等。原创 2025-01-13 19:05:57 · 567 阅读 · 0 评论 -
中断系统的原理
中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的。中断是指CPU在正常运行程序时,由于内部或外部事件的发生,导致CPU中断当前运行的程序,转而去执行其他程序的过程。 中断可以是硬件产生的,也可以是软件产生的。硬件中断通常由外围设备触发,而软件中断则是通过CPU指令集中的一个指令来实现。原创 2024-10-06 22:06:49 · 1571 阅读 · 1 评论 -
PWM 模式
PWM(脉宽调制,Pulse-width modulation)是一种通过调节脉冲信号的宽度来控制电能输出的方法。PWM是一种方波信号,通常在电子和电气工程中用于调节功率输送,控制电机速度,调节LED亮度,以及生成模拟信号等。PWM信号是通过不断地将一个信号在高电平和低电平之间切换而生成的。PWM的核心参数有两个:频率和占空比。频率:PWM信号的开关速度,表示每秒完成的周期次数。频率越高,PWM信号周期越短。占空比:在一个周期内,高电平所占的时间比例。原创 2024-10-01 16:19:53 · 1753 阅读 · 0 评论 -
TIM(Timer)定时器的原理
硬件定时器的工作原理基于时钟信号源提供稳定的时钟信号作为计时器的基准。计数器从预设值开始计数,每当时钟信号到达时计数器递增。当计数器达到预设值时,定时器会触发一个中断信号通知中断控制器处理相应的中断服务程序。在中断服务程序中,可以执行一些预定的操作。硬件定时器通常由晶体振荡器、计数器、预设值寄存器和中断控制器等关键组成部分构成,晶体振荡器提供稳定的时钟信号源,计数器使用时钟信号进行计数,预设值寄存器用于设置定时器的初始值,中断控制器处理定时器产生的中断信号。原创 2024-10-01 11:50:12 · 2286 阅读 · 0 评论 -
ADC的原理
模数转换,即Analog-to-Digital Converter,常称ADC,是指将连续变量的模拟信号转换为离散的数字信号的器件,比如将模温度感器产生的电信号转为控制芯片能处理的数字信号0101,这样ADC就建立了模拟世界的传感器和数字世界的信号处理与数据转换的联系。当然,数字信号通过处理器处理后,也可以通过DAC还原回去,但是还原也不可能是百分百的,必然是有损的。原创 2024-09-29 21:59:23 · 1125 阅读 · 0 评论 -
DMA的原理
DMA(Direct Memory Access)是一种允许设备直接与内存进行数据交换的技术,无需CPU干预。DMA的主要功能是提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。比如使用ADC进行数据采集,可以直接将数据存入存储器中,而无须CPU干预,节省了CPU的资源。DMA传输方式虽然高效,但是,只是减轻了CPU的工作负担;系统总线仍然被占用。特别是在传输大容量文件时,CPU的占用率可能不到10%,但是用户会觉得运行部分程序时系统变得相当的缓慢。原创 2024-09-28 22:25:16 · 1833 阅读 · 0 评论