for (;;) {
printk(\
OSMutexPend(mutex, 0, &err); /* Acquire mutex to get continue */ printk(\
OSTimeDlyHMSM(0, 0, 0, 200); /* Wait 200 minisecond */
printk(\ releases the mutex. \\n\ }
TaskStart任务挂起后,操作系统调度它所创建的3个应用任务,整个系统的运行流程如下: (1)TASK2拥有最高优先级10,最先开始运行,它在t1时刻,执行OSMutexPend(mutex, 0, &err),成功获得互斥信号量mutex;
(2)t2时刻,TASK2执行延时函数OSTimeDlyHMSM(0, 0, 0, 200)被挂起200ms,操作系统调度优先级次之的TASK1运行;
(3)t3时刻,TASK1执行OSMutexPend(mutex, 0, &err)申请互斥信号量失败后被阻塞,操作系统调度优先级最低的TASK0运行。TASK0执行OSMutexPend(mutex, 0, &err)申请互斥信号量失败后也被阻塞。在TASK1和TASK0被阻塞的时候,由于当前拥有mutex的TASK2优先级最高,因此保持其优先级不变。当所有的应用任务都阻塞时,系统有一个空闲任务在运行,这个空闲任务是在初始化操作系统的时候创建的,它的优先级最低;
(4)t4时刻,TASK2延时到并运行,它执行OSMutexPost(mutex)释放互斥信号量并由TASK1获得此信号量。t5时刻TASK2将自己延时一段时间(150ms),任务回到运行状态;
(5)TASK1执行延时函数OSTimeDlyHMSM(0, 0, 0, 200)后被挂起200ms,空闲任务运行;在t6时刻TASK2因延时时间到恢复执行,它执行OSMutexPend(mutex, 0, &err)申请互斥信号量失败后被阻塞,空闲任务运行。此时操作系统发现当前拥有信号量的任务TASK1的优先级低于TASK2的,因此将TASK1的优先级提升到PIP,但TASK1此时仍处于延时状态未运行;
(7)t7时刻,TASK1延时到,它在高优先级(PIP)下继续运行,调用OSMutexPost(mutex)释放互斥信号量并由TASK2获得此信号量,TASK1的优先级恢复到原来的高度,而TASK2因优先级较高而抢占TASK1运行(在t8时刻);
(8)TASK2又将自己延时一段时间(200ms),任务TASK1恢复执行后也将自己延时一段时间(300ms),空闲任务运行;t9时刻TASK2延时时间先到,它执行OSMutexPost(mutex)释放互斥信号量,此时TASK0获得此信号量;
(9)t10时刻,TASK2延时(150ms),任务TASK0被调度运行;TASK0在打印输出信息后, }
OSMutexPost(mutex); /* Release mutex */ OSTimeDlyHMSM(0, 0, 0, (3-id)*150); /* Wait (3-id)*150 minisecond */
29
将自己延时(200ms),空闲任务运行;
(10)t11时刻,TASK1延时到恢复运行。TASK1执行OSMutexPend(mutex, 0, &err)申请互斥信号量失败后被阻塞;此时操作系统发现当前拥有信号量的TASK0优先级低于TASK1的,因此提升TASK0的优先级到PIP,空闲任务运行;
(11)t12时刻,TASK2延时到恢复运行,它执行OSMutexPend(mutex, 0, &err)申请互斥信号量失败后被阻塞;此时拥有信号量的TASK0的优先级已经被提升到了PIP,且高于TASK2的优先级,操作系统就没有针对TASK0再做优先级提升的工作。之后空闲任务运行;
(12)t13时刻,TASK0延时到,在高优先级(PIP)下继续运行,它执行OSMutexPost(mutex)释放互斥信号量,其优先级恢复到原来的高度,并由TASK2获得此信号量,TASK2抢占TASK0运行;
系统如此周而复始地运行下去……
2.2 操作系统配置
修改uC_OS-II/OS_CFG.h:
#define OS_MAX_EVENTS 10 /*最多可以有10个事件*/ #define OS_MAX_FLAGS 5 /*最多可以有5个事件标志*/ #define OS_MAX_MEM_PART 5 /*最多可以划分5个内存块*/ #define OS_MAX_QS 2 /*最多可以使用2个队列*/ #define OS_MAX_TASKS 6 /*最多可以创建6个任务*/ #define OS_LOWEST_PRIO 14 /*任务优先级不可以大于14*/ #define OS_TASK_IDLE_STK_SIZE 1024 /*空闲任务堆栈大小*/ #define OS_TASK_STAT_EN 1 /*是否允许使用统计任务*/ #define OS_TASK_STAT_STK_SIZE 1024 /*统计任务堆栈大小*/
#define OS_FLAG_EN 0 /*是否允许使用事件标志功能*/
#define OS_MBOX_EN 0 /*是否允许使用邮箱功能*/
#define OS_MEM_EN 1 /*是否允许使用内存管理的功能*/ #define OS_MEM_QUERY_EN 1 /*是否允许使用OSMemQuery()*/
#define OS_MUTEX_EN 1 /*是否允许使用互斥信号量的功能*/ #define OS_MUTEX_ACCEPT_EN 1 /*是否允许使用OSMutexAccept()*/ #define OS_MUTEX_DEL_EN 1 /*是否允许使用OSMutexDel()*/ #define OS_MUTEX_QUERY_EN 1 /*是否允许使用OSMutexQuery()*/
30
#define OS_Q_EN 0 /*是否允许使用队列功能*/
#define OS_SEM_EN 1 /*是否允许使用信号量功能*/ #define OS_SEM_ACCEPT_EN 1 /*是否允许使用OSSemAccept()*/ #define OS_SEM_DEL_EN 1 /*是否允许使用 OSSemDel() */ #define OS_SEM_QUERY_EN 1 /*是否允许使用 OSSemQuery()*/
#define OS_TASK_CHANGE_PRIO_EN 1 /*是否允许使用 OSTaskChangePrio()*/ #define OS_TASK_CREATE_EN 1 /*是否允许使用OSTaskCreate()*/ #define OS_TASK_CREATE_EXT_EN 1 /*是否允许使用OSTaskCreateExt()*/ #define OS_TASK_DEL_EN 1 /*是否允许使用OSTaskDel()*/
#define OS_TASK_SUSPEND_EN 1 /*是否允许使用OSTaskSuspend() and OSTaskResume()*/ #define OS_TASK_QUERY_EN 1 /*是否允许使用OSTaskQuery()*/
#define OS_TIME_DLY_HMSM_EN 1 /*是否允许使用OSTimeDlyHMSM()*/ #define OS_TIME_DLY_RESUME_EN 1 /*是否允许使用OSTimeDlyResume()*/ #define OS_TIME_GET_SET_EN 1 /*是否允许使用OSTimeGet() 和 OSTimeSet()*/ #define OS_SCHED_LOCK_EN 1 /*是否允许使用OSSchedLock()和OSSchedUnlock()*/ #define OS_TICKS_PER_SEC 200 /*设置每秒之内的时钟节拍数目*/
3 运行及观察应用输出信息
本实验运行后,从虚拟机的窗口中可以看到如下信息:
31
4 本实验中所用到的μC/OS-II相关函数
4.1 OSMutexCreate()
本实验通过调用OSMutexCreate(8,&err),设置了一个互斥信号量,其中8为PIP(优先级继承优先级)的值。
4.2 OSMutexPend()
该函数用于获得互斥信号量,其具体执行过程如下(关键代码解释):
If ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE){} 判断互斥信号量是否被占用
pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /*Yes, Acquire the resource */ pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save priority of owning task */ pevent->OSEventPtr = (void *)OSTCBCur; /* Point to owning task's OS_TCB */ 如果互斥信号量没有被占有,则获得互斥信号量,任务继续运行。
pip = (INT8U)(pevent->OSEventCnt >> 8); /* No, Get PIP from mutex */ mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get priority of mutex owner */
32
相关推荐: