第一范文网 - 专业文章范例文档资料分享平台

uC - OS-II实验指导书2014

来源:用户分享 时间:2025/6/5 14:32:28 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

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

搜索更多关于: uC - OS-II实验指导书2014 的文档
uC - OS-II实验指导书2014.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c7v1os3skfc01k8200sna_8.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top