µC/OS-II 系统空闲任务,统计任务和应用任务
1.任务类型划分
µC/OS-II系统任务类型可以大致分为三种,空闲任务,统计任务,应用任务(用户开发对应功能模块需要创建的任务)
2.任务类型介绍
a.首先说一下空闲任务和统计任务:
µC/OS-II要用户在使用任何服务之前先调用OSInit() 。它会建立两个任务:空闲任务和统计任务,前者在没有其它任务处于就绪态时运行;后者计算CPU的利用率。
OSInit() 接口定义如下:
/*
*********************************************************************************************************
* INITIALIZATION
*
* Description: This function is used to initialize the internals of uC/OS-II and MUST be called prior to
* creating any uC/OS-II object and, prior to calling OSStart().
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/void OSInit (void)
{OSInitHookBegin(); /* Call port specific initialization code */OS_InitMisc(); /* Initialize miscellaneous variables */OS_InitRdyList(); /* Initialize the Ready List */OS_InitTCBList(); /* Initialize the free list of OS_TCBs */OS_InitEventList(); /* Initialize the free list of OS_EVENTs */
#if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)OS_FlagInit(); /* Initialize the event flag structures */
#endif#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)OS_MemInit(); /* Initialize the memory manager */
#endif#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)OS_QInit(); /* Initialize the message queue structures */
#endifOS_InitTaskIdle(); /* Create the Idle Task */
#if OS_TASK_STAT_EN > 0OS_InitTaskStat(); /* Create the Statistic Task */
#endif#if OS_TMR_EN > 0OSTmr_Init(); /* Initialize the Timer Manager */
#endifOSInitHookEnd(); /* Call port specific init. code */#if OS_DEBUG_EN > 0OSDebugInit();
#endif
}
前面有说到空闲任务什么时候会执行,下面说一下统计任务的作用。
作用1:CPU使用率统计
实际上,如果用户要计算CPU的利用率时,也需要先 建立一个任务。µCOS-II的统计任务要求在整个一秒钟内没有任何其它任务运行。如果用户在启动多任务之前要建立其它任务,必须保证用户的任务代码监控全局变量OSStatRdy和延时程序 [即调用 OSTimeDly()]的执行,直到这个变量变成TRUE。这表明µC/OS-II的CPU利用率统计函数已经采集到了数据。
统计任务的代码如下:
/*
*********************************************************************************************************
* STATISTICS TASK
*
* Description: This task is internal to uC/OS-II and is used to compute some statistics about the
* multitasking environment. Specifically, OS_TaskStat() computes the CPU usage.
* CPU usage is determined by:
*
* OSIdleCtr
* OSCPUUsage = 100 * (1 - ------------) (units are in %)
* OSIdleCtrMax
*
* Arguments : parg this pointer is not used at this time.
*
* Returns : none
*
* Notes : 1) This task runs at a priority level higher than the idle task. In fact, it runs at the
* next higher priority, OS_TASK_IDLE_PRIO-1.
* 2) You can disable this task by setting the configuration #define OS_TASK_STAT_EN to 0.
* 3) You MUST have at least a delay of 2/10 seconds to allow for the system to establish the
* maximum value for the idle counter.
*********************************************************************************************************
*/#if OS_TASK_STAT_EN > 0
void OS_TaskStat (void *p_arg)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */OS_CPU_SR cpu_sr = 0;
#endif(void)p_arg; /* Prevent compiler warning for not using 'p_arg' */while (OSStatRdy == OS_FALSE) {OSTimeDly(2 * OS_TICKS_PER_SEC / 10); /* Wait until statistic task is ready */}OSIdleCtrMax /= 100L;if (OSIdleCtrMax == 0L) {OSCPUUsage = 0;(void)OSTaskSuspend(OS_PRIO_SELF);}for (;;) {OS_ENTER_CRITICAL();OSIdleCtrRun = OSIdleCtr; /* Obtain the of the idle counter for the past second */OSIdleCtr = 0L; /* Reset the idle counter for the next second */OS_EXIT_CRITICAL();OSCPUUsage = (INT8U)(100L - OSIdleCtrRun / OSIdleCtrMax);OSTaskStatHook(); /* Invoke user definable hook */
#if (OS_TASK_STAT_STK_CHK_EN > 0) && (OS_TASK_CREATE_EXT_EN > 0)OS_TaskStatStkChk(); /* Check the stacks for each task */
#endifOSTimeDly(OS_TICKS_PER_SEC / 10); /* Accumulate OSIdleCtr for the next 1/10 second */}
}
#endif
OSCPUUsage为统计获取到的CPU使用率。
作用2:堆栈检查
OS_TaskStatStkChk()统计各个任务的stack的使用情况,实现代码如下:
/*
*********************************************************************************************************
* CHECK ALL TASK STACKS
*
* Description: This function is called by OS_TaskStat() to check the stacks of each active task.
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/#if (OS_TASK_STAT_STK_CHK_EN > 0) && (OS_TASK_CREATE_EXT_EN > 0)
void OS_TaskStatStkChk (void)
{OS_TCB *ptcb;OS_STK_DATA stk_data;INT8U err;INT8U prio;for (prio = 0; prio <= OS_TASK_IDLE_PRIO; prio++) {err = OSTaskStkChk(prio, &stk_data);if (err == OS_ERR_NONE) {ptcb = OSTCBPrioTbl[prio];if (ptcb != (OS_TCB *)0) { /* Make sure task 'ptcb' is ... */if (ptcb != OS_TCB_RESERVED) { /* ... still valid. */
#if OS_TASK_PROFILE_EN > 0#if OS_STK_GROWTH == 1ptcb->OSTCBStkBase = ptcb->OSTCBStkBottom + ptcb->OSTCBStkSize;#elseptcb->OSTCBStkBase = ptcb->OSTCBStkBottom - ptcb->OSTCBStkSize;#endifptcb->OSTCBStkUsed = stk_data.OSUsed; /* Store the number of bytes used */
#endif}}}}
}
#endif
每一个任务优先级对应唯一的一个任务,通过优先级遍历每一个任务,统计各个任务的stack栈的使用情况。
ptcb->OSTCBStkUsed为对应任务stack的使用情况。
堆栈检测需要注意点:
(1). 当用户不知道应该给任务分配多少堆栈空间时,堆栈检查功能是很有用的。在这个例子里,先分配足够的堆栈空间给任务,然后用堆栈检查操作看看任务到底需要多少堆栈空间。显然,任务要运行足够长时间,并要考虑各种情况才能得到正确数据。
(2). 决定的堆栈大小还要考虑系统今后的扩展,一般多分配10%,25%或者更多。如果系统对稳定性要求高,则应该多一倍以上。
(3). uCOS-II的堆栈检查功能要求任务建立时堆栈清零。OSTaskCreateExt()可以执行此项操作(设置选项OS_TASK_OPT_STK_CHK和OS_TASK_OPT_STK_CLR打开此项操作。
堆栈检测的原理:
uCOS-II从栈底向栈顶搜索非0元素(参看图F 1.1),同时用一个计数器记录0元素的个数。见下图:
|
b.应用任务的创建:
在开始多任务之前,笔者建立了一个叫做TaskStart()的任务,在启动多任务OSStart()之前用户至少要先建立一个任务,这一点非常重要。
不这样做用户的应用程序将会崩溃。
OSTaskCreate(Task_start,(void *)0,&startup_task_stk[STARTUP_TASK_STK_SIZE-1], STARTUP_TASK_PRIO);
用户添加各个功能模块的任务,可以在Task_start任务里去创建,如下图:
void Task_start(void *p_arg)
{OS_CPU_SR cpu_sr;(void)p_arg; // 'p_arg' 并没有用到,防止编译器提示警告OS_ENTER_CRITICAL(); OSTaskCreate(TaskLed0, (void * )0, (OS_STK *)&TASK_LED0_STK[LED_STK_SIZE-1], LED0_TASK_Prio);OSTaskCreate(TaskKey, (void * )0, (OS_STK *)&TASK_KEY_STK[LED_STK_SIZE-1], KEY_TASK_Prio);OSTaskSuspend(STARTUP_TASK_PRIO); //suspend but not deleteOS_EXIT_CRITICAL();
}
µC/OS-II 系统空闲任务,统计任务和应用任务相关推荐
- UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机
UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...
- IAR中移植UCOS II系统以及sourceInsight 使用
ucos 学习笔记 1 sourceInsight 使用 CSDN参考链接 新建工程 第一步:project中new project 第二步:在高亮部分输入工程的地址,工程文件夹与IAR工程文件夹放在 ...
- 凤凰os可以运行linux软件吗,手机玩游戏不爽?来试试Phoenix OS凤凰系统
原标题:手机玩游戏不爽?来试试Phoenix OS凤凰系统 手机玩游戏不爽?来试试Phoenix OS 国庆假期和伙伴结伴玩游戏,虽然好玩,但总感觉不尽兴.手机尺寸的限制总归还是影响游戏的体验. 今天 ...
- 操作系统实验六、系统内存使用统计
实验六:系统内存使用统计 一.实验目的 1.了解windows内存管理机制,理解页式存储管理技术. 2.熟悉Windows内存管理基本数据结构. 3.掌握WIndows内存管理基本API的使用. 二. ...
- 嵌入式实时操作系统μC/OS II(一)
嵌入式实时操作系统μC/OS II 为什么要学习μC/OS-II ㈠.凡从事嵌入式系统开发工作的人,必须对嵌入式操作系统有足够的了解. ㈡.对于初学者,从μC/OS-II开始是个明智的选择. 1.μC ...
- uc/OS II——多任务设计
uc/OS II--多任务设计 (1)设计 开始任务 [1]/声明 开始任务 任务块 static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE]; ...
- 全面了解MAC OS X系统(以 Mac OS 9为例)
全面了解MAC OS X系统-适用开发人员 Mac OS X 既是以往 Macintosh 操作系统的重大升级,也是对其的一种自然演化.它继承了 Macintosh 易于操作的传统,但其设计不只是让人 ...
- 苹果Mac OS X系统安全评级(1)
兼述:BASIC SECURITY MODEL 苹果Mac OS X系统安全性能的完善是一个长久而持续的过程,在这个过程中,我们还可以从一个侧面回忆一下操作系统安全体系发展的过程. 在80年代初,IB ...
- 【BETA】Mac技巧之查看苹果电脑 Mac OS X 系统是否开启 64 位运算,以及设置 32/64 位模式的方法...
苹果电脑 Mac OS X 10.6 雪豹系统同时支持 32 位和 64 位模式,关于开启 64 位的好处,字太多,本文后半段介绍.下面先说查看你的苹果电脑是否开启了 64 位以及设置苹果电脑 Mac ...
- Mac技巧之查看苹果电脑 Mac OS X 系统是否开启 64 位运算,以及设置 32/64 位模式的方法
Mac技巧之查看苹果电脑 Mac OS X 系统是否开启 64 位运算,以及设置 32/64 位模式的方法 引用功能被关闭了. 苹果电脑 Mac OS X 10.6 雪豹系统同时支持 32 位和 64 ...
最新文章
- 江湖又现中科大少年班的传说
- 来一次有侧重点的区分Swift与Objective-C
- python画日漫_不能错过的Python漫画
- ◦将一个java文件变成Jar包的过程
- c++向量和数组的区别_向量,矩阵和张量的导数 | 简单的数学
- 【报告分享】2020中国数字化后浪:中小企业转型与创新实录.pdf(附下载链接)...
- c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const
- java中的银行界面开发_ATM机银行项目java图形界面
- 2021年PMP考试模拟题11(含答案解析)
- 时间序列研(part14)--习题
- 嵌入式linux设置屏幕亮度
- Win10正式版怎么卸载IE浏览器?
- everedit 格式化json_Bracket 使用指南
- poscms会员头像更新接口
- ubuntu和windows之间实现复制粘贴
- 草履虫纳米机器人_草履虫大小的微型机器人:由激光驱动,未来可用于显微外科手术!...
- 终端运行npm install @tinymce/tinymce-vue -S报错的解决办法
- CTP For Python
- vscode 代码出现波浪线
- 【腾讯】2017暑期实习生
热门文章
- 关注星辰大海的腾讯和热爱天文的马化腾
- Ubunto无法提取tar文件
- python获取List数组中重复元素的个数(arcpy中统计FeatureClass中各类型地物要素的图斑数)(地理国情监测)
- 文件在线压缩与解压|基于Springboot实现文件在线压缩与解压
- 大同煤矿生产用水无线监测方案
- python三维图如何标注曲面_Matplotlib:Python三维绘图
- TensorFlow入门教程(21)分心驾驶行为检测
- python 打包成exe_Python打包成exe
- GPS北斗卫星信号防护装置(卫星时空防护装置)规格书
- 宽带自组网电台对比测试——西安跳跳通 VS 美国silvus