自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 FreeRTOS 快速入门(五)之信号量

信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问,其实信号量主要的功能就是实现任务之间的同步与互斥,实现的方式主要就是依靠队列(信号量是特殊的队列)的任务阻塞机制。

2024-08-22 11:26:55 1302 17

原创 FreeRTOS 快速入门(四)之队列

队列通常是一个先入先出(FIFO)的缓冲区,即数据在队列末尾(tail)被写入,在队列前部(head)移出。下图展示了数据被写入和移出作为 FIFO 使用的队列。也可以写入队列的前端,并覆盖已位于队列前端的数据。

2024-08-21 16:02:49 1776 13

原创 FreeRTOS 快速入门(三)之任务管理

要注意的是,函数内部,尽量使用局部变量。因为每个任务都有自己的栈,每个任务运行这个函数时,任务 A 的局部变量放在任务 A 的栈里、任务 B 的局部变量放在任务 B 的栈里。不同任务的局部变量,有自己的副本。函数使用全局变量、静态变量的话,只有一个副本:多个任务使用的是同一个副本。/* 对于不同的任务,局部变量放在任务的栈里,有各自的副本 *//* 任务函数通常实现为一个无限循环 */for(;;/* 任务的代码 *//* 如果程序从循环中退出,一定要使用 vTaskDelete 删除自己。

2024-08-20 10:20:53 2701 23

原创 FreeRTOS 快速入门(二)之内存管理

`FreeRTOS` 提供了几种堆管理方案, 其复杂性和功能各不相同。 你也可以提供自己的堆实现, 甚至同时使用两个堆实现。 同时使用两个堆实现 允许将任务堆栈和其他 `FreeRTOS` 对象放置在 内部 RAM 中,并将应用程序数据放置在较慢的外部 RAM 中。

2024-08-19 17:24:14 3072 3

原创 FreeRTOS 快速入门(一)之 FreeRTOS 的命名规则

FreeRTOS 的命名规约非常独特,假若缺乏事先的了解,研读其源代码将使人感到困惑不解。然而,一旦熟悉了其命名规约,阅读就变得十分轻松了。

2024-08-18 22:17:10 3513

原创 Modbus 通信协议详解

Modbus是由 Modicon(现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。为更好地普及和推动Modbus在基于以太网上的分布式应用,目前施耐德公司已将Modbus协议的所有权移交给 IDA(,分布式自动化接口)组织,并成立了 Modbus-IDA 组织。

2024-08-18 12:41:41 5623 9

原创 SPI 通信协议详解

SPI(串行外围设备接口) 通信协议是 Motorola 公司首先在其MC68HCXX 系列处理器上定义的。SPI 接口是一种高速的全双工同步的通信总线,已经广泛应用在众多 MCU、存储芯片、AD 转换器和 LCD 之间。由SPI连成的串行总线是一种三线同步总线,总线上可以连接多个可作为主机的 MCU,装有SPI接口的输出设备,输入设备如液晶驱动、A/D 转换等外设,也可以简单连接到单个 TTL 移位寄存器的芯片。总线上允许连接多个能作主机的设备,但在任一瞬间只允许有一个设备作为主机。

2024-08-17 14:27:45 5407

原创 UART 通信协议详解

UART (通用异步收发器) 是一种常用的串行通信协议,用于在计算机和外部设备之间传输数据。它是一种异步通信协议,也就是说数据的传输不需要事先建立好同步时钟信号。UART 协议定义了数据传输的格式和通信规则。它包括一系列的控制信号和数据线来实现双向的串行通信。常见的 UART 协议有 RS-232、RS-422 和 RS-485 等。UART 协议的数据传输是基于帧(Frame)的概念的。每个数据帧由一个起始位、若干个数据位、一个可选的奇偶校验位和一个或多个停止位组成。

2024-08-16 11:19:36 6219

原创 IIC 通信协议详解

IIC 协议,是一种用于各种电子设备之间进行通信和数据交换的串行通信协议。它是由飞利浦(Philips)公司于 1982 年首次提出并推广的一种简单、高效、低成本的通信协议。I2C协议采用双线结构传输数据,包括一个数据线和一个时钟线(即 SDA 和 SCL 线),其中 SDA()线用于双向数据传输,而 SCL()线则用于同步数据传输的时钟信号。通信始终由主设备(Master)控制,从设备(Slave)被动接收和回应。这种简单的线路连接方式使得设备之间的互连变得非常容易。

2024-08-15 20:12:03 6760

原创 Linux 中断机制(二)之中断子系统框架

用户层:用户层是中断的使用者,主要包括各类设备驱动。这些驱动程序通过中断相关的接口进行中断的申请和注册。当外设触发中断时, 用户层驱动程序会进行相应的回调处理,执行特定的操作。通用层:通用层也可称为框架层,它是硬件无关的层次。通用层的代码在所有硬件平台上都是通用的,不依赖于具体的硬件架构或中断控制器。通用层提供了统一的接口和功能, 用于管理和处理中断, 使得驱动程序能够在不同的硬件平台上复用。硬件相关层:硬件相关层包含两部分代码。

2024-08-14 21:59:15 7464 1

原创 Linux 中断机制(一)之中断和异常

中断(interrupt)是指在 CPU 正常运行期间, 由外部或内部事件引起的一种机制。当中断发生时,CPU 会停止当前正在执行的程序,并转而执行触发该中断的中断处理程序。处理完中断处理程序后,CPU 会返回到中断发生的地方, 继续执行被中断的程序。中断机制允许 CPU 在实时响应外部或内部事件的同时,保持对其他任务的处理能力。

2024-08-12 17:01:39 9097 1

原创 Linux 下利用 Valgrind 进行内存调试

Valgrind是一个开源的内存调试和性能分析工具,用于帮助开发者找出程序中的内存错误,如内存泄漏、使用未初始化的内存、非法内存访问等问题。它在 Linux 平台上广泛使用,并且支持下多种处理器架构。

2024-08-11 15:55:33 10001

原创 Linux 进程调度(三)之进程的优先级

在 Linux 中,每个进程都有一个优先级。优先级决定了进程在系统资源分配中的先后顺序。Linux 中的进程优先级范围从 -20 到 +19,其中 -20 为最高优先级,+19 为最低优先级。

2024-08-10 16:46:04 11013 1

原创 Linux 错误码

在 Linux 系统中,错误码是用来表示操作系统运行过程中发生的错误的数字代码。错误码通常由负数表示,0 表示成功,正数表示警告或其他非致命错误。为了开发者更好地处理系统错误,内核中预定义的错误几乎涵盖了我们可能遇到的所有问题。一些错误的宏定义在,还有一部分定义在中。当函数执行发生错误的时候,操作系统会将这个错误所对应的编号赋值给errno变量,每一个进程都维护了自己的 errno 变量,它是程序中的全局变量,该变量用于存储就近发生的函数执行错误编号。

2024-08-09 16:31:01 12058 3

原创 Linux 进程调度(二)之进程的上下文切换

进程的上下文切换是指在多任务操作系统中,当操作系统决定要切换当前运行的进程时,将当前进程的状态保存起来,并恢复下一个要运行的进程的状态。上下文切换是操作系统实现进程调度和实现多任务的关键机制之一。操作系统一个非常重要的功能就是进程的管理,通过调度策略选择合适的进程来执行,对于单个 CPU 而言,进程是串行分时执行,这就需要内核支持进程切换,挂起一个正在 CPU 中执行的进程,恢复执行之前挂起的进程。

2024-08-09 15:27:04 11836

原创 Linux 调试之动态打印

在 kernel 驱动代码中,使用动态输出是系统内核调试的重要手段之一,printk打印是全局的,只能设置输出等级,而且使用printk每次都要重新编译内核,很不方便。。而动态输出可以在不需要重新编译内核的情况下,方便的打印出内核的 debug 信息。动态输出可以动态选择打开某个内核子系统的输出,可以有选择性地打开某些模块的输出,printk被dev_infodev_dbgdev_err之类的函数代替,dev_xxx函数的本质还是使用printk打印的,只是对printk进行了一层包装。

2024-08-08 16:09:31 12194

原创 Linux 下查看 CPU 使用率

Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。为了维护 CPU 时间, Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数。每发生一次时间中断,Jiffies 的值就加 1。节拍率 HZ 是内核的可配选项,可以设置为 100、250、1000 等。不同的系统可能设置不同数值。

2024-08-07 20:50:54 13845

原创 Linux 利用 ftrace 分析内核调用

在 Linux 中,ftrace是一种用于跟踪内核函数调用和事件的工具。它是一个功能强大的跟踪框架,可用于分析和调试内核性能问题。ftrace提供了多种功能,包括函数跟踪、事件记录和性能分析等。它能够记录函数的调用和返回信息,以及函数执行的路径和时间。通过跟踪这些信息,我们可以了解到内核函数的执行情况,从而定位和解决性能问题。ftrace使用了内核中的一些机制来实现跟踪功能。其中一个关键的机制是函数预编译器,它会在每个内核函数的入口和出口处插入一些特殊的指令,用于记录函数的调用和返回信息。

2024-08-07 16:27:35 13153

原创 Linux 中 core dump 异常的分析

在 UNIX 系统中,常将“主内存称为核心(core),因为在使用半导体作为内存材料之前,便是使用核心(core)。而核心映像(core image)就是 “进程”(process)执行当时的内存内容。当进程发生错误或收到 “信号”(signal)而终止执行时,系统会将核心映像写入一个文件,以作为调试之用,这就是所谓的核心转储(core dump)。Core dump是指在程序异常终止时,操作系统将程序的内存映像保存到磁盘上的一种机制。

2024-08-06 21:52:00 13745

原创 Linux 利用 iostat 和 iotop 进行 IO 分析

在Linux 系统上,iostat和iotop这两个 IO 数据工具非常常用。它们都是性能分析领域中不可缺少的工具性软件。如果 Linux 系统性能变慢,我们会用top命令 来查看系统性能。它被用来检查是什么进程在服务器上占有如此高的使用率,对于大多数 Linux 系统管理员来说很常见,现实世界中被 Linux 系统管理员广泛采用。如果在进程输出中你没有看到很大的不同,你仍然有选择查看其他东西。比如你可以在top。

2024-08-06 18:18:55 14095

原创 Linux 下 perf 的使用

perf 是一个性能分析工具(基于 Linux 内核提供的性能事件perf_event口),用于对 Linux 系统进行性能调优和性能分析。它可以通过收集硬件性能计数器、跟踪系统事件和采样程序调用栈等方式来提供详细的性能统计信息。perf 依赖事件进行统计,这里的事件是通过采样机制,并不是 clock 级别的统计;根据使用 perf 工具的不同按测量事件的类型进行统计。

2024-08-05 22:38:19 14522

原创 Linux 下 ag 命令的使用

在 Linux 系统中,ag 命令是用于文本搜索的高效工具。它具有快速、灵活的搜索功能,并支持正则表达式匹配。

2024-08-05 21:01:48 13736

原创 Linux 下 objdump 命令的使用

objdump 工具是用来显示二进制文件的信息,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。该命令常用于 Linux下反汇编目标文件或者可执行文件。

2024-08-04 21:17:52 14362

原创 Linux 进程调度(一)之初识进程

在下面的描述中,我们假定用 prev 局部变量表示切换出的进程的描述符,next 表示切换进的进程的描述符。操作系统会自动处理僵尸进程,但如果父进程长时间不处理,可以通过重新编写父进程的代码,在合适的时机调用 wait() 来清理僵尸进程。所有进程的祖先叫做进程 0,idle 进程或因为历史的原因叫做 swapper 进程,它是在 Linux 的初始化阶段从无到有创建的一个内核线程。为了控制进程的执行,内核必须有能力挂起正在 CPU 上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换(

2024-07-31 22:08:22 15928

原创 Linux 内存管理(八)之 slab 分配器

在 Linux 内存管理(七)之伙伴系统算法一节中,我们学习了 Linux 内核如何使用伙伴系统算法以页为单位管理内存,进行内存分配。这一节,将要提到的 slab 算法也是一种内存分配算法。

2024-07-29 21:15:34 16898

原创 Linux 内存管理(七)之伙伴系统算法

伙伴系统算法是一种用来管理分配和释放内存的算法,它在 Linux 内核中被广泛使用。其设计目标是高效地管理内存碎片,并且具有快速的分配和释放速度。接下来将详细探讨一下 Linux 中的伙伴系统算法。

2024-07-24 21:01:04 18757

原创 Linux 内存管理(六)之内存管理区

为了支持 NUMA 模型,也即 CPU 对不同内存单元的访问时间可能不同,此时系统的物理内存被划分为几个节点,一个节点对应一个内存簇 bank,即每个内存簇被认为是一个节点。接着各个节点又被划分为内存管理区域,接下来将对内存管理区域进行讨论。

2024-07-23 21:52:36 18880

原创 Linux 内存管理(五)之转换后援缓存器(TLB)

在传统的地址转换方式中,每次访问内存时,CPU 都需要通过页表来查找虚拟地址到物理地址的映射关系。这个过程需要多次内存访问,从而导致较大的延迟。为了减少这种延迟,引入了一种叫做 TLB 的缓存机制,将最近使用过的映射关系存储在高速缓存中。TLB 本质上就是一块高速缓存。TLB 缓存虚拟地址和其映射的物理地址。硬件存在 TLB 后,虚拟地址到物理地址的转换过程发生了变化。虚拟地址首先发往 TLB 确认是否命中 cache,如果 TLB hit 直接可以得到物理地址。否则,一级一级查找页表获取物理地址。

2024-07-22 21:38:02 19953

原创 Linux 内存管理(四)之物理地址扩展(PAE)

在 32 位操作系统中,使用 32 位的寻址空间,最多只能表示2322^{32}232个不同的地址,即 4GB 的地址空间。这意味着无论实际物理内存有多大,操作系统最多只能寻址 4GB 的物理内存。然而,在实际应用中,特别是在服务器和高性能计算领域,需要处理大型数据集和运行大规模应用程序的情况下,4GB 的内存往往不够用。因此,引入 PAE 机制可以扩展物理地址空间,使操作系统能够支持更大的物理内存。

2024-07-21 22:38:53 20311

原创 Linux 内存管理(三)之分页机制

在早期的操作系统中,分段机制被广泛采用,但随着技术的发展,分页机制逐渐成为主流选择。接下来,我们将深入探讨分页机制的原理、工作方式以及与其他内存管理机制的比较。

2024-07-21 09:36:26 21117

原创 x86/x86_64 下的 CPU 控制寄存器

x86/x86_64 CPU 中提供了控制寄存器,来决定 CPU 的操作模式和当前执行任务的属性。这些寄存器在 32 位模式下是 32 bit,在 64 位模式中,控制寄存器扩展为 64 bit。CPU 架构中共有 CR0、CR1、CR2、CR3、CR4、CR8 共 6 个控制寄存器。

2024-07-20 23:14:37 20834

原创 Linux 内存管理(二)之GDT与LDT

在 Linux 系统中,GDT()和 LDT()是用来管理和定义内存段(segment)的数据结构。它们是在 x86 架构下操作系统使用的关键概念,用于实现内存保护和虚拟内存管理。全局描述符表(GDT在单处理器系统中只有一个 GDT,而在多处理器系统中每个 CPU 对应一个 GDT。GDT 可以放置在内存的任何位置。当程序员通过段寄存器引用一个段描述符时,CPU 必须知道 GDT 的入口地址,即基地址放在何处。为此,Intel 的设计者提供了一个 GDTR 寄存器,用于存放GDT的基地址。

2024-07-20 08:18:41 21608

原创 Linux 内存管理(一)之分段机制

Linux 操作系统采用了分段机制来实现进程的内存管理。分段允许进程以逻辑上连续的方式访问内存,而无需将整个进程存储在连续的物理内存地址上。本文将介绍 Linux 的分段机制,包括分段的基本概念、分段表的组织方式和进程访问内存的原理。我们还将讨论 Linux 中的段选择子和段描述符,以及如何使用它们来管理进程的内存空间。现在大致了解了分段的基本原理,系统运行时,地址空间中不同段被重定位到物理内存中,与之前的整个物理地址空间中只有一个基地址+偏移量的方式相比,大量的节省了物理内存。

2024-07-19 14:58:02 21804

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除