- 博客(101)
- 收藏
- 关注

原创 计算机体系结构之多级缓存、缓存miss及缓存hit(二)
多级缓存、缓存miss以及缓存hit存在的意义是为了保持成本效益的同时,尽可能地提高计算机系统的性能和效率。它们是现代处理器设计中关键的元素,对于提高用户体验和系统吞吐量是占据至关重要的一环。
2024-11-07 08:00:00
1515
2

原创 微控制器(MCU)如何运行存储在Flash的程序???
以上应该是可以帮助大家了解关于存储在Flash的程序至RAM运行的过程,当然,可能涉及其他的知识点(缓存机制、为什么要有缓存?、缓存MISS会发生什么?、多级缓存的目的是什么?又有什么优点?。。。。。。)大家不是很了解,作者会持续更新维护文章,充分将各个知识点进行相关联。这里也解释下为什么不在此文章中做发散,嵌入式领域知识体系之广泛,并不能通过寥寥万字/十几万字可以解释的,其知识体系在兼容的同时是不断更新迭代,做这一行毕生都将持续学习,所以作者只能针对单个知识点逐一讲解。
2024-11-05 11:00:04
2474

原创 C语言函数指针及其应用
在C语言中,函数指针的应用是非常广泛的,也许初学C的新星暂未接触,初入嵌入式行业者暂未实践,故,最近会针对C语言的实战应用以及作者在项目中的所见所闻所解决的问题一一盘点。
2024-10-24 10:33:17
1110

原创 Modbus协议概述及实例详解(二)附源码
通过上一篇《Modbus协议概述及实例详解(一)》相信大家已经了解到Modbus的相关原理以及应用,也了解到了Modbus中在RTU/ASCII/TCP三种协中必不可少协议RTU协议。本章将详细讲解关于Modbus RTU协议的相关内容并附带源码一份,以帮助有需要的读者朋友可以快速开发迭代自己的软件。
2024-10-21 14:27:11
1357

原创 Modbus协议概述及实例详解(一)
Modbus是一种串行通信协议,最初是由Modicon公司(现为施耐德电气的一部分)在1979年开发,用于实现PLC之间的通信。由于其开放性和可靠性,Modbus已成为工业领域事实上的标准通信协议之一。当然啦,在嵌入式行业也同样流行,比如常见的电源行业,开关电源、模拟电源和数字电源等。
2024-10-21 10:58:27
582

原创 原码、反码、补码与移码详解
在计算机系统中,原码、反码、补码与移码是用来做什么的?分别又有什么作用?它们为什么会出现?下面通过这篇文章,咱们就来谈谈四码的相关知识点。
2024-10-19 12:51:19
1093

原创 基于IO模拟IIC与SPI驱动实现
最近项目上,由于一些变更问题,导致硬件设计上未考虑到相关GPIO是否支持硬件驱动,考虑到这两个驱动的应用场景并不普遍,基本上只有在下电与Boot升级时才可以会被应用(相信有经验的朋友以及猜出来是什么功能了),具体功能就不详说了,我们直接讲解关于IIC与SPI的模拟驱动吧。
2024-10-17 09:54:37
1105

原创 从零认识操作系统任务应用及原理
如:A/B/C三个任务均会调用函数Func()优先级由高到低,且为抢占式调度,当B任务在运行时调用函数Func(),正在函数Func中,此时A任务为就绪态,那么A任务会获取到CPU控制权,并允许函数Func(),此时是有可能破坏原任务的数据的,因为两任务有可能共用一套数据。解:在单一CPU情况下,不存在真正的多任务机制,存在的只有各个任务轮流获取CPU控制权的占用,所以其本质还是单任务或者说裸机运行,区别是在于有一个大管家管理各个任务在各个任务需要时做出最优判断,并将CPU控制权给到其任务。
2024-10-14 09:43:06
1085
原创 DMA:在不同内存空间建立目的地址的情况分析及后果
摘要 本文探讨了DMA控制器访问不同内存空间时的数据一致性问题。当DMA访问缓存地址空间时,由于CPU缓存的存在,可能产生数据不一致性,需要硬件缓存一致性机制或软件干预(如缓存行失效、写回操作)来解决。而在非缓存地址空间下,由于直接访问主存,天然不存在一致性问题,但CPU访问速度较慢。两种方式各有优劣:缓存空间适合通用数据传输但管理复杂,非缓存空间适用于设备寄存器等需要精确控制的场景。选择方案需根据具体需求权衡性能与管理复杂度。
2025-06-10 16:52:37
1172
原创 DSRAM:是什么?有什么作用?与DMA结合应用的好处有哪些?
Data ScratchPad RAM(缩写DSRAM),中文可以理解为数据 ScratchPad RAM。DSRAM 的主要作用是提供一种由软件控制的、低延迟、低功耗的数据存储区域。以优化特定应用的性能。DMA(Direct Memory Access,直接内存访问)控制器可以在不占用 CPU 资源的情况下,在内存的不同区域之间传输数据。
2025-06-10 15:18:47
637
原创 RTOS:创建队列(含源码分析)
本文分析了FreeRTOS内核中队列创建函数xQueueGenericCreate的实现逻辑。该函数首先进行参数检查,确保队列长度和项目大小合理且不会造成内存溢出。随后动态分配内存空间,包括队列控制结构和存储区。内存申请成功后,通过prvInitialiseNewQueue初始化队列参数,并标记为动态创建。函数最终返回队列句柄,失败时返回NULL。文章详细解析了各参数检查条件、内存计算方式及初始化过程,并提醒使用时需注意FreeRTOS系统初始化状态、参数合理性及内存限制等问题。该实现展现了RTOS内核严谨
2025-06-05 16:37:53
1295
1
原创 RTOS:关于静态任务创建和调度器-总结
本文分享了对嵌入式操作系统的探索历程,从最初的敬畏到实际应用中的理解。作者通过阅读RTOS-Kernel代码,解析了静态任务创建和调度器启动的实现机制:静态任务创建过程涉及任务函数、堆栈和控制块的初始化,而调度器启动则会创建空闲/定时器任务并开始任务调度。这些操作通过对任务数据结构的处理,实现了操作系统的任务管理和调度功能,体现了嵌入式系统的核心设计思想。
2025-06-04 12:55:17
281
原创 RTOS:任务MPU配置(含解析)
本文分析了RTOS-Kernel中任务MPU配置的实现过程。通过vPortStoreTaskMPUSettings函数,系统为任务栈和用户定义区域设置内存保护单元(MPU)参数。主要内容包括:1) 配置内存属性寄存器MAIR0;2) 根据栈是否位于特权SRAM区域来决定是否启用MPU保护;3) 处理用户自定义的可配置内存区域,设置访问权限属性。该实现展示了如何在嵌入式系统中通过MPU进行内存访问控制,为RTOS任务提供安全隔离机制。 关键词:RTOS、MPU配置、内存保护、任务栈、嵌入式系统
2025-06-04 09:29:13
365
原创 RTOS:初始化新任务(含源码复杂点解读)
这篇文章摘要主要讲解了RTOS内核中任务初始化的过程。作者首先分享了自己从对操作系统感到神秘到逐步掌握的心路历程,然后通过详细代码分析展示了任务控制块(TCB)的初始化实现。代码解析了关键步骤:堆栈管理(包括内存对齐和堆栈填充)、任务优先级设置、任务名称处理等核心功能,并包含了对MPU支持、堆栈增长方向等硬件相关特性的处理。文章体现了作者从裸机编程到RTOS开发的成长轨迹,旨在通过源码分析提升对操作系统原理的理解。
2025-06-03 13:43:47
367
原创 RTOS:静态任务创建-参数检查与准备(含源码复杂点解读)
本文分析了RTOS-Kernel中静态任务创建函数prvCreateStaticTask的实现细节。该函数通过接收任务代码、名称、堆栈、参数等参数,在确保内存缓冲区有效的情况下,初始化任务控制块(TCB)和堆栈空间。关键步骤包括:内存缓冲区校验、TCB结构体初始化、堆栈指针绑定,以及通过prvInitialiseNewTask完成最终任务初始化。文章通过逐行代码解析,揭示了RTOS静态任务创建的核心机制和内存管理方式,为理解嵌入式操作系统任务管理提供了技术参考。
2025-06-03 09:59:17
669
原创 RTOS:启动调度器的作用(含源码逐行解读)
本文分析了RTOS内核中启动调度器vTaskStartScheduler()的实现逻辑。该函数首先创建空闲任务,若配置了定时器则创建定时器任务,随后进行中断禁用、TLS设置等初始化工作,最终调用xPortStartScheduler启动调度器。若启动失败,通常是由于内存不足导致任务创建失败。文章揭示了操作系统中调度器启动的关键步骤,包括任务创建、中断管理和硬件相关初始化等核心机制。
2025-05-30 15:39:07
1045
原创 RTOS:静态任务创建应用接口(含源码逐行解读)
摘要 本文分析了RTOS内核中静态内存分配方式的任务创建函数xTaskCreateStatic的实现细节。该函数通过prvCreateStaticTask创建任务控制块,设置多核亲和性后,将新任务加入就绪队列。静态内存分配方式具有内存占用可控、无需动态分配、适用于汽车电子等关键领域的优势。文中还介绍了调试跟踪函数和代码覆盖率测试标记的作用,为嵌入式开发者提供了RTOS任务创建机制的深入解读和实践参考。
2025-05-30 11:24:24
445
原创 RTOS:任务控制块介绍(含源码逐行解读)
RTOS内核任务控制块(TCB)是任务管理的核心数据结构。本文基于RTOS-Kernel源码分析TCB组成:包含堆栈指针(pxDummy1)、MPU设置(xDummy2)、优先级(uxDummy5)、任务名称(ucDummy7)等基础字段,以及多核调度(uxDummy23/24)、任务通知(ulDummy18)、线程存储(pvDummy15)等扩展功能字段。这些通过条件编译宏配置的成员,完整记录了任务的运行时状态,相当于任务的"身份证",是RTOS实现任务调度和管理的关键。文章通过逐字段
2025-05-30 10:42:33
394
原创 RTOS:任务的创建与启动(源码逐行解读)
本文分享了嵌入式开发中操作系统任务创建与启用的实践。首先通过声明一个无限循环的任务函数,并使用noreturn属性优化代码;然后展示了如何定义任务控制块(TCB)和静态栈内存;最后详细解析了操作系统API xTaskCreateStatic的参数用法和调度器启动过程。文章结合RTOS-Kernel源码,为嵌入式开发者提供了从裸机编程转向RTOS开发的实用指导,重点包括任务创建接口参数配置和调度机制。(149字)
2025-05-30 09:39:48
614
原创 RTOS:什么是操作系统内核?它与裸机编程的差异又是什么?
摘要: 本文探讨了操作系统内核的概念及裸机编程与操作系统编程的区别。内核作为计算机的核心,负责资源管理、多任务处理和安全机制。裸机编程直接操控硬件,性能更优但复杂度高;操作系统编程通过内核抽象简化开发,支持多任务并提升稳定性,但存在性能开销。实际选择取决于应用场景:简单功能适合裸机,复杂任务推荐操作系统。两者各有优劣,需根据需求权衡。
2025-05-30 09:04:27
241
原创 MPU内存保护单元:为函数指定栈空间运行实现(含伪代码以及核心思想)
本文介绍了利用MPU(内存保护单元)为单个函数分配独立栈空间并检测栈溢出的实现方法。主要内容包括:1)通过全局数组为函数分配固定大小栈空间;2)配置MPU区域保护栈内存;3)函数调用前初始化栈指针;4)使用内联汇编切换栈指针实现函数调用。该方法能有效防止栈溢出,但会增加代码复杂度,需正确配置MPU区域,且依赖硬件支持。示例代码展示了在单片机上实现的完整流程,包括MPU配置和栈指针切换的关键操作。
2025-05-28 14:51:17
479
原创 MPU内存保护单元:基于TC375保护实例代码(有注解)
本文以英飞凌TC375单片机为例,展示了MPU(内存保护单元)在裸机上的使用实例。通过定义数据保护范围和代码保护范围的函数,详细介绍了如何利用MPU限制对特定内存和代码区域的访问与执行。数据保护范围函数通过设置CPU_DPR寄存器,定义了不同范围的内存保护区域,而代码保护范围函数则通过CPU_CPR寄存器,限制了对特定代码区域的执行。这些操作通过内联汇编指令__mtcr实现,并确保指令执行完毕。MPU的应用提高了系统的安全性和稳定性,防止非法访问或执行,适用于嵌入式系统的内存保护需求。
2025-05-23 17:06:24
542
原创 MPU内存保护单元:功能及其行业内的重要地位介绍
MPU(内存保护单元)是嵌入式系统中用于内存保护的硬件设备,通过划分内存区域、控制访问权限、检测错误和隔离任务等功能,提升系统的稳定性和安全性。MPU的核心功能包括内存区域划分、访问权限控制、错误检测与响应、任务隔离、堆栈保护和外设访问控制。在嵌入式系统中,MPU的重要性体现在提高系统可靠性、增强安全性、满足安全标准要求以及简化系统设计。随着嵌入式系统应用场景的扩展,MPU保护在保障系统安全方面发挥着关键作用。后续将介绍MPU在裸机开发和操作系统中的实际应用及示例代码。
2025-05-23 14:36:07
369
原创 MPU内存保护单元:保护策略
MPU(内存保护单元)保护策略通过内存区域划分、访问权限控制、错误检测与响应、任务隔离、堆栈保护、外设访问控制和安全上下文切换等措施,提升嵌入式系统的安全性和稳定性。内存区域可划分为固定和动态区域,访问权限包括只读、读写、不可访问和执行。MPU能检测非法访问并触发中断、记录日志或系统重置。任务隔离通过专有内存和共享内存管理实现,堆栈保护则限制大小和访问权限。外设访问控制通过内存映射和权限设置确保安全。安全上下文切换保存和恢复MPU配置,保障任务切换时的安全性。这些策略有效防止非法访问和数据篡改,确保系统在关
2025-05-23 14:35:52
346
原创 MarkDown语言语法介绍、应用及示例
本文介绍了Markdown的基本语法及其应用。Markdown是一种轻量级标记语言,适用于撰写博客、文档等。文章详细讲解了标题、强调、列表、链接、图片、引用、代码、表格、分隔线和脚注的语法,并提供了相应的示例。通过这些基础语法,用户可以快速掌握Markdown的使用,提升文档编写的效率和可读性。
2025-05-22 11:22:26
863
原创 全局变量:是什么?误用场景?用途?最佳实践!
全局变量在C语言中具有重要作用,但其使用需谨慎。全局变量定义在所有函数外部,生命周期贯穿整个程序,存储在静态存储区,作用域默认为整个程序。滥用全局变量会导致代码耦合度高、难以调试、影响性能和维护困难。然而,全局变量在记录程序状态、模块间通信、性能优化和简化代码方面仍有其价值。为减少滥用,建议尽量减少使用、封装全局变量、使用const修饰、避免多线程中的使用,并合理组织全局变量。总之,合理使用全局变量能提升程序效率,但需遵循最佳实践以避免潜在问题。
2025-05-21 10:52:00
463
原创 设备与驱动:SPI设备
嵌入式系统中常见的I/O设备包括显示屏、串口通信、模拟数据采样、Flash/SD卡和以太网接口等。本专栏介绍了RT-Thread如何管理这些设备,旨在提高代码复用性、降低耦合性,实现硬件更换时软件无需修改的目标。专栏内容涵盖UART、PIN、ADC、DAC、CAN、I2C、PWM和SPI等设备的管理方法。特别详细介绍了SPI(串行外设接口)的工作原理,包括其四种工作模式(CPOL和CPHA的组合)、QSPI、Dual SPI和Quad SPI的区别,以及如何通过自定义数据结构控制数据传输。通过这些内容,读者
2025-05-09 16:42:12
817
原创 PWM互补输出及应用
PWM互补输出(Complementary PWM)是指由定时器生成的一对逻辑状态互为反相的PWM信号。例如:主PWM信号(PWMx)高电平时,互补信号(PWMxN)为低电平;主PWM信号为低电平时,互补信号为高电平。这种信号配置常用于驱动H桥、全桥或半桥电路中的功率开关器件(如MOSFET或IGBT),确保上下桥臂交替导通,避免同时导通造成的短路。PWM互补输出通过生成一对互为反相的PWM信号,结合死区时间控制,广泛应用于电机驱动、功率控制和逆变器等领域。
2025-05-09 09:00:00
764
原创 设备与驱动:PWM设备
PWM(Pulse Width Modulation)也称脉冲宽度调制,是一种对模拟信号电平进行数字编码的方法,通过不同频率脉冲使用方波的占空比用来对一个具体模拟信号的电平进行编码,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替所需要波形的设备。如上图所示:是一个简单的PWM原理示意图,假定定时器工作模式为向上计数,当计数值小于阈值时,则输出一种电平状态,比如高电平;当计数值大于阈值时,则输出相反的电平状态,比如低电平。当计数值达到最大值时,计数器从0开始重新计数,又回到最初的电平状态。
2025-05-09 08:45:00
286
原创 设备与驱动:I2C设备
I2C(Inter Integrated Circuit)总线时PHILIPS公司开发的一种半双工、双向二线制同步串行总线。I2C总线传输数据时只需两根信号线,一根是双向数据线SDA(serial data),另一根是双向时钟线(serial clock)。SPI总线有两根线分别用于主从设备之间接收数据和发送数据,而I2C总线只使用一根线进行数据收发。
2025-05-09 08:30:00
1499
原创 设备与驱动:CAN设备
CAN 是控制器局域网络 (Controller Area Network, CAN) 的简称,是由以研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。CAN 的连接示意图如下图所示:CAN总线有如下特点:CAN 总线是可同时连接多个单元的总线。
2025-05-08 09:00:00
803
原创 设备与驱动:DAC设备
DAC(Digital-to-Analog Converter)指数模转换器。是指把二进制数字量形式的离散数字信号转换为连续变化的模拟信号的器件。在数字世界中,要处理不稳定和动态的模拟信号并不容易,基于DAC的特性,在各种不同的产品中都可以找到它的身影。与之相应的ADC(Analog-to-Digital Converter),它是DAC数模转换的逆向过程。DAC主要应用与音频放大、视频编码、电机控制、数字电位计‘开关电源输出控制等。
2025-05-08 08:45:00
1276
原创 设备与驱动:ADC设备
ADC(Analog-to-Digital Converter)指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号,例如:温度、压力、声音或者图像等,需要转换成容易存储、处理和发射的数字形式。模数转换器就可以实现这个功能,在各种不同产品中都可以找到它们的身影。与之相对应的DAC(Digital-to-Analog Converter),它是ADC模数转换的逆向过程。ADC最早用于对无线信号向数字信号转换。如电视信号、长短播电台发射接收等。
2025-05-08 08:30:00
672
原创 DMA技术原理
是英文Direct Memory Access(直接内存访问)的缩写,主要指无需CPU介入下的外设、内存、子系统之间的数据交换技术。是指交换数据的双方(或双方的控制者)不直接参与与数据传输的技术,不再局限于CPU构建的系统。
2025-05-07 15:10:11
791
原创 设备与驱动:PIN设备
芯片上的引脚一般分为4类:电源、时钟、控制与I/O,I/O口在使用模式上又分为General Purpose Input Output(通用输入/输出),简称GPIO,与功能复用I/O(如SPI/I2C/UART等)。
2025-05-07 08:45:00
807
原创 设备与驱动:UART设备
UART(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器,UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。UART串口的特点是将数据一位一位地顺序传送,只要两根传输线就可以实现双向通信,一根线发送数据的同时用另一根线接收数据。
2025-05-07 08:30:00
1029
原创 设备与驱动:I/O设备模型
大部分的嵌入式系统都包括一些I/O设备,例如仪器上的数据显示屏、工业设备上的串口通信、数据采集设备上模拟数据采样、用于保存数据的Flash/SD卡以及网络设备上的以太网接口等,都是嵌入式系统中容易找到的I/O设备例子。 本专栏主要是分享RT-Thread是如何对不同的I/O设备进行管理的。读完本专栏,我们会了解到如何从宏观角度去管理I/O设备,为我们在编写代码时有一个参考的管理模型,从而提高我们代码的复用性、降低耦合性,从而实现换硬件不动软件的目标。.
2025-05-06 15:02:00
1473
原创 操作系统:SMP内核接口
在初始化次级CPU的过程中,每个CPU需要使能各自的tick定时器,并注册相应的tick中断处理器函数。通过将就绪任务放入到某个CPU局部就绪任务列表中,RT-Thread允许将任务与CPU绑定,即该任务只能够在指定的CPU上。除此之外,CPU0还通过tick计数来更新系统时间,并提供系统定时器的功能,次级CPU不需要提供这些功能。当单个CPU上运行的任务改变了系统状态,或者触发了某个事件,需要通过处理器间中断通知其他CPU,其他CPU在收到该信号后,调用注册的相应例程进行处理。
2025-04-28 16:36:39
262
原创 操作系统:多核调度(RT-Thread)
1)如果他不是CPU绑定的任务,则把它挂入全局就绪表,并向其它的所有CPU发送IP(Intel-Processor Interrupt处理期间中断)中断,通知它们检查是否需要切换任务,因为其它CPU的当前任务的优先级可能低于此就绪态任务,因而会发生优先级抢占。当CPU需要切换任务执行时,任务调度器查找系统中优先级最高的就绪任务执行,即全局就绪任务表和当前CPU的局部就绪任务表中任务优先级最高的任务。2)CPU局部就绪任务表,每个CPU对应一个表,包含绑定到对应CPU的就绪任务。任务正在某个CPU上执行。
2025-04-28 15:46:17
231
原创 操作系统:原子操作简介及API
在应用层面,原子操作可以用于实现一些高级的同步和并发控制机制。通常,在操作系统中,可以采取开关全局中断、调度器上锁等方式对临界区资源进行保护,其他OS也会提供类似的操作,若采用原子操作后可以提供临界区代码的执行效率,大幅度提升系统的运行效率,同时也会在一定程度上降低编程的复杂度。可以看到对于编码的工程师,执行一个i++的操作仅需一行代码,在编译后i++就会被翻译成三条指令,所以在这三条指令之间是可能会被系统调用、中断等事件打断的,因而我们在一些场景就需要一气呵成完成上述操作,原子操作就具备这样的能力。
2025-04-28 11:12:22
363
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人