临界段     
代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断。为确保临界段代码的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断。 
由于Cortex-M3/M4的RTX内核库中没有关闭中断的操作,也就是说RTX的源码中不存在临界段。
中断锁
中断锁就是RTOS提供的开关中断函数,因为Cortex-M3/M4的RTX源码中没有关闭中断的操作,所以也就没有提供开关中断函数。 由于RTX没有提供开关中断函数,如果用户自己的应用代码需要开关中断的话怎么办呢?
裸机时如何开关中断的,在使用了RTX后仍然使用以前的开关中断函数即可
任务锁
为了防止当前任务的执行被其它高优先级的任务打断而提供的锁机制就是任务锁。实现任务锁可以通过给调度器加锁或者直接关闭RTOS内核定时器(就是前面一直说的系统滴答定时器)来实现。 
1.通过给调度器加锁实现 给调度器加锁的话,就无法实现任务切换,高优先级任务也就无法抢占低优先级任务的执行,同时高优先级任务也是无法向低优先级任务切换的。像uCOS-II和uCOS-III是采用的这种方法实现任务锁。特别注意,这种方式只是禁止了调度器工作,并没有关闭任何中断。 
2. 通过关闭RTOS内核定时器实现 关闭了RTOS内核定时器的话,也就关闭了通过RTOS内核定时器中断实现任务切换的功能,因为在退出定时器中断时需要检测当前需要执行的最高优先级任务,如果有高优先级任务就绪的话需要做任务切换。 RTX操作系统是采用的这种方式实现任务锁的。

os_resume

  1. #include <rtl.h>
  2. void os_resume (
  3. U32 sleep_time ); /* Number of ticks the system was in sleep mode. */

说明:

    该函数唤醒操作系统调度器. 客户在调用了os_suspend之后必须调用该方法来重新使能调度器.
sleep_time参数标识系统将在休眠或者掉电模式下呆多久. 以系统周期作为测量依据.

返回值:

注意要点:

该函数只能在系统空闲任务下调用. 
单系统处于power_down模式下,tick定时器将不再运行. 

例程:

The wake-up timer, when expired, generates the interrupt and wakes-up the system. Hence, it must run also in power-down mode. The system resumes operation and needs to call the function os_resume(). This function restores the RTX and re-enables the OS task scheduler
  1. /* After Wake-up */
  2. sleep = (tc - LPC_WWDT->TV) / 250;
  3. }
  4. os_resume(sleep);

os_suspend

  1. #include <rtl.h>
  2. U32 os_suspend (void);

说明:

该函数挂起操作系统调度器. 该函数将测量需要多久进入掉电模式并关闭操作系统调度器.当函数返回的时候,操作系统调度器就被挂起了
对于RTX,当调用了 os_suspend之后,就必须调用 os_resume  来恢复系统调度 .

返回值:

注意要点:

只能在空闲任务中调用该函数 . 
操作系统进入power_down模式.系统tick定时器被禁止. 

例程:

  1. #include <rtl.h>
  2. __task void os_idle_demon (void) {
  3. uint32_t sleep;
  4. SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; /* Configure Cortex-M3 for deep sleep */
  5. PWR->CR &= ~PWR_CR_PDDS; /* Enter Stop mode when in deepsleep */
  6. PWR->CR |= PWR_CR_LPDS; /* Voltage regulator in low-power */
  7. /* Enable LSI clock and wait until ready */
  8. RCC->CSR |= RCC_CSR_LSION;
  9. while ((RCC->CSR & RCC_CSR_LSIRDY) == 0);
  10. /* Enable power interface clock */
  11. RCC->APB1ENR |= RCC_APB1ENR_PWREN;
  12. /* Disable backup domain write protection */
  13. PWR->CR |= PWR_CR_DBP;
  14. /* Select LSI as clock source for RTC and enable RTC */
  15. RCC->BDCR &= ~RCC_BDCR_RTCSEL;
  16. RCC->BDCR |= RCC_BDCR_RTCSEL_1;
  17. RCC->BDCR |= RCC_BDCR_RTCEN;
  18. /* Disable the write protection for RTC registers */
  19. RTC->WPR = 0xCA;
  20. RTC->WPR = 0x53;
  21. /* Configure RTC auto-wakeup mode */
  22. RTC->ISR &= ~RTC_ISR_WUTF; /* Clear wakeup timer flag */
  23. RTC->CR &= ~RTC_CR_WUCKSEL; /* Set RTC clock to 2kHz */
  24. RTC->CR |= RTC_CR_WUTIE; /* Enable RTC wakeup timer interrupt */
  25. /* Configure EXTI line 22 for wakeup on rising edge */
  26. EXTI->EMR |= (1 << 22); /* Event request is not masked */
  27. EXTI->RTSR |= (1 << 22); /* Rising trigger enabled */
  28. NVIC_EnableIRQ (RTC_WKUP_IRQn); /* Enable RTC WakeUp IRQ */
  29. for (;;) {
  30. /* HERE: include optional user code to be executed when no task runs. */
  31. sleep = os_suspend (); /* OS Suspend */
  32. if (sleep) {
  33. RTC->ISR &= ~RTC_ISR_WUTF; /* Clear timer wakeup flag */
  34. RTC->CR &= ~RTC_CR_WUTE; /* Disable wakeup timer */
  35. while ((RTC->ISR & RTC_ISR_WUTWF) == 0);
  36. /* RTC clock is @2kHz, set wakeup time for OS_TICK >= 1ms */
  37. RTC->WUTR = (sleep * (OS_TICK / 1000) * 2);
  38. RTC->CR |= RTC_CR_WUTE; /* Enable wakeup timer */
  39. __WFE (); /* Enter STOP mode */
  40. /* After Wake-up */
  41. if ((RTC->ISR & RTC_ISR_WUTF) == 0) {
  42. sleep = 0; /* We didn't enter Stop mode */
  43. }
  44. }
  45. os_resume (sleep); /* OS Resume */
  46. }
  47. }

tsk_lock

  1. #include <rtl.h>
  2. void tsk_lock (void);

说明:

    该函数禁止RTX内核时间中断,也就自然禁止了操作系统调度器.

返回值:

注意要点:

不能在中断向量中调用该函数 . 
不能在中断处理程序中调用该函数 . 
当禁用了内核时间中断,操作系统时间中断和时间片轮转中断被禁止,超时功能不在工作. 因此,强烈建议关RTX内核定时器中断的时间越短越好. 

例程:

  1. #include <rtl.h>
  2. void protect_critical_op () {
  3. tsk_lock ();
  4. do_critical_op ();
  5. tsk_unlock ();
  6. }

tsk_unlock

  1. #include <rtl.h>
  2. void tsk_unlock (void);

说明:

   函数tsk_unlock用于使能RTX内核定时器中断,因此也就重新开启任务切换。注意tsk_unlock一定要跟tsk_lock配套使用 .

返回值:

注意要点:

函数tsk_lock不支持嵌套调用 . 
不允许在中断服务程序中调用tsk_lock.

例程:

  1. #include <rtl.h>
  2. void protect_critical_op () {
  3. tsk_lock ();
  4. do_critical_op ();
  5. tsk_unlock ();
  6. }

转载于:https://www.cnblogs.com/dengxiaojun/p/fee1ab410029b002b7dd4979bf451640.html

RTX临界段,中断锁与任务锁相关推荐

  1. FreeRTOS源码分析与应用开发01:中断配置与临界段

    目录 1. 异常与中断的基本概念 1.1 异常分类 1.2 中断概述 1.2.1 中断处理宜短暂 1.2.2 临界段影响中断实时性 1.3 中断硬件基础 1.3.1 外设 1.3.2 中断控制器 1. ...

  2. 【FreeRTOS】06 临界段的保护——关中断和关调度

    本节来讲一讲FreeRTOS如何保护临界段,先讲临界段的概念,再讲保护临界段的方法. 1)临界段的概念 简单来讲,临界段是一段执行时不允许被中断(或其他任务)打断的代码:如果被打断,就有可能运行出错. ...

  3. freertos临界段保护

    freertos临界段保护 中断的基础知识 cortex-m里面开中断.关中断指令 关中断和开中断 进入临界段和退出临界段 中断的基础知识 嵌套: 嵌套向量中断控制器 NVIC(Nested Vect ...

  4. FreeRTOS 临界段和开关中断

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 临界段 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码 的执行不被 ...

  5. FreeRTOS — 临界段和开关中断

    以下内容转载自安富莱电子:http://forum.armfly.com/forum.php 1.临界段 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行 ...

  6. mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁

    锁的粒度 行级锁 表级锁 应尽量只锁定需要修改的那部分数据,而不是所有资源.锁定的数据量越少,发生锁争用的可能性就越小,并发行就越高. 加锁需要消耗资源,锁的各种操作都会增加系统开销.因此锁的粒度越小 ...

  7. FreeRTOS中断配置与临界段

    Cortex-M中断 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序(中断服务程序),处理完毕后又返回原被暂停的程序继续运行.Cortex- ...

  8. 中断、信号、锁、信号量

    1. 碎碎念 作为一个上学能忘记带书包,出门能忘记带钥匙的人.兴冲冲的去看书,发现自己木有带书,只带了电脑,好像也就没什么可奇怪的了.好在现在是 2019 年,在网上找了下要看书的 pdf 版,完美解 ...

  9. 自旋锁、互斥锁和信号量

    自旋锁 Linux内核中最常见的锁是自旋锁(spin lock).自旋锁最多只能被一个可执行线程持有.如果一个执行线程试图获得一个已经被持有的自旋锁,那么该线程就会一直进行忙循环--旋转--等待锁重新 ...

最新文章

  1. Next.js 7发布,构建速度提升40%
  2. vxworks中断的使用
  3. emmc boot1 boot2 partition
  4. core Bluetooth(蓝牙4.0)
  5. 武科大计算机专业分数线,武汉科技大学计算机类(中外合作办学)专业2016年在湖北理科高考录取最低分数线...
  6. 揭秘!月薪30K的大牛到底看了哪些视频?【共2000G】
  7. windows03系统安装08sql数据库
  8. 区块链开发(二)以太坊客户端基本操作命令
  9. atitit.md5算法的原理 与 总结
  10. Two sum (bilibili有讲解视频)
  11. 科学研究设计七:单案例设计
  12. Tuxera NTFS如何解决硬盘无法写入文件教程分享
  13. unb计算机科学,【加拿大新布伦瑞克大学】加拿大UNB_University of New Brunswick - 加拿大大学 - 加拿大留学云...
  14. linux下mtr命令,linux-常用命令-mtr(示例代码)
  15. 如何安装projectlombok
  16. Docker版本名称YY.MM修改聚焦
  17. linux+安装xp系统下载,linux系统怎么安装xp系统
  18. python初始化二维矩阵
  19. 2023湖北大学计算机考研信息汇总
  20. 大专的电子信息工程技术学什么?

热门文章

  1. 计算机网络之网络架构
  2. 测试面试题之bug的生命周期?你是怎么跟进bug的?
  3. 从文人相轻说开去...
  4. IOS 之 NSArray 数组方法详解(3)
  5. 【AUTOSAR-CanTp】-2.11-UDS诊断响应帧数据段data padding数据填充和data optimization数据优化(理论+配置)
  6. 欧冶云商将于11月4日上会:上半年营收566亿元,毛利率整体较低
  7. 计算机专业基础知识(上)
  8. 不仅霸占双眼,屏幕正在让智能音箱进入下一版本
  9. 网站制作时要注重策划
  10. 【转载】 Android 开发环境下载地址 -- 百度网盘 adt-bundle android-studio sdk adt 下载