ucos-ii 中OSTaskResume函数理解

简介: OSTaskResume() 的返回值为下述之一:* OS_NO_ERR:函数调用成功。* OS_TASK_RESUME_PRIO:要唤醒的任务不存在。

OSTaskResume() 的返回值为下述之一:

* OS_NO_ERR:函数调用成功。

* OS_TASK_RESUME_PRIO:要唤醒的任务不存在。

* OS_TASK_NOT_SUSPENDED:要唤醒的任务不在挂起状态。

* OS_PRIO_INVALID:参数指定的优先级大于或等于OS_LOWEST_PRIO。

 

#if OS_TASK_SUSPEND_EN > 0

INT8U OSTaskResume (INT8U prio)

{

#if OS_CRITICAL_METHOD == 3                     

    OS_CPU_SR cpu_sr;

#endif

    OS_TCB    *ptcb;                  //创建临时变量ptcb,用来指向任务控制块

#if OS_ARG_CHK_EN > 0

    if (prio >= OS_LOWEST_PRIO) {                               //检查优先级的有效性

        return (OS_PRIO_INVALID);

    }

#endif             

OS_ENTER_CRITICAL();

//获得该优先级的任务控制块,并判断是否存在。如果不存在,返回OS_TASK_RESUME_PRIO

if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {          

       OS_EXIT_CRITICAL();

              return (OS_TASK_RESUME_PRIO);

}

(说明:

uCOS_II.H中定义的:

#define OS_STAT_RDY              0x00         /* Ready to run                         00000000     

#define OS_STAT_SEM              0x01        /* Pending on semaphore                00000001

#define OS_STAT_MBOX          0x02        /* Pending on mailbox                   00000010

#define OS_STAT_Q                 0x04         /* Pending on queue                      00000100

#define OS_STAT_SUSPEND          0x08        /* Task is suspended                     00001000

#define OS_STAT_MUTEX            0x10     /* Pending on mutual exclusion semaphore      00010000

#define OS_STAT_FLAG              0x20        /* Pending on event flag group             00100000

)

    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != 0x00) {                     //判断是否是被挂起的任务

        if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) &&    

             (ptcb->OSTCBDly == 0)) {                                    

(说明:后3位置0,即将其转为OS_STAT_RDY状态,并且,任务没有被删除时,修改OSRdyGrpOSRdyTbl[]的值,将其变为就绪任务。其中OSTCBYOSTCBBitX是任务控制块的元素。OSTCBY=priority>>3OSTCBX=priority&0x07OSTCBBitY=OSMapTbl[priority>>3]OSTCBBitX=OSMapTbl[priority&0x07])

            OSRdyGrp               |= ptcb->OSTCBBitY;                   

            OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;

            OS_EXIT_CRITICAL();

            OS_Sched();                                                     //任务切换

        } else {

            OS_EXIT_CRITICAL();

        }

        return (OS_NO_ERR);

    }

    OS_EXIT_CRITICAL();

    return (OS_TASK_NOT_SUSPENDED);

}

#endif

相关文章
|
6月前
|
消息中间件 Web App开发 API
FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
|
6月前
|
Unix Linux Shell
Linux系统编程(exec函数家族和system函数)
Linux系统编程(exec函数家族和system函数)
80 0
|
NoSQL Shell C语言
用GCC开发STM32,正点原子开发板的一个库函数版本例程示例
用GCC开发STM32,正点原子开发板的一个库函数版本例程示例
用GCC开发STM32,正点原子开发板的一个库函数版本例程示例
|
测试技术 API 调度
15-FreeRTOS任务应用函数(1)
15-FreeRTOS任务应用函数(1)
|
存储 编解码 调度
17-FreeRTOS任务应用函数(3)
17-FreeRTOS任务应用函数(3)
|
测试技术
16-FreeRTOS任务应用函数(2)
16-FreeRTOS任务应用函数(2)
|
存储 缓存 安全
11-FreeRTOS配置函数 FreeRTOSConfig.h(下)
11-FreeRTOS配置函数 FreeRTOSConfig.h
|
编解码 数据可视化 编译器
11-FreeRTOS配置函数 FreeRTOSConfig.h(上)
11-FreeRTOS配置函数 FreeRTOSConfig.h
|
Web App开发 C语言 Linux
uCOS_II.C
  Lin-credible!  Linux内核读不懂,先读读 uCOS的中文注释的源码! 1 /* 2 ************************************************************************************************* 3 *
1339 0