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


    空闲任务—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;
    #endif
    	p_arg = p_arg;                               /*防止编译器警告未使用'p_arg’*/	
    	for (;;)
    	{
    		OS_ENTER_CRITICAL();					/*关闭中断*/
    		OSIdleCtr++;							/*空闲任务只是做计数工作*/
    		OS_EXIT_CRITICAL();						/*开放中断*/
    		OSTaskIdleHook();                       /*调用用户可定义的HOOK*/
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    统计任务—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 > 0u
    	INT8U  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 > 0u
    	OSTaskNameSet (OS_TASK_STAT_PRIO, (INT8U *) (void *)"uC/OS-II Stat", &err);
    #endif
    }
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    统计任务代码

    #if OS_TASK_STAT_EN > 0u
    void  OS_TaskStat (void *p_arg)
    {
    #if OS_CRITICAL_METHOD == 3u                     /*采用第3种进入临界段的处理方法*/
    	OS_CPU_SR  cpu_sr = 0u;
    #endif
    	p_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);		/*统计任务把自己挂起*/
    #else
    		
    		for (;;)
    		{
    			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();                     /*堆栈检查*/
    #endif
    		OSTimeDly (OS_TICKS_PER_SEC / 10u);      /*计算下一次0.1s的OSIdleCtr*/
    	}
    }
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    OSInit()函数

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

    二者的协调使用

  • 相关阅读:
    SSM框架-spring中bean的依赖注入
    springboot网上课程教学授课网站java
    Wireshark TS | 应用传输缓慢问题
    30% 的抽成太多了!马斯克:我想和苹果老板库克谈谈「苹果税」
    java计算机毕业设计专业招聘网站(附源码、数据库)
    深度学习最终BOSS——TensorRT
    执行Hive查询时出现OOM
    数据分析实战│价格预测挑战【文末赠书】
    torch.manual_seed(0)报错RuntimeError: CUDA error: unspecified launch failure
    HUST网络攻防实践|5_二进制文件补丁技术|实验三 热补丁
  • 原文地址:https://blog.csdn.net/weixin_45880844/article/details/136268151