首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >UCOS-III笔记(二)任务创建、删除、挂起、恢复和中断管理

UCOS-III笔记(二)任务创建、删除、挂起、恢复和中断管理

作者头像
一个平凡而乐于分享的小比特
发布2026-02-02 15:29:44
发布2026-02-02 15:29:44
900
举报

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:UCOS-III,本专栏为UCOS-III学习记录 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

UCOS-III笔记(二)

任务创建与删除

创建任务:OSTaskCreate()

本质:当任务被创建好后,就会立马处于就绪态

删除任务:OSTaskDel()
  1. 本质:删除任务并不会删除任务的代码或释放任务栈,仅代表该任务的代码和任务栈都不再由µC/OS-III 内核管理
  2. 注意当代入的参数为NULL,则代表删除任务自身(当前正在运行的任务)
任务创建流程
  1. 定义函数入口参数(任务堆栈、任务优先级… …)
  2. 调用创建任务API函数
  3. 实现任务函数功能

注意:

  1. 在调用UCOSIII的函数之前必须先初始化UCOSIII,调用函数OSInit( )实现
  2. 任务创建完之后,是不会启动的,需要开启任务调度器才能启动任务,调用一次OSStart( )即可
  3. 不可删除空闲任务
  4. 临界区保护,保护那些不想被打断的程序段。关闭UCOSIII所管理的中断,中断无法打断,滴答中断和PendSV中断无法进行,所以不能实现任务调度

任务的挂起与恢复

挂起任务函数:OSTaskSuspend()
  1. 挂起任务不是当前正在执行的任务,无条件挂起,不参与任务调度。挂起任务正在运行,发起任务调度,交出cpu使用权
  2. 本质:将任务从就绪列表中暂时移除,不再参与运行
恢复被挂起函数:OSTaskResume( )
  1. 用于恢复被函数 OSTaskSuspend()挂起的任务
  2. OSTaskSuspend()挂起同一个任务次数必须与OSTaskResume()恢复任务次数相同,才可恢复任务
  3. 本质:把任务从新插入到就绪列表

注意:

  1. 函数 OSTaskSuspend()与函数 OSTaskResume()必须成对出现
  2. 任务挂起和恢复函数都不支持中断中调用
  3. 不能挂起空闲任务
  4. 挂起任务类似暂停,可恢复; 删除任务,无法恢复,只能重新创建

中断管理

中断本质:让CPU打断正常程序的运行,转而紧急处理的事件(程序)

中断执行流程:

  1. 中断请求:外设产生中断请求(GPIO外部中断、定时器中断等)
  2. 响应中断:CPU停止执行当前程序,转而去执行中断处理程序(ISR)
  3. 退出中断:执行完毕,返回被打断的程序处,继续往下执行
中断优先级分组设置

ARM Cortex-M 使用了 8 位宽的寄存器来配置中断的优先等级,中断优先级配置范围在0~255

STM32,只用了中断优先级配置寄存器的高4位 [7 : 4],提供了最大16级的中断优先等级

  • 抢占优先级: 抢占优先级高的中断可以打断正在执行但抢占优先级低的中断
  • 子优先级:当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行

5种优先级分组分配方式:

  • NVIC_PriorityGroup_0:0bit 用于抢占优先级,4bit 用于子优先级
  • NVIC_PriorityGroup_1:1bit 用于抢占优先级 ,3bit 用于子优先级
  • NVIC_PriorityGroup_2:2bit 用于抢占优先级 ,2bit 用于子优先级
  • NVIC_PriorityGroup_3:3bit 用于抢占优先级 ,1bit 用于子优先级
  • NVIC_PriorityGroup_4:4bit 用于抢占优先级 ,0bit 用于子优先级

(建议将所有优先级位指定为抢占优先级位,方便UCOSIII管理)

注意:

  1. UCOSIII的中断管理范围,通过宏CPU_CFG_KA_IPL_BOUNDA设置。如将该宏定义为4,即管理中断优先级范围:4 ~ 15
  2. 中断优先级数值越小越优先,任务优先级同理
  3. 在中断服务函数中,如果调用到UCOSIII的API函数,那么该中断优先级必须在UCOSIII所管理的范围内

中断相关寄存器

  • 三个系统中断优先级配置寄存器:SHPR1、 SHPR2、 SHPR3 通过SHPR3将PendSV设置最低优先级,保证系统任务切换不会阻塞系统其他中断的响应,SysTick设置为UCOSIII所管理的最高优先级,保证延时的精确性
  • 三个中断屏蔽寄存器: PRIMASK、 FAULTMASK 和BASEPRI 在uC/OS-III中,中断屏蔽寄存器主要用到了BASEPRI 和 PRIMASK。 BASEPRI:屏蔽优先级低于某一个阈值的中断(比如: BASEPRI设置为0x40,代表中断优先级在4-15内的均被屏蔽,0-3的中断优先级正常执行) PRIMASK:1个位的寄存器。当它置为1时,表示关掉所有可屏蔽的异常,只剩下NMI和硬fault可以响应。当它置为0时,表示没有关闭中断。(当需要关闭大部分中断时则使用PRIMASK这个寄存器)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • UCOS-III笔记(二)
    • 任务创建与删除
      • 创建任务:OSTaskCreate()
      • 删除任务:OSTaskDel()
      • 任务创建流程
    • 任务的挂起与恢复
      • 挂起任务函数:OSTaskSuspend()
      • 恢复被挂起函数:OSTaskResume( )
    • 中断管理
      • 中断优先级分组设置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档