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

前言

本文对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) 任务切换解锁
通过这两个函数对一段代码进行加锁保护,就可以防止出现访问冲突了。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: uC/OS-III是一款开的实时操作系统内核,它提供了高效、稳定、可靠和可扩展的多任务处理机制,是嵌入式系统开发中常用的实时操作系统。作为一个开软件,uC/OS-III码是开放的,可以被用户自由下载、查看、使用和修改。 uC/OS-III码的核心是一个功能丰富的内核,它实现了多任务处理、同步与互斥、时钟管理、中断处理、信号量、消息队列、事件标志和定时器等功能。同时还提供了一些实用的扩展模块,如文件系统、TCP/IP网络协议栈、USB驱动等。用户可以根据自己的需求选择适合自己的内核和模块,进行二次开发和应用。 使用uC/OS-III码需要具备一定的嵌入式系统开发经验和相关技术,如裸机开发、汇编语言、C语言、硬件设计和调试等。同时还需要具备深入理解uC/OS-III内核和模块的能力,以便在使用和修改码时不出错。 总之,uC/OS-III码是一个非常有价值的开软件,它可以为嵌入式系统开发者提供高效、稳定和可靠的多任务处理解决方案。如果你是一个嵌入式系统开发者,建议你在使用之前先仔细研究并了解其使用方法和相关技术,以便更好地发挥其功能和优势。 ### 回答2: uCOS III是一款功能强大、可靠性高的实时操作系统,该操作系统码可以被允许使用、修改和分发,以满足不同用户的需求。uCOS III由Micrium开发,已经成为嵌入式系统领域使用最广泛的实时操作系统之一。 uCOS III码的使用需要有一定的嵌入式系统相关知识。该码包含了各种各样的调度器、中断处理、内存管理、通信协议、设备驱动等模块,用户可以根据需求灵活选择所需要的模块进行嵌入式系统的开发。 使用uCOS III码的好处主要体现在两个方面:一是可以大大提高嵌入式系统的可靠性和稳定性,因为uCOS III是为实时应用而设计的,能够确保系统的实时性和稳定性;二是开发效率高,由于uCOS III提供了完善的函数库和各种现成的模块,可以缩短开发周期,提高工作效率。 当然,使用uCOS III码也存在着风险,因为uCOS III是商业操作系统,开发者需要在使用或修改时遵循相应的使用协议,并且需要对修改后的系统进行严格的测试和验证,以确保系统的稳定性和可靠性。 综上所述,uCOS III码在嵌入式系统领域具有重要的作用,但使用时需要注意开发者本身的技术水平和遵守协议。 ### 回答3: uCos III是一种实时操作系统,它的代码是一个由Micrium提供的可下载软件包。这个软件包包含代码、文档和示例程序。 uCos III作为一种实时操作系统,提供了许多可编程的功能和特性,例如任务管理、中断管理、时间管理、内存管理和通信管理等。这些功能都是通过代码实现的,因此可以根据特定应用的需求进行定制和修改。 uCos III的码使用ANSI C编写,可以在多种平台上使用,也可以在各种现硬件和嵌入式系统上使用。因此,无论是开发嵌入式系统还是桌面应用程序,都可以使用uCos III代码。 与其他实时操作系统相比,uCos III码有许多优点。它具有高可靠性、高可移植性和高效率等特点。此外,它还提供了广泛的可编程功能,使得可以定制和修改系统以满足特定应用的需求。 总体来说,uCos III码是一个十分有用的工具,它为开发实时操作系统提供了各种功能和特性。它也为开发嵌入式系统提供了便利,可帮助您更好地优化和管理您的系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值