UCOS操作系统

文章目录

  • UCOS操作系统
  • 前言
  • 一、UCOS中断
  • 二、临界段代码保护
  • 三、时间管理
    • 1. OSTimeDly()函数
    • 2.OSTimeDlyHMSM()函数
    • 3.OSTimeDlyResume()函数
    • 4.OSTimeGet()和 OSTimeSet()函数

前言

在 STM32 中是支持中断的,中断是一个硬件机制,主要用来向 CPU 通知一个异步事件发生了,这时 CPU 就会将当前 CPU 寄存器值入栈,然后转而执行中断服务程序,在 CPU 执行中断服务程序的时候有可能有更高优先级的任务就绪,那么当退出中断服务程序的时候,CPU 就会直接执行这个高优先级的任务。

一、UCOS中断

我们学习的重点就是—如何在UCOSIII下编写中断服务函数!

void XXX_Handler(void) (1)
{
OSIntEnter(); //进入中断 (2)用户自行编写的中断服务程序; //这部分就是我们的中断服务程序 (3)OSIntExit(); //触发任务切换软中断 (4)
}

(1) 中断服务程序,XXX 为不同中断源的中断函数名字。
(2) 首先调用 OSIntEnter()函数来标记进入中断服务函数,并且记录中断嵌套次数。
(3) 这部分就是我们需要自行编写的中断服务程序了,也就是我们平时不使用 UCOSIII 时
的中断服务程序。
(4) 退出中断服务函数的时候调用 OSIntExit(),发起一次中断级任务切换。

void OSIntEnter (void)
{if (OSRunning != OS_STATE_OS_RUNNING) { //判断 UCOSIII 是否运行,
return; }
if (OSIntNestingCtr >= (OS_NESTING_CTR)250u) { //判断中断嵌套次数是否大于 250return; }OSIntNestingCtr++; //中断嵌套次数加 1 }

从上面代码中我们可以看出 OSIntEnter()函数其实就是将 OSIntNestingCtr 进行简单的加1操作,用来中断嵌套的次数而已。

二、临界段代码保护

临界段代码也叫做临界区,是指那些必须完整连续运行,不可被打断的代码段。当访问这些临界段代码的时候需要对这些临界段代码进行保护。
当宏OS_CFG_ISR_POST_DEFERRED_EN为0时,UCOSIII使用关中断的方式来保护临界段代码,当设置为1的时候就会采用给调度器上锁的方式来保护临界段代码。
UCOSIII定义了一个进入临界段代码的宏:OS_CRITICAL_ENTER(),定义了两个退出临界段代码的宏:OS_CRITICAL_EXIT和OS_CRITICAL_EXIT_NO_SCHED()。


进入临界段代码保护一定要调用这个函数

CPU_SR_ALLOC();

三、时间管理

UCOSIII中的任务是一个无限循环并且还是一个抢占式内核,为了使高优先级的任务不至于独占CPU,可以给其他优先级较低任务获取CPU使用权的机会,UCOSIII中除空闲任务外的所有任务必须在合适的位置调用系统提供的延时函数,让当前的任务暂停运行一段时间并进行一个任务切换。

延时函数有两种,OSTimeDly()和OSTimeDlyHMSM()。
OSTimeDly()函数有三种工作模式:相对模式、周期模式和绝对模式。
OSTimeDlyHMSM()函数仅在相对模式下工作。
在UCOS操作系统种,为了不让一些高优先级的独占CPU,可以用延迟函数来给低优先级函数运行的机会,也不是只有延时函数,只要能发生任务调度就可以。

1. OSTimeDly()函数

void OSTimeDly (OS_TICK dly,OS_OPT opt,OS_ERR *p_err)

dly: 指定延时的时间长度,这里单位为时间节拍数。
opt: 指定延迟使用的选项,有四种选项。
OS_OPT_TIME_DLY 相对模式
OS_OPT_TIME_TIMEOUT 和 OS_OPT_TIME_DLY 一样
OS_OPT_TIME_MATCH 绝对模式
OS_OPT_TIME_PERIODIC 周期模式
p_err: 指向调用该函数后返回的错误码

“相对模式”在系统负荷较重时有可能延时会少一个节拍,甚至偶尔差多个节拍,在周期
模式下,任务仍然可能会被推迟执行,但它总会和预期的“匹配值”同步。因此,推荐使用“周期模式”来实现长时间运行的周期性延时。
“绝对模式”可以用来在上电后指定的时间执行具体的动作,比如可以规定,上电 N 秒后
关闭某个外设。
绝对延迟和相对延时可以看我之前FreeRTOS学习时的博客,那篇博客更加详细。
总结一下,就是相对延迟是可以被打断的,也就是你想延迟3秒执行但是中间发生了一个事耽误了一秒,他就会4秒钟执行,但是绝对延迟的意思是,中间有个任务耽误了一秒,执行的时候两秒钟后就会执行那个任务,不会等你3秒的,规定的时间维度就是3秒,就算有事情打断了,耽误的时间就直接丢掉。

2.OSTimeDlyHMSM()函数

我们也可调用 OSTimeDlyHMSM() 函数来更加直观的来对某个任务延时,
OSTimeDlyHMSM()函数原型如下:

void OSTimeDlyHMSM (CPU_INT16U hours, //需要延时的小时数CPU_INT16U minutes, //需要延时的分钟数CPU_INT16U seconds, //需要延时的秒数CPU_INT32U milli, //需要延时的毫秒数OS_OPT opt, //选项OS_ERR *p_err)

hours、minutes、seconds、milli: 前面这四个参数用来设置需要延时的时间,使用的是:小时、分钟、秒和毫秒这种格式,这个就比较直观了,这个延时最小单位和我们设置的时钟节拍频率有关,比如我们设置时钟节拍频率 OS_CFG_TICK_RATE_HZ 为 200 的话,那么最小延时单位就是 5ms。
opt: 相比 OSTimeDly()函数多了两个选项 OS_OPT_TIME_HMSM_STRICT 和
OS_OPT_TIME_HMSM_NON_STRICT,其他四个选项都一样的。
使用 OS_OPT_TIME_HMSM_NON_STRICT 选项的话将会检查延时参数,
hours 的范围应该是 0~99,minutes 的范围应该是 0~59,seconds 的范围为 0~59,
milli的范围为 0~999。
使用 OS_OPT_TIME_HMSM_NON_STRICT 选项的话,hours 的范围为 0~999,
minutes 的范围为 0~9999,seconds 的范围为 0~65535,mili 的范围为 0~4294967259。
p_err: 调用此函数后返回的错误码

3.OSTimeDlyResume()函数

OSTimeDlyResume()函数取消任务延时
延时任务任务可通过在其他任务中调用函数OSTimeDlyResume()取消延时而进入就绪状态,此函数最后会引发一次任务调度。

void OSTimeDlyResume (OS_TCB *p_tcb,OS_ERR *p_err)

p_tcb: 需要恢复的任务的任务控制块。
p_err: 指向调用这个函数后返回的错误码。

4.OSTimeGet()和 OSTimeSet()函数

OSTimeGet()函数用来获取当前时钟节拍计数器的值。OSTimeSet()函数可以设置当前时钟
节拍计数器的值,这个函数谨慎使用。

UCOS操作系统——中断和时间管理(七)相关推荐

  1. STM32HAL库---串口中断接收时间管理机制

    代码已完成,待更新到此平台...................

  2. STM32工作笔记0083---UCOSIII中断和时间管理

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152

  3. ucos 时钟节拍_uC/OS-III 时钟节拍,时间管理,时间片调度

    时钟节拍 时钟节拍可谓是 uC/OS 操作系统的心脏,它若不跳动,整个系统都将会瘫痪. 时钟节拍就是操作系统的时基,操作系统要实现时间上的管理,必须依赖于时基. 时钟节拍就是系统以固定的频率产生中断( ...

  4. STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题

    一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...

  5. 风靡的七个人生工具(SWOT、PDCA、6W2H、SMART、WBS、时间管理、二八原则)

    一.SWOT分析法 Strengths:优势 Weaknesses:劣势 Opportunities:机会 Threats:威胁 意义:帮您清晰地把握全局,分析自己在资源方面的优势与劣势,把握环境提供 ...

  6. 人生七工具:SWOT、PDCA、6W2H、SMART、WBS、时间管理、OKR

    一.SWOT分析法 Strengths:优势 Weaknesses:劣势 Opportunities:机会 Threats:威胁 意义:帮您清晰地把握全局,分析自己在资源方面的优势与劣势,把握环境提供 ...

  7. 七个人生工具 | SWOT、PDCA、6W2H、SMART、WBS、时间管理、二八原则

    人类历史原本就是一部追求自身平衡的奋斗史,本文介绍七个人生工具:SWOT.PDCA.6W2H.SMART.WBS.时间管理.二八原则 . 1. SWOT分析法 Strengths:优势 Weaknes ...

  8. 七个人生工具:SWOT、PDCA、6W2H、SMART、WBS、时间管理、二八原则

    SWOT分析法: Strengths:优势 Weakness:劣势 OpOpportunities:机会 Threats:危险 意义:帮你清晰地把握全局,分析自己在资源方面的优势和劣势,把握环境提供的 ...

  9. 2nbsp;时间管理和内存管理

    时间管理 uC/OS-II的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次(这个时间片段是OS的作者推荐的,大家可以参考邵贝贝翻译的<嵌入式实时操作系统ucos-I ...

  10. UCOS操作系统基础

    文章目录 1.UCOS简介 2.UCOS任务的概念 3.UCOS专业术语 4.任务间的同步与通信 5.UCOS中断.时钟节拍和初始化 6.UCOS代码规约 1.UCOS简介 实时操作系统: 保证在一定 ...

最新文章

  1. 小爱童鞋@你,一起来撸个小程序吧
  2. 最应该看的一本人工智能理论的书-神经网络于深度学习-目录
  3. 程序编译生成的Hex、Bin、axf和elf格式
  4. Docker系列教程01-Centos7安装新版Docker教程(10步)
  5. MYSQL 实时升级
  6. 360浏览器鼠标手势怎么关 取消360浏览器鼠标手势的方法
  7. OpenCASCADE 麻花钻头造型实例分析
  8. ICLR 2020丨微软亚洲研究院精选论文解读
  9. 《机器人爱好者(第2辑)》——部署机械手或末端执行器
  10. java socket 清理缓冲器_2021年Java全套面试题抢先看!中篇(更新中......)
  11. PHP API微信网页授权接口实现
  12. Moore-Penrose 广义逆
  13. 聊聊索引失效?失效的原因是什么?
  14. BZOJ2794 Cloakroom【有限制的背包问题】
  15. 解决PyQt5程序报错Process finished with exit code -1073740791 (0xC0000409)
  16. 高德地图之周边搜索和路线规划
  17. mysql的COALESCE函数、NULLIF函数、IFNULL函数
  18. 扯一下关于魔兽改键的蛋
  19. 信道规划最佳实践,打造更好的Wi-Fi
  20. algebraic reconstruction technique (ART)算法

热门文章

  1. ev3无需使用计算机编程,Legoev3机器人怎么编程.docx
  2. Unity3D研究院之mac上从.ipa中提取unity3D游戏资源
  3. 当下最强的 AI art 生成模型 Stable Diffusion 最全面介绍
  4. matlab-画折线图
  5. FTP(匿名登录)未授权访问漏洞复现(vsftpd2.3.4)
  6. 【印刷技术】印刷油墨的粘度,如何设定?
  7. WEB安全-ESAPI
  8. Linux下重启tomcat
  9. 内存映射(Memory Map)
  10. Linux下怎么刷显卡bios,nvidia显卡如何刷bios?nvidia显卡刷bios教程