µC/OS-II---两个系统任务

目录

  • 空闲任务---OS_TaskIdle()
  • 统计任务---OS_TaskStat()
    • 统计任务初始化
    • 统计任务代码
  • OSInit()函数
  • 二者的协调使用

空闲任务—OS_TaskIdle()

  • µC/OS-II 规定:一个用户应用程序必须使用这个空闲任务,而且这个任务不能用软件来删除
  • 优先级别:OS_LOWEST_PRIO
void  OS_TaskIdle (void *p_arg)
{
#if OS_CRITICAL_METHOD == 3u                     /*采用第3种进入临界段的处理方法*/OS_CPU_SR  cpu_sr = 0u;
#endifp_arg = p_arg;                               /*防止编译器警告未使用'p_arg’*/	for (;;){OS_ENTER_CRITICAL();					/*关闭中断*/OSIdleCtr++;							/*空闲任务只是做计数工作*/OS_EXIT_CRITICAL();						/*开放中断*/OSTaskIdleHook();                       /*调用用户可定义的HOOK*/}
}

统计任务—OS_TaskStat()

  • OS_TaskStat()告诉用户应用程序使用了多少CPU时间,用百分比表示,这个值放在一个有符号8位整数OSCPUsage中,精读度是1个百分点。
  • 应用程序通过访问统计任务来了解CPU的利用率
  • 优先级别:OS_LOWEST_PRIO - 1
  • 如果应用程序中打算使用统计任务,那么必须在主函数当中建立一个开始任务(一般命名为TaskStart),优先级设为0,然后在开始任务中调用统计任务初始化函数OSStatInit(),之后就可以建立其他任务了。【main函数中,先初始化µC/OS-II,然后创建开始任务,其他任务,最后启动µC/OS-II】

统计任务初始化

在这里插入图片描述

#if OS_TASK_STAT_EN > 0u
static  void  OS_InitTaskStat (void)
{
#if OS_TASK_NAME_EN > 0uINT8U  err;
#endif
#if OS_TASK_CREATE_EXT_EN > 0u
#if OS_STK_GROWTH == 1u(void)OSTaskCreateExt (OS_TaskStat, (void *)0,/* No args passed to OS_TaskStat()*/&OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1u],  /* Set Top-Of-Stack*/OS_TASK_STAT_PRIO,/* One higher than the idle task  */OS_TASK_STAT_ID,&OSTaskStatStk[0],/* Set Bottom-Of-Stack*/OS_TASK_STAT_STK_SIZE,(void *)0,/* No TCB extension*/OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  /* Enable stack checking + clear  */
#else(void)OSTaskCreateExt (OS_TaskStat,(void *)0,/* No args passed to OS_TaskStat()*/&OSTaskStatStk[0],/* Set Top-Of-Stack               */OS_TASK_STAT_PRIO,/* One higher than the idle task  */OS_TASK_STAT_ID,&OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1u], /*Set Bottom-Of-Stack    */							OS_TASK_STAT_STK_SIZE,(void *)0, /* No TCB extension*/OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  /* Enable stack checking + clear  */
#endif
#else
#if OS_STK_GROWTH == 1u(void)OSTaskCreate (OS_TaskStat,(void *)0,/* No args passed to OS_TaskStat()*/&OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1u],/* Set Top-Of-Stack*/OS_TASK_STAT_PRIO);/* One higher than the idle task  */
#else(void)OSTaskCreate (OS_TaskStat,(void *)0,/* No args passed to OS_TaskStat()*/&OSTaskStatStk[0],/* Set Top-Of-Stack*/OS_TASK_STAT_PRIO);/* One higher than the idle task  */
#endif
#endif
#if OS_TASK_NAME_EN > 0uOSTaskNameSet (OS_TASK_STAT_PRIO, (INT8U *) (void *)"uC/OS-II Stat", &err);
#endif
}
#endif

统计任务代码

#if OS_TASK_STAT_EN > 0u
void  OS_TaskStat (void *p_arg)
{
#if OS_CRITICAL_METHOD == 3u                     /*采用第3种进入临界段的处理方法*/OS_CPU_SR  cpu_sr = 0u;
#endifp_arg = p_arg;                               /*防止编译错误*/while (OSStatRdy == OS_FALSE)				 /*如果统计任务就绪标志为假*/{OSTimeDly (2u * OS_TICKS_PER_SEC / 10u); /*延时0.2s,等待就绪标志为真*/}OSIdleCtrMax /= 100uL;if (OSIdleCtrMax == 0uL){OSCPUUsage = 0u;
#if OS_TASK_SUSPEND_EN > 0u(void)OSTaskSuspend (OS_PRIO_SELF);		/*统计任务把自己挂起*/
#elsefor (;;){OSTimeDly (OS_TICKS_PER_SEC);		/*延时1s*/}#endif}OS_ENTER_CRITICAL();OSIdleCtr = OSIdleCtrMax * 100uL;            /* Set initial CPU usage as 0%                        */OS_EXIT_CRITICAL();for (;;){OS_ENTER_CRITICAL();OSIdleCtrRun = OSIdleCtr;                /*获取过去0.1s的空闲计数器的值*/OSIdleCtr    = 0uL;                      /*清空空闲计数器,为下一次统计做准备*/OS_EXIT_CRITICAL();OSCPUUsage   = (INT8U) (100uL - OSIdleCtrRun / OSIdleCtrMax);/*计算CPU的利用率*/OSTaskStatHook();                        /*钩子函数,默认为空*/
#if (OS_TASK_STAT_STK_CHK_EN > 0u) && (OS_TASK_CREATE_EXT_EN > 0u)OS_TaskStatStkChk();                     /*堆栈检查*/
#endifOSTimeDly (OS_TICKS_PER_SEC / 10u);      /*计算下一次0.1s的OSIdleCtr*/}
}
#endif

OSInit()函数

  • 要使用µC/OS-II操作系统,需要在main()函数中调用OSInit()函数,空闲任务和统计任务就是在这个函数当中创建的。

二者的协调使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2807783.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

K线实战分析系列之七:行情顶部的看跌信号——黄昏星形态

K线实战分析系列之七:行情顶部的看跌信号——黄昏星形态 一、黄昏星形态二、黄昏线总结 一、黄昏星形态 二、黄昏线总结 黄昏星的高点形成阻力位,启明星的低点形成支撑位中间的星线实体与第一根K线的实体跳空区域比较宽,第三根K线覆盖了第一…

linux系统git仓库

git仓库 获取 Git 仓库(初始化仓库)创建裸库创建本地库 获取 Git 仓库(初始化仓库) 创建裸库 git仓库服务器创建useradd git passwd git mkdir /git-root/ cd /git-root/git init --bare shell.git #制作裸库chown -R git:gi…

Linux进程信号 ----- (信号保存)

前言 信号从产生到执行,并不会被立即处理,这就意味着需要一种 “方式” 记录信号是否产生,对于 31 个普通信号来说,一个 int 整型就足以表示所有普通信号的产生信息了;信号还有可能被 “阻塞”,对于这种多状…

在Win11上部署Stable Diffusion WebUI Forge

Stable Diffusion WebUI Forge 是 Stable Diffusion WebUI(基于 Gradio)之上的平台,可简化开发、优化资源管理并加快推理速度。“Forge”这个名字的灵感来自“Minecraft Forge”。这个项目旨在成为SD WebUI的Forge。 与原始 WebUI&#xff0…

MySQL数据库调优之关联查询、排序查询、分页查询、子查询、Group by优化

关联查询优化 1.准备工作 CREATE TABLE IF NOT EXISTS type(id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,card INT(10) UNSIGNED NOT NULL,PRIMARY KEY(id));CREATE TABLE IF NOT EXISTS book( bookid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, card INT(10) UNSIGNED N…

堆C++(Acwing)

代码&#xff1a; #include <iostream> #include <algorithm> #include <string.h>using namespace std;const int N 100010;int h[N], hp[N], ph[N], cnt;void heap_swap(int a, int b) {swap(ph[hp[a]] ,ph[hp[b]]);swap(hp[a], hp[b]);swap(h[a], h[b])…

1904_ARM Cortex M系列芯片特性小结

1904_ARM Cortex M系列芯片特性小结 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) ARM Cortex M系列的MCU用过好几款了&#xff0c;也涉及到了不同的内核。不过&#xff0c;关于这些内核的基本的特性还是有些不了解。从ARM的官方网站上找来了一个对比…

[力扣 Hot100]Day33 排序链表

题目描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 出处 思路 归并排序即可。 代码 class Solution { public:ListNode* merge(ListNode *h1,ListNode *h2) {ListNode *head nullptr;if(h1->val<h2->val){head h1;h1h1-…

Sora:颠覆性AI视频生成工具

Sora是一款基于人工智能&#xff08;AI&#xff09;技术的视频生成工具&#xff0c;它彻底改变了传统视频制作的模式&#xff0c;为创作者提供了高效、便捷、高质量的视频内容生成方式。通过深度学习和自然语言处理等先进技术&#xff0c;Sora实现了从文字描述到视频画面的自动…

计算机体系架构初步入门

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 目录 1 计算机五大…

数据结构-列表LinkedList

一,链表的简单的认识. 数组,栈,队列是线性数据结构,但都算不上是动态数据结构,底层都是依托静态数组,但是链表是确实真正意义上的动态数组. 为什么要学习链表? 1,链表时最简单的动态数据结构 2,掌握链表有助于学习更复杂的数据结构,例如,二叉树,trie. 3,学习链表有助于更深入…

【深度学习笔记】卷积神经网络——多输入多输出通道

多输入多输出通道 虽然我们在subsec_why-conv-channels中描述了构成每个图像的多个通道和多层卷积层。例如彩色图像具有标准的RGB通道来代表红、绿和蓝。 但是到目前为止&#xff0c;我们仅展示了单个输入和单个输出通道的简化例子。 这使得我们可以将输入、卷积核和输出看作二…

EasyRecovery2024电脑版软件评测与使用教程

一、EasyRecovery电脑版软件评测 EasyRecovery电脑版是一款功能强大、操作简便的数据恢复软件。它适用于多种场景&#xff0c;无论是误删除、格式化、分区丢失还是硬件故障&#xff0c;都能提供有效的恢复方案。该软件界面直观&#xff0c;即便没有技术背景的用户也能轻松完成…

使用 React 和 MUI 创建多选 Checkbox 树组件

在本篇博客中&#xff0c;我们将使用 React 和 MUI&#xff08;Material-UI&#xff09;库来创建一个多选 Checkbox 树组件。该组件可以用于展示树形结构的数据&#xff0c;并允许用户选择多个节点。 前提 在开始之前&#xff0c;确保你已经安装了以下依赖&#xff1a; Reac…

GEE入门篇|遥感专业术语(实践操作3):时间分辨率(Temporal Resolution)

目录 时间分辨率&#xff08;Temporal Resolution&#xff09; 1.Landsat 2.Sentinel-2 时间分辨率&#xff08;Temporal Resolution&#xff09; 时间分辨率是指特定传感器图像流的重访时间或时间节奏&#xff0c;重访时间是指卫星连续访问地球表面同一位置…

公众号平台迁移公证怎么操作?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;公众号账号迁移的作用可不止是变更主体哦&#xff01;还可以把多个公众号的粉丝、文章合并起来&#xff0c;打造一个超级大 V&#xff1b;还可以变更公众号主体、名称、类型&#xff0c;增加留言功能&#xff1b;个…

javascript监听浏览器离开、进入行为

document.addEventListener(visibilitychange, () > {if (document.visibilityState hidden) {alert(离开)}if (document.visibilityState visible) {alert(进入)}}) visibilitychange是浏览器新添加的一个事件&#xff0c;当其选项卡的内容变得可见或被隐藏时&#xff0…

PyPDF2:项目实战源码分享(PDF裁剪)

目录&#x1f4d1; 1. 背景&#x1f4d1;2. 源码模块解析&#x1f4d1;2.1 读取PDF页数2.2 获取指定页的宽高尺寸2.3 裁剪单页PDF2.4 批量裁剪PDF 总结&#x1f4d1; 1. 背景&#x1f4d1; 接PyPDF2模块推荐博文中提到的实际需求&#xff08;将银行网站下载来的多页且单页多张…

10s了解 共享动画

1. 目的&#xff1a; 界面切换&#xff0c;两控件变化关联&#xff0c;看起来更丝滑流程 2.怎么配置 为关联两控件加上相同transitionName 3.在Navigation开启共享动画 跳转到的界面 接收共享动画 4.在Activity中开启共享动画 同3 &#xff0c;在共享动画两个View加上相同的t…

政安晨【示例演绎虚拟世界开发】(一):Cocos Creator 的 Hello World

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: AI虚拟世界大讲堂 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正。 前言 Cocos Creator是一款非常强大的游戏开发引擎&#xff0c;它有着优秀…