- 博客(407)
- 资源 (2)
- 收藏
- 关注
原创 RTOS系列文章(17)-- 为什么RTOS选择PendSV实现任务切换?(从硬件机制到RTOS设计的终极答案)
在实时操作系统(RTOS)中,任务切换需兼顾安全性与实时性。Cortex-M的PendSV(可挂起服务调用)通过优先级隔离与原子性保障,成为任务切换的核心机制。PendSV被设为最低优先级,确保其执行前所有高优先级中断已处理完毕,形成“安全窗口”。切换时,RTOS(如FreeRTOS)通过BASEPRI屏蔽低优先级中断,或(如uC/OS)直接禁止中断,实现上下文保存/恢复的原子操作,避免被意外打断。这种设计解耦了调度决策(SysTick)与切换执行(PendSV),既减少高优先级中断的延迟,又防止数据损坏
2025-03-22 22:23:00
987
原创 深入探讨 Rust 与 C 的对比及其在内存安全和跨语言调用中的应用
Rust 提供了强大的内存安全机制,通过所有权和生命周期检查来避免内存泄漏、踩内存等问题。与 C 不同,Rust 通过编译时检查显著减少了内存错误。Rust 可以调用 C 函数,C 也可以调用 Rust 编写的库,这为 Rust 与其他语言的集成提供了灵活性。尽管 Rust 在内存管理和并发方面提供了极大的保障,但它不能完全消除程序员的逻辑错误,开发者仍需谨慎处理业务逻辑。
2024-12-21 22:01:32
1730
1
原创 深入解析DNS请求与响应报文—基于RFC1035的逐字节分析
通过逐字节分析DNS请求与响应报文,我们可以深入了解DNS的工作原理和报文结构。结合RFC 1035中的规范,能够更好地理解DNS如何在网络中执行域名解析任务。希望这篇博客对你理解DNS协议有帮助!
2024-10-20 22:37:05
1478
原创 QuickJS快速体验:在C程序代码中调用JS脚本并执行
JS(JavaScript)是一种轻量级的面向对象的编程语言,目前使用非常广泛,既能在浏览器中使用,也能在服务器端作为后台(借助node.s),并且由于其是解释型语言,不需要提前编译,所以它就有了一个特别大的优势,它支持热更新(可以实现极其轻量级的OTA),所以这些年在嵌入式Linux中,有很多场景也开始引入了JS。不过JS也有缺点,因为是解释性语言,所以执行效率相比二进制编译语言,比如C,相对低。本文主要介绍借助QuickJS来体验一下再C程序代码中如何调用JS代码。
2024-01-21 22:06:21
2052
1
原创 LwIP系列(6):TCP client 连接服务器3次握手代码流程简单分析
在上一篇文章中,我们详细描述了TCP 3次握手、4次挥手、状态机转换,本文从lwip的代码维度,分析下tcp client的发起连接的流程,之所以单独分析tcp client,是因为嵌入式设备,client使用场景较多。
2023-08-15 22:34:38
731
原创 LwIP系列(5):TCP 3次握手+4次挥手+状态机转换
防止旧的重复连接,引起连接混乱。client与server之间同步初始化序列号。3次握手能够在通信信道不保证可靠情况下,从软件流程上,保证TCP通信可靠的最小代价。
2023-07-09 19:24:32
1595
原创 LwIP系列(4):ARP协详解
对于应用程序而言,我们与其他设备、服务通信,主要通过域名、IP进行通信,而以太网底层驱动,最终是通过MAC地址来表示设备的唯一标识,即IP是逻辑地址,并不是物理地址。在上一篇文章中,我们也能看到以太网帧首部中,就包含了源、目的设备的MAC的地址。所以我们需要一种IP与MAC相互转换的协议,这种协议就是ARP和RARP.ARP : Address Resolution Protocol, 根据IP地址获取MAC。
2023-07-02 21:22:55
981
原创 LwIP系列(3):以太网帧、IP、TCP、UDP、IGMP、ICMP帧格式详解
TCP/IP 本质上是软件协议,而LwIP也是对软件协议进行解析处理,所以我们有必要了解下以太网帧、IP、TCP、UDP、IGMP、ICMP帧格式,这样在代码中,才能有的放矢。
2023-06-25 20:46:09
3750
1
原创 LwIP系列(2):动态内存池管理(memp.c)详细分析
我们在学习Lwip源码时,内存管理是绕不开的一个重点,我们在看相关的代码时,经常会看到和, 其中:(1)memp_malloc是从内存池中申请内存,具体实现在memp.c + memp.h。(2)mem_malloc则是从中申请内存,具体实现在mem.c + mem.h中。这两个API的区分也很容易,“p”是pool的简称,所以memp代表从内存池,mem是从内存堆。
2023-06-18 11:58:45
2007
原创 LwIP系列(1):C语言宏定义相关基础知识(##、include 文件、宏函数、预编译)
对于嵌入式物联网技术来说,TCP/IP 协议几乎是不能绕过的,常见socket、tcp、udp、mqtt、coap、modbus-tcp、mdns、广播、组播等等,均是基于TCP/IP协议实现,无处不在。而目前在嵌入式领域,使用最多的TCP/IP协议栈就是LwIp,所以本系列尝试着从LwIP的详细分析,来入门学习TCP/IP协议。
2023-05-28 22:14:08
1207
原创 RTOS系列(17):CPU启动、创建OS任务、启动首个任务、任务切换完整流程说明
在前面的系列文章中,我们详细讲述了RTOS所需的一些重点知识点,也分析了RTOS的启动、上下文的切换流程,本文总结一下CPU启动到创建OS任务、到启动首个任务、任务切换的完整流程。
2023-05-08 22:44:28
811
1
原创 单播、组播(多播)、广播概念及C语言编程demo
日常的网络编程中,不管是TCP还是UDP,应用程序主要是基于单播,即点对点通信,对组播和广播涉及的相对少。组播、广播的应用场景:在IOT物联网领域,组播和广播一般可用作设备的搜索发现,设备启动,并且有网络能力后,会通过组播或广播,向局域网内发布自己的设备信息,然后其他设备就能够发现感兴趣的设备,进而跟这些局域网内的设备通信。
2023-03-19 22:05:41
1882
原创 hashmap哈希map是什么?什么时候需要使用hashmap?C实现hashmap示例
对于C程序员,尤其是嵌入式C程序员,hashmap使用的相对较少,所以会略显陌生,hashmap其实涉及到2个概念,分别是哈希(hash)、map。哈希hash:是把任意长度输入通过蓝列算法变换成固定长度的输出,这种转换是一种压缩映射,一般不可逆。这是专业的解释,我们常说的crc16、crc32、lrc、md5、sha256等,本质上都是哈希hash,只不过散列算法不同而已。
2022-12-25 22:04:21
1960
原创 Coap协议RFC7252英文版地址 + 常见工业通信协议集合
整理了常用的工业通信协议、Coap协议,为了让大家方便使用,统一放置到gitee仓库,仓库地址如下:《》
2022-12-08 21:22:42
614
1
原创 gdb系列1:gdb基本原理概述、quickStart快速体验
嵌入式开发,debug不可或缺,每个人有每个人的debug思路,概况来说,基本上有两种,分别为使用debug工具,或基于debug log日志调试。其中debug工具,如果我们使用IDE开发程序,一些强大的IDE工具可以帮助我们便捷的debug程序,但是在Linux平台下的嵌入式开发,是没有特别好用的IDE的,所以gdb就出现了,gdb实现的功能类似我们RTOS开发环境中的keil、IAR提供的调试工具,只不过gdb是完全独立的工具。
2022-11-01 22:41:39
604
原创 RTOS系列(16):从0到1写一个简单、易懂、易用的RTOS ——K2OS 启动首个任务原理介绍
CPU从上电启动到OS接管,启动首个任务过程中,背后发生了很多动作,涉及的知识点也非常多,所以我们有必要详细分析一下RTOS启动首个任务的原理。
2022-09-03 22:31:00
892
1
原创 RTOS系列(15):从0到1写一个简单、易懂、易用的RTOS ——K2OS
前面的系列文章中,我们详细的分析了RTOS所依赖的各种基础知识点,文章即便写的再详细,相信很多人对RTOS仍然会觉得有点模糊,引用一句经典程序员术语:从本篇开始,我们从0到1写一个RTOS,通过自己动手,彻底搞清楚RTOS的运行机制。我们这款RTOS起名为K2OS(Keep simple、stupid OS),欢迎大家下载体验。
2022-09-03 22:08:52
1538
1
原创 RTOS系列(14):提升RTOS实时性的算法技巧分析
在一般的应用程序开发中,我们很少会关注程序性能、实时性问题,一方面是因为CPU的硬件资源已经够用,另一方面就是一般的应用程序对于性能、实时性的要求并不会太高,几十毫秒的延时,可能对于多说应用程序的逻辑都是没有太大影响的。但是对于RTOS的代码,我们就需要重点关注代码是否高效、毕竟RTOS的R 是Real time的含义,即对实时性要求很高。...
2022-08-21 22:34:07
1575
2
原创 RTOS系列(13):汇编LDR指令、LDR伪指令、[Rn]寄存器间接引用 详细解析
汇编LDR指令在RTOS中使用的比较频繁,尤其是在PendSV中进行上下文切换的时候,LDR指令是不可缺少的,我们在看uC/OS、FreeRTOS、RT-Thread的源码时,都能够看到LDR的身影。由于LDR指令有2个名字LDR指令、LDR伪指令,这就给我们理解LDR带来了困难,很容易混淆。本文就详细分析一下汇编LDR、[Rn]间接引用的原理。......
2022-07-24 12:17:28
3889
原创 RTOS系列(12):使用SVC或PendSV启动OS流程详细分析
RTOS系列(1):基础知识——中断嵌套RTOS系列文章(2):PendSV功能,为什么需要PendSVRTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低RTOS系列文章(4): MDK软件仿真 + Debug-(printf)-Viewer使用方法RTOS系列文章(5):C语言程序运行原理分析:汇编、栈、栈帧、进栈、出栈、保存现场、恢复现场、返回RTOS系列文章(6):Cortex-M3/4之SP,MSP,PSP,Thread模式、Handler模式、内核态、用户态
2022-07-10 22:33:16
3310
3
原创 RTOS系列文章(11):RTOS启动方式——直接设置CONTROL寄存器、SVC启动、PendSV启动
RTOS系列(1):基础知识——中断嵌套RTOS系列文章(2):PendSV功能,为什么需要PendSVRTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低RTOS系列文章(4): MDK软件仿真 + Debug-(printf)-Viewer使用方法RTOS系列文章(5):C语言程序运行原理分析:汇编、栈、栈帧、进栈、出栈、保存现场、恢复现场、返回RTOS系列文章(6):Cortex-M3/4之SP,MSP,PSP,Thread模式、Handler模式、内核态、用户态
2022-07-10 10:06:59
2170
3
原创 RTOS系列文章(10):简单OS示例分析
RTOS系列(1):基础知识——中断嵌套RTOS系列文章(2):PendSV功能,为什么需要PendSVRTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低RTOS系列文章(4): MDK软件仿真 + Debug-(printf)-Viewer使用方法RTOS系列文章(5):C语言程序运行原理分析:汇编、栈、栈帧、进栈、出栈、保存现场、恢复现场、返回RTOS系列文章(6):Cortex-M3/4之SP,MSP,PSP,Thread模式、Handler模式、内核态、用户态
2022-07-05 22:55:34
1776
5
原创 RTOS系列文章(9):再次分析栈帧、函数调用与中断调用的区别
在前面的系列文章中,尤其是CM3/4之LR寄存器、EXC_RETURN深入分析 中我们简单的分析了一些函数调用与中断调用的流程,那篇文章也基本上能说明函数调用和中断调用的一些区别,本文将基于栈帧的概念,再次分析一下两者之间的相同点和不通点。栈帧是一个非常专业的概念,很惭愧的说,在没有深入分析RTOS之前,我也不曾了解栈帧这一概念,之前只是大概了解到函数调用需要堆栈存放局部、临时变量,但是栈帧这个概念确实时从未关注过。我们先引入《The Definitive guide to ARM Cortex M3/4》
2022-06-06 22:03:24
1761
3
原创 RTOS系列文章(8):深入分析中断处理过程
在上一篇文章中,我们深入分析了函数调用返回、中断调用返回使用的LR和EXC_TURN,也简单说明了函数调用流程、中断调用流程。在FreeRTOS中,任务的调度是通过SysTick + PendSV 中断来实现的,尤其在PenSV中断中进行任务上下文切换原理,是理解FreeRTOS任务调度原理的重中之重。而SysTick和PendSV都是中断,所以我们有必要深入分析一下在ARM CM3/4中中断的完整处理流程。整体流程如下:接下来我们直接引用《The definitive guide to ARM Corte
2022-06-04 22:54:10
4434
4
原创 RTOS系列文章(7):CM3/4之LR寄存器、EXC_RETURN深入分析
在Cortex-M3/4中有个特殊的寄存器R14,这个寄存器还有一个大家熟知的名字LR,LR全称为Link Register,有的书本上会翻译成链接寄存器。该寄存器一般用于存放函数退出返回地址。除了函数调用返回使用,中断退出也会使用LR,不过中断返回机制与函数返回机制会有一些细节不通,中断返回虽然也是通过LR,但是还会有EXC_RETURN辅助。这里我们直接引用《The definitive guide to ARM Cortex-M3/4》中对LR的介绍:翻译过来,有如下重点知识:如上面描述,LR是链
2022-06-04 18:46:39
5755
5
原创 RTOS系列文章(6):Cortex-M3/4之SP,MSP,PSP,Thread模式、Handler模式、内核态、用户态
FreeRTOS系列(1):基础知识——中断嵌套FreeRTOS系列文章(2):PendSV功能,为什么需要PendSVFreeRTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低FreeRTOS系列文章(4): MDK软件仿真 + Debug-(printf)-Viewer使用方法FreeRTOS系列文章(5):C语言程序运行原理分析:汇编、栈、栈帧、进栈、出栈、保存现场、恢复现场、返回在深入分析RTOS调度之前,我们还需要了解一下Cortex-M3/4的工作模式以及双
2022-06-03 18:50:15
10264
14
原创 RTOS系列文章(5):C语言程序运行原理分析:汇编、栈、栈帧、进栈、出栈、保存现场、恢复现场、返回
C源程序; Reset handlerReset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0
2022-05-28 19:10:46
3740
2
原创 RTOS系列文章(4): MDK软件仿真 + Debug-(printf)-Viewer使用方法
背景MDK具有强大的软件仿真能力,这里的仿真不是仿真虚拟的CPU,而是仿真我们工程中使用的CPU,简单的说,我们在MDK中的工程文件,只要CPU型号是MDK本地支持的,都可以使用仿真器直接仿真,而不依赖真实的硬件。仿真器除了常规的寄存器、堆栈信息,还可以使用自带的print打印窗口。但是如果使用printf功能,需要重定向fput函数。在后续的文章中,我们会使用软件仿真来学习分析FreeRTOS具体步骤1. 勾选[User MircroLIB]2. 仿真Debug设置3. fput 重
2022-05-21 18:02:17
2248
原创 RTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低
FreeRTOS系列(1):基础知识——中断嵌套FreeRTOS系列文章(2):PendSV功能,为什么需要PendSV前言在上一篇文章中,我们详细分析了PendSV的功能,也分析了SysTick和PendSV结合,实现OS任务调度,简单的分析了SysTick的优先级。我觉得有必要针对SysTick的优先级,单独写一篇文章分析。结论概述嵌入式实时OS的【实时】不仅仅是OS对任务调度及时,更重要的是要求嵌入式OS具有【可剥夺/抢占】的特性,既允许高优先级任务抢占低优先级任务,又要允许外部中断能够抢占
2022-05-17 21:43:12
6379
13
原创 RTOS系列文章(2):PendSV功能,为什么需要PendSV
背景大多数嵌入式RTOS在Cortex-M3/M4上的移植都需要PendSV,比如uCOS、RT-Thread、FreeRTOS等,本文就对PendSV的功能作用,以及为什么需要PendSV进行详细的分析。PendSV是什么?我们先引用《Cortex-M3权威指南》对PendSV的介绍:PendSV(可悬起的系统调用),它是一种CPU系统级别的异常,它可以像普通外设中断一样被悬起,而不会像SVC服务那样,因为没有及时响应处理,而触发Fault。个人理解PendSV的英文全称应该是:Pend S
2022-05-17 20:55:58
17873
19
原创 RTOS系列(1):基础知识——中断嵌套
背景我们在单片机编程,嵌入式RTOS编程,甚至其他OS下的系统编程时,可能会忽略“中断嵌套”背景知识,在之前的工作和编码过程中,我也没有深入的了解或者注意过“中断嵌套”,直到当我想要深入了解嵌入式RTOS的运行原理时,才发现,原来“中断嵌套”的概念是如此的重要,以至于各种RTOS的基础配置,以及设计,都是围绕着“中断嵌套”的机制来设计和配置的。什么是中断嵌套中断嵌套的书面解释如下:中断嵌套指中断系统正在执行一个中断服务L时,有另一个优先级更高的中断H触发,这时中断系统会暂时中止当前正在执行低优先级
2022-05-15 22:00:13
13862
6
原创 一个非常好的各种算法动画图演示网站
http://www.u396.com/wp-content/collection/data-structure-visualizations/
2022-04-23 22:19:57
2525
转载 AliOS Things代码风格
原地址AliOS Things代码风格1. 前言本文是AliOS Things提供的一套C语言代码规范,适用的对象为符合C99标准的C语言工程。2. 命名本节内容均为建议,不作强制要求。2.1. 总则各种命名均使用英文单词及其缩写,非特殊情况不能使用汉语拼音或其他语言。2.2. 文件命名文件名全部使用小写字母,用_连接。源文件使用.c后缀。头文件使用.h后缀。2.3. 类型命名2.3.1. 简单类型命名使用typedef自定义的简单类型命名全部使用小写字母,用_连接,以_t结尾。
2022-04-23 18:52:00
246
原创 深入理解Linux 条件变量3:条件变量为什么要配合着锁使用?
https://zhuanlan.zhihu.com/p/55123862为什么要与pthread_mutex 一起使用呢? 这是为了应对 线程1在调用pthread_cond_wait()但线程1还没有进入wait cond的状态的时候,此时线程2调用了 cond_singal 的情况。 如果不用mutex锁的话,这个cond_singal就丢失了。加了锁的情况是,线程2必须等到 mutex 被释放(也就是 pthread_cod_wait() 释放锁并进入wait_cond状态 ,此时线程2上锁) 的
2022-03-30 22:31:40
3547
2
原创 Linux时间相关知识小结:struct timeval、timespec、gettimeofday、time、localtime....
前言我们在linux平台进行开发时,时间相关的操作基本上都会遇到,本文就对常用的时间相关的结构体、接口进行分析小结。常见类型、结构体定义timespec原型struct timespec{ __time_t tv_sec; /* Seconds. 秒 */ __syscall_slong_t tv_nsec; /* Nanoseconds. 纳秒*/};说明该结构体只是包括秒和纳秒,并没有任何其他含义,比如1970年以来的秒数等。只是个存放空间。为clock_gettime的
2022-02-06 22:49:52
5301
原创 Visual Paradigm简单教程(2):绘制序列图
Visual Paradigm简单教程(1):绘制状态机图1. 前言在上一篇文章中,介绍了使用Visual Paradigm简单教程(1):绘制状态机图,本文我们接着介绍如何使用visual paradigm绘制序列图。2. 相关概念2.1 序列图概念所谓序列图可以理解为软件不同部分,比如组件之间的交互序列图,序列2字说明了交互序列流程,比如我们想要描述一个软件的使用顺序、业务流程顺序等待,都可以通过序列图来实现。2.2 生命线这里使用“生命线”可能不够形象,个人理解 应该称为 节点,即序列图
2022-01-15 21:40:02
11109
4
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人