当前位置: 首页 > news >正文

uc/os-II操作系统时钟节拍器

μC/OS需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在每秒10次到100次之间,或者说10到100Hz
时钟节拍率越高,系统的额外负荷就越重时钟节拍的实际频率取决于用户应用程序的精度
注意:
用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。
容易犯的错误:
是将允许时钟节拍器中断放在系统初始化函数OSInit()之后,在调用启动多任务系统启动函数OSStart()之前
原因:
时钟节拍中断有可能在μC/OS-Ⅱ启动第一个任务之前发生,此时μC/OS-Ⅱ是处在一种不确定的状态之中,用户应用程序有可能会崩溃。

μC/OS-Ⅱ中的时钟节拍服务是通过在(SysTickHandler系统滴答时钟中断)中断服务子程序中调用OSTimeTick()实现的
void SysTickHandler(void)
{
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL();
OSIntNesting++;
OS_EXIT_CRITICAL();
OSTimeTick();
OSIntExit();
}
OSTimeTick()的两个主要功能:
遍历“已建立任务TCB链表”,给每个用户任务控制块OS_TCB中的时间延时项OSTCBDly减1(如果该项不为零的话)。当某任务的任务控制块中的时间延时项OSTCBDly减到了零时,把任务转入就绪态
调用OSTime累加从开机以来的时间,用的是一个无符号32位变量
//ucos_ii.h
OS_EXT INT8U OSIntNesting; /* Interrupt nesting level */


508 * 时钟节拍函数 PROCESS SYSTEM TICK
509 *
510 * 描述: uC/OS需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在每秒10次到100次
511 * 之间,或者说10到100Hz。时钟节拍率越高,系统的额外负荷就越重.时钟节拍的实际频率取决于
512 * 用户应用程序的精度。时钟节拍源可以是专门的硬件定时器,也可以是来自50/60Hz交流电源的
513 * 信号
514 *
515 * 参数: 无
516 *
517 * 返回: 无
518 **********************************************************************************************
519 */
520
void OSTimeTick (void) //时钟节拍函数
{
#if OS_CRITICAL_METHOD == 3 //中断函数被设定为模式3
OS_CPU_SR cpu_sr;
#endif
OS_TCB *ptcb; //定义任务控制块优先级表变量
#if OS_TIME_GET_SET_EN > 0 //允许生成OSTimeGet() 函数代码
OS_ENTER_CRITICAL(); //关闭中断
OSTime++; //累加从开机以来的时间,用的是一个无符号32位变量
OS_EXIT_CRITICAL(); //打开中断
#endif

ptcb = OSTCBList; //保存任务控制块列表首地址
//从OSTCBList开始,沿着OS_TCB链表做,一直做到空闲任务
while (ptcb->OSTCBPrio != OS_IDLE_PRIO)
{
OS_ENTER_CRITICAL(); //关闭中断
if (ptcb->OSTCBDly != 0)
{ //如果任务等待时的最多节拍数不为0
if (–ptcb->OSTCBDly == 0)
{ //如果任务等待时的最多节拍数为0
//而确切被任务挂起的函数OSTaskSuspend()挂起的任务则不会进入就绪态
//执行时间直接与应用程序中建立了多少个任务成正比
if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == 0x00)
{
//当某任务的任务控制块中的时间延时项OSTCBDly减到了零,这个任务就进入了就绪态
OSRdyGrp |= ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
}
else
{
ptcb->OSTCBDly = 1; //否则
} //允许任务等待时的最多节拍数为1
}
}
ptcb = ptcb->OSTCBNext; //指向任务块双向链接表的后链接
OS_EXIT_CRITICAL(); //打开中断
}

http://www.jsqmd.com/news/500074/

相关文章:

  • 什么是偶极矩?
  • LangBot:企业级即时通讯 AI 机器人平台 使用包管理器部署(包含手机部署方式)篇
  • 在 Windows 中打开蓝牙设备
  • AI大模型竟被投毒?315曝光的“暗黑操作”如何影响你的决策?
  • 计算机毕业设计答辩全攻略,答辩老师最常问的都在这里了
  • 二叉树详解:从概念到应用,带你玩转树形结构
  • 【卡尔曼滤波】第1章 理论基础与标准卡尔曼滤波
  • 一、Spring
  • 号码核验在B端拓客中的应用困境与技术升级路径研究氪迹科技法人号码核验系统
  • 软件开发常用工具介绍
  • HTTP 消息:解析与优化
  • LoRA 与 QLoRA
  • Zabbix6.2利用模板和自定义监控项监控华为AR3260路由器
  • ROS2学习记录009-使用面向对象方式编写ROS2节点
  • 从此告别拖延!全场景通用的AI论文工具 —— 千笔写作工具
  • 震惊,杨幂的脸竟然出现在了她的身体上
  • java基础学习3(数据类型转换、运算符)
  • 把坑都踩完了,千笔AI VS 笔捷Ai,全场景通用AI论文网站!
  • 【常见错误】Xilinx Vivado自带编辑器文字部分出现乱码解决办法
  • 数字孪生国内外发展现状
  • 【Xilinx Vivado时序分析/约束系列2】FPGA开发时序分析/约束-建立时间
  • 终极指南:使用Google Map React库快速构建交互式地图应用
  • JetBrains 插件 IDE设置
  • 学霸同款!全领域适配的论文神器 —— 千笔
  • STM32-串口使用注意事项
  • Kubernetes 认证通关指南:CKA/CKS/CKAD 最新题库 + 本地仿真环境 + 模拟考
  • 2.postman断言
  • 具身智能中 Wrapper 架构的深度解构与 Python 实战
  • 深度解析 | 2026新范式:当“Token”取代比特币,成为真正的数字石油
  • 李南左日更3327:为什么员工都在摸鱼?是因为你曾经不信任他们