【UCOSIII源码阅读笔记】第四篇——临界区

一、获取uC/OS-III源码1. 到官网下载2. 某度网盘直接下载二、建立stm32 hal库工程三、复制uC/OS-III文件到工程文件夹四、添加工程组件和头文件路径1. 添加工程分组 在以下位置处将PendSV_Handler和SysTick_Handler改为OS_CPU_PendSVHandler和OS_CPU_SysTickHandler。#ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间。#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候。进入官网下载:http://micrium.com/downloadcenter/,选中以下文件,Add。 阅读详情

前言

本文对ucosiii中的临界区代码进行分析

正文

ucos源码中经常出现如下代码:

CPU_SR_ALLOC();
OS_CRITICAL_ENTER();
OS_CRITICAL_EXIT_NO_SCHED();

这是为了开启临界区,临界区内将不会出现任务切换。
假设没有临界区,如果有甲乙两个任务,甲要执行一段代码把abc三个值设置成123,如果甲把ab设置完12后出现任务切换,切换到任务乙,乙要把a设置成3,那么切换回来后,甲继续把c设置成3,这时甲认为abc的值为123,实际上却是323。
在OS_CRITICAL_ENTER()和OS_CRITICAL_EXIT_NO_SCHED()之间的代码称为临界区,临界区内将不会产生任务切换。
CPU_SR_ALLOC()的源码如下:

#define  CPU_SR_ALLOC()             CPU_SR  cpu_sr = (CPU_SR)0

只是声明了一个变量cpu_sr
OS_CRITICAL_ENTER()的源码如下:

#define  OS_CRITICAL_ENTER()                                       \
         do {                                                      \
             CPU_CRITICAL_ENTER();                                 \
             OSSchedLockNestingCtr++;                              \
             if (OSSchedLockNestingCtr == 1u) {                    \
                 OS_SCHED_LOCK_TIME_MEAS_START();                  \
             }                                                     \
             CPU_CRITICAL_EXIT();                                  \
         } while (0)

CPU_CRITICAL_ENTER()是为了关闭系统中断,CPU_CRITICAL_EXIT()是为了开启系统中断,核心部分是OSSchedLockNestingCtr++,
OS_CRITICAL_EXIT_NO_SCHED()源码为:

#define  OS_CRITICAL_EXIT_NO_SCHED()                               \
         do {                                                      \
             CPU_CRITICAL_ENTER();                                 \
             OSSchedLockNestingCtr--;                              \
             if (OSSchedLockNestingCtr == (OS_NESTING_CTR)0) {     \
                 OS_SCHED_LOCK_TIME_MEAS_STOP();                   \
             }                                                     \
             CPU_CRITICAL_EXIT();                                  \
         } while (0

其中的核心为OSSchedLockNestingCtr--;
接下来对OSSchedLockNestingCtr变量进行分析,起到重要作用的两处是在OSSched (void)函数和OSIntExit (void)函数里,两个函数中都有如下代码:

    if (OSSchedLockNestingCtr > (OS_NESTING_CTR)0) {        /* Scheduler still locked?                                
        return;
    }

可见两个函数都是判断到OSSchedLockNestingCtr不为0就不会执行。
两个函数的最后分别调用了:

#define  OS_TASK_SW()               NVIC_INT_CTRL = NVIC_PENDSVSET
#define  OSIntCtxSw()               NVIC_INT_CTRL = NVIC_PENDSVSET

这两个宏都是开启PendSV中断,进行任务切换,对PendSV的分析可以看【UCOSIII源码阅读笔记】第三篇——PendSV异常处理分析
所以开启临界区的最终目的是阻止开启PendSV中断,也就是阻止开启任务切换。
而对于应用层来说,ucos提供了两个函数用来实现OSSchedLockNestingCtr++和OSSchedLockNestingCtr--
分别是:
void OSSchedLock (OS_ERR *p_err) 任务切换加锁
void OSSchedUnlock (OS_ERR *p_err) 任务切换解锁
通过这两个函数对一段代码进行加锁保护,就可以防止出现访问冲突了。

别光看官方文档了!手把手带你拆解UCOSIII官方例程的源码结构(附文件功能速查表) 本文深入拆解UCOSIII官方例程的源码结构,提供详细的文件功能解析和实用速查表。从工程目录导航到内核源码解剖,再到硬件抽象层揭秘,帮助开发者快速掌握UCOSIII的核心架构和关键配置技巧,提升嵌入式开发效率。 阅读详情

相关推荐

掌握UCOSiii源码:3.03与3.04版本详解

uC/OS-III是由Micrium开发的一个完整的实时操作系统内核,专为嵌入式系统设计。它支持多任务处理,并具有高可靠性、确定性和可配置性。uC/OS-III在工业控制、医疗设备、航空航天等领域得到了广泛应用。可移植性定义为操作系统能够在不同硬件平台上运行的程度。提高可移植性对减少硬件依赖、增加软硬件独立性至关重要。

weixin_33205138的博客 769

嵌入式实时操作系统(RTOS),以uc/OS-III为例,将其移植到stm32F103上

RT-thread Nano或FreeRTOS的移植相比自己手动移植简单,大大提高了效率,但手动移植锻炼自己的细心。

liuwei1015的博客 4237

UCOS-III源代码

UCOS-III源代码

uCOS学习笔记——任务调度机制(中断,临界区,信号量,互斥锁)

uCOS任务调度机制——中断,临界区,信号量,互斥锁

weixin_72589081的博客 3474

BUCK电路三种工作模式全解析:CCM、BCM、DCM到底怎么选?

本文深入解析BUCK电路的CCM、DCM和BCM三种工作模式,通过对比其电流波形、效率、纹波及环路特性,提供基于计算公式的量化判断方法。文章结合电池供电、高精度模拟等具体应用场景,给出明确的模式选型策略与实战设计指南,帮助工程师根据核心需求做出最优决策。

ee345的博客 486

一文讲透什么是ADC/DAC中的DDC、DUC、采样率以及数据率等概念

摘要:ADC/DAC中的采样率与数据率概念不同,采样率是转换器的时钟速率,而数据率是数字输出的实际速率。抽取通过滤波降低数据速率,提升信噪比但牺牲带宽;内插则通过插零和滤波提高采样率,将镜像信号移远但增加延迟和功耗。JESD204B标准的高速转换器需平衡通道数与串行速率,内插/抽取技术是关键。文章还解析了DDC、DUC的应用及优缺点,为高速数据转换设计提供参考。(150字)

weixin_49761275的博客 4268

UCOS-III中断、临界段代码保护、任务延时

使用权UCOSIII中除空闲任务外,所有任务必须在合适的位置调用系统提供的延时函数,让当前的任务暂停运行一段时间并进行一个任务切换。临界段代码也叫临界区,是指那些必须完整连续运行,不可被打断的代码段,当访问这些临界段代码的时候需要对这些临界段代码进行保护。中的任务是一个无线循环并且还是一个抢占式内核,为了使高优先级的任务不至于独占。使用关中断的方式来保护临界段的代码, 当设置为1。时,会采用给调度器上锁的方式来保护临界段代码。允许用户改变当前时钟节拍计数器的值,慎用!//xxxxxxxxxxx 一些操作。

m0_56326397的博客 882

(数字ic验证)从零开始的apb_watchdog验证模块搭建(一、功能介绍与环境搭建)

apb_watchdog验证模块搭建(一)文章目录 文章目录apb_watchdog验证模块搭建(一)文章目录前言一、apb_watchdog简单功能介绍二、测试平台环境搭建1.测试所用模板介绍2.tb与interface2.env与watchdog_pkg3.test与base_sequence4.Makefile总结——当前验证结构 前言 本文介绍了apb_watchdog验证模块的搭建过程与其具体代码,主要包括其中验证环境的构建,测试序列的发送与回归测试收集。主要运用systemvorilog与u

peop1e的博客 9738

UCOSIII---临界段代码如何使用

其中,软件锁临界段使用 CPU_SR_ALLOC() 定义临界段控制变量,CPU_CRITICAL_ENTER() 进入临界段,CPU_CRITICAL_EXIT() 退出临界段;硬件中断临界段直接使用 CPU_INT_DIS() 禁止中断,CPU_INT_EN() 开启中断即可。为0时,UCOSIII使用关中断的方式来保护临界段代码,当设置为1的时候就会采用给调度器上锁的方式来保护临界段代码。临界段的使用可以大大降低资源的争夺问题,提高系统的可靠性和稳定性。

weixin_53592457的博客 774

Numpy快速入门(np)!看这一篇就够了

Numpy快速入门(np)!看这一篇就够了

weixin_74009895的博客 2679

卫星监测“America”级#两#栖#攻#击#舰#(LHA-6)出港

卫星监测“America”级#两#栖#攻#击#舰#(LHA-6)出港 前脚刚走,后脚又来,山姆大叔又来刷存在感,2020年7月28日,USS Ronald Reagan流窜在我国东海海区被卫星拍了下来: 2020年8月1日,最新卫星图像显示USS Ronald Reagan已经返回母港日本横须贺:距离其出港(2020年6月8日)已经过去了快两个月 然而事情并没有到此结束,“America”级#两#栖#攻#击#舰#(LHA-6)选择在 “八.一” 这个特殊的日子前后出港颇具挑衅的味道。 根据2020年

qq_46071146的博客 1565

读uCOSIII源码笔记

首先谈一下自己读RTOS的粗略认识吧,刚开始接触单片机时使用的都是while(true),一个循环处理所有的任务。直到写了一个通过GPRS模块与上层服务通信(长连接)之后,才发现在while(true)中处理好恶心,老是掉线之后连接不上。可能是对AT指令的处理没有搞好,就开始各种找怎么解决,接触到了uC/OSIII,阅读了他提供的文档,阅读了源代码,慢慢看,感觉进步很多,用着用着就爱上了。

avenger0422的专栏 8324

Tessent ATPG Flow 流程 (代码和注释)

**摘要:Tessent ATPG流程分为五个阶段:1) 环境初始化(加载设计文件、库和扫描链配置);2) DRC规则检查(验证设计可测试性并修复违例);3) ATPG向量生成(设置故障模型并运行引擎优化覆盖率);4) 向量验证与后处理(仿真验证并生成ATE格式文件);5) 进阶操作(多电压域和存储器测试)。流程输出包括测试向量、覆盖率报告和验证日志,支持stuck-at和transition故障模型,使用Tcl脚本控制。关键步骤包含扫描链配置、EDT压缩和覆盖率优化。

QQ_778132974的博客 931

ucosIII学习总结

看到以前写的ucos博客还有人看,感到很欣慰,写篇博客给刚学习ucos的同学一些建议,希望对你们的学习有所帮助。 写在前面,当初学ucos完全是误打误撞,从单片机一路走来,不想做嵌入式,看到RTOS在自动控制、物联网等有一定应用就搞起来了,没想到最后还是入了嵌入式的行当,也蛮好,蛮好。 由于从单片机走来,对于编程还算了解一点皮毛,可是这点皮毛在学习操作系统时简直不够用。ucos中上来就是很多链...

u010743406的博客 741

基于STM32L4XX、HAL库的AP6275S WIFI 模块驱动程序设计

支持802.11a/b/g/n/ac/ax (Wi-Fi 6)标准。// 这部分通常依赖于Broadcom提供的固件和驱动。// 这里需要添加Wi-Fi固件加载和初始化的代码。// 通常需要通过SDIO发送命令和接收响应。// 这里需要添加蓝牙HCI初始化代码。// 处理Wi-Fi和蓝牙数据。// 这里需要实现Wi-Fi连接逻辑。// 初始化SDIO和UART。// 确保蓝牙使能引脚已设置。// 关闭Wi-Fi和蓝牙。// 关闭Wi-Fi和蓝牙。// 打开Wi-Fi和蓝牙。// 初始化AP6275S。

zhusl6688的博客 277

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【UCOSIII源码阅读笔记】第二篇

本文主要分析ucosiii中管理优先级表的os_prio.c文件。

inputA的博客 532

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

第五章 UCOSIII任务管理

多任务操作系统最主要的就是对任务的管理,包括任务的创建、挂起、删除和调度等,因 此对于 UCOSIII操作系统中任务管理的理解就显得尤为重要。本章我们就讲解 UCOSIII中的任 务管理,本章分为如下几个部分: 5.1 UCOSIII启动和初始化 5.2任务状态 5.3任务控制块 5.4任务堆栈 5.5任务就绪表 5.3任务调度和切换 ...

weixin_42215853的博客 505

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

UCOSiii--源码阅读

我在阅读ucos源码过程遇到的一写小问题 1.OSTaskDel()任务删除函数 在任务函数中,调用次函数传入空指针,将会删除本任务(一直以为要传入任务控制块才行,原来还可以传入空指针) 2.钩子函数 以空闲任务的钩子函数来说, 在OSIdleTaskHook() (在os_cpu_c.c)中调用 最终调用的是函数App_OS_IdleTaskHook(),也就是说如果我们想要在空闲任务的钩子函数中做其他处理就需要将代码写在App_OS_IdleTaskHook() 如下:空闲任务钩子函数相应的处理

风间琉璃的博客 1456

【UCOSIII源码阅读笔记】第一篇

分析ucos3消息队列的代码实现方式,和值得学习的地方

inputA的博客 603

(学习日记)2024.02.29:UCOSIII第二节

2024.02.29 四、UCOSIII:新建工程 1、创建文件夹 2、新建工程 五、UCOSIII:调试配置 1、设置软件仿真 2、修改时钟大小 3、添加头文件路径 六、调试模式中示波器的使用 1、 在app.c中编写main函数 2、调试模式 3、使用示波器 4、常见错误 1. Build时报错 Error: L6218E 2. keil5软件仿真没有实时波形 3. Build时报错 error 65 4. Peripherals显示空白 5. 调试模式时,程序前没有灰块

一个放笔记的小书架 1521

ucosiii源码分析笔记 pdf下载_2020年最详细的Android第三方源码库笔记,开放下载...

笔记特点:内容详实,涵盖了和Android开发相关的各个源码库。不仅深入浅出地分析源码,还记录了大佬们在使用时遇到的问题,并提供了解决的方法。内容概要:一共分为十个章节,包含Glide、LeakCanary、ARouter、EventBus、Retrofit源码详细解析,以及它们的使用,和一些容易遇到的问题。由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。如有需要获取资料文档的...

weixin_39639698的博客 447

【UCOSIII源码阅读笔记】第三篇——PendSV异常处理分析

本文对ucos中为什么使用PendSV,以及如何使用PendSV进行分析。

inputA的博客 1622

GD32F103RCT6/GD32F303RCT6-UCOSIII底层移植(2)新建任务

GD32F103RCT6/GD32F303RCT6 UCOSIII底层移植 任务创建

各位大佬,一起学习交流一下吧! 947

UCOSIII--源码阅读(2)

1.任务的挂起与创建 OS 的任务支持挂起和恢复的功能,挂起就相当于暂停,暂停后任务从就绪列表中移除,恢复即重新将任务插入就绪列表。一个任务挂起多少次就要被恢复多少次才能重新运行在这里插入代码片 在任务实现挂起和恢复的时候,要根据任务的状态来操作,任务的状态不同,操作也不同,有关任务状态的宏定义在 os.h 中实现,总共有 9 种状态, TaskState : 为了实现任务的挂起和恢复 TCB 中有任务的状态 TaskState 和任务挂起 计数器 SusPendCtr 这两个成员 OS_STATE

风间琉璃的博客 277

UCOSIII内核文件扫盲:从`os_core.c`到`uC-LIB`,每个文件夹都是干嘛的?给新手的保姆级导航

本文详细解析了UCOSIII内核源码结构,从核心文件`os_core.c`到基础库`uC-LIB`,为新手提供清晰的导航指南。通过类比工厂车间,帮助读者理解任务调度、内存管理等关键模块的功能与实现,并介绍官方例程的实战应用,助力快速掌握实时操作系统开发。

weixin_30576827的博客 267
上一篇: 【UCOSIII源码阅读笔记】第三篇——PendSV异常处理分析
下一篇: 【链接、装载与库】程序的编译过程
inputA
博客等级 码龄7年 297粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值