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 系统空闲任务,统计任务和应用任务相关推荐

  1. UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机

    UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...

  2. IAR中移植UCOS II系统以及sourceInsight 使用

    ucos 学习笔记 1 sourceInsight 使用 CSDN参考链接 新建工程 第一步:project中new project 第二步:在高亮部分输入工程的地址,工程文件夹与IAR工程文件夹放在 ...

  3. 凤凰os可以运行linux软件吗,手机玩游戏不爽?来试试Phoenix OS凤凰系统

    原标题:手机玩游戏不爽?来试试Phoenix OS凤凰系统 手机玩游戏不爽?来试试Phoenix OS 国庆假期和伙伴结伴玩游戏,虽然好玩,但总感觉不尽兴.手机尺寸的限制总归还是影响游戏的体验. 今天 ...

  4. 操作系统实验六、系统内存使用统计

    实验六:系统内存使用统计 一.实验目的 1.了解windows内存管理机制,理解页式存储管理技术. 2.熟悉Windows内存管理基本数据结构. 3.掌握WIndows内存管理基本API的使用. 二. ...

  5. 嵌入式实时操作系统μC/OS II(一)

    嵌入式实时操作系统μC/OS II 为什么要学习μC/OS-II ㈠.凡从事嵌入式系统开发工作的人,必须对嵌入式操作系统有足够的了解. ㈡.对于初学者,从μC/OS-II开始是个明智的选择. 1.μC ...

  6. uc/OS II——多任务设计

    uc/OS II--多任务设计 (1)设计 开始任务 [1]/声明 开始任务 任务块 static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE]; ...

  7. 全面了解MAC OS X系统(以 Mac OS 9为例)

    全面了解MAC OS X系统-适用开发人员 Mac OS X 既是以往 Macintosh 操作系统的重大升级,也是对其的一种自然演化.它继承了 Macintosh 易于操作的传统,但其设计不只是让人 ...

  8. 苹果Mac OS X系统安全评级(1)

    兼述:BASIC SECURITY MODEL 苹果Mac OS X系统安全性能的完善是一个长久而持续的过程,在这个过程中,我们还可以从一个侧面回忆一下操作系统安全体系发展的过程. 在80年代初,IB ...

  9. 【BETA】Mac技巧之查看苹果电脑 Mac OS X 系统是否开启 64 位运算,以及设置 32/64 位模式的方法...

    苹果电脑 Mac OS X 10.6 雪豹系统同时支持 32 位和 64 位模式,关于开启 64 位的好处,字太多,本文后半段介绍.下面先说查看你的苹果电脑是否开启了 64 位以及设置苹果电脑 Mac ...

  10. Mac技巧之查看苹果电脑 Mac OS X 系统是否开启 64 位运算,以及设置 32/64 位模式的方法

    Mac技巧之查看苹果电脑 Mac OS X 系统是否开启 64 位运算,以及设置 32/64 位模式的方法 引用功能被关闭了. 苹果电脑 Mac OS X 10.6 雪豹系统同时支持 32 位和 64 ...

最新文章

  1. 江湖又现中科大少年班的传说
  2. 来一次有侧重点的区分Swift与Objective-C
  3. python画日漫_不能错过的Python漫画
  4. ◦将一个java文件变成Jar包的过程
  5. c++向量和数组的区别_向量,矩阵和张量的导数 | 简单的数学
  6. 【报告分享】2020中国数字化后浪:中小企业转型与创新实录.pdf(附下载链接)...
  7. c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const
  8. java中的银行界面开发_ATM机银行项目java图形界面
  9. 2021年PMP考试模拟题11(含答案解析)
  10. 时间序列研(part14)--习题
  11. 嵌入式linux设置屏幕亮度
  12. Win10正式版怎么卸载IE浏览器?
  13. everedit 格式化json_Bracket 使用指南
  14. poscms会员头像更新接口
  15. ubuntu和windows之间实现复制粘贴
  16. 草履虫纳米机器人_草履虫大小的微型机器人:由激光驱动,未来可用于显微外科手术!...
  17. 终端运行npm install @tinymce/tinymce-vue -S报错的解决办法
  18. CTP For Python
  19. vscode 代码出现波浪线
  20. 【腾讯】2017暑期实习生

热门文章

  1. 关注星辰大海的腾讯和热爱天文的马化腾
  2. Ubunto无法提取tar文件
  3. python获取List数组中重复元素的个数(arcpy中统计FeatureClass中各类型地物要素的图斑数)(地理国情监测)
  4. 文件在线压缩与解压|基于Springboot实现文件在线压缩与解压
  5. 大同煤矿生产用水无线监测方案
  6. python三维图如何标注曲面_Matplotlib:Python三维绘图
  7. TensorFlow入门教程(21)分心驾驶行为检测
  8. python 打包成exe_Python打包成exe
  9. GPS北斗卫星信号防护装置(卫星时空防护装置)规格书
  10. 宽带自组网电台对比测试——西安跳跳通 VS 美国silvus