实验八 uCOS-II的互斥信号量

合集下载

uC_OS-II实验指导书2015 - 8

uC_OS-II实验指导书2015 - 8
default: printf("时间:%d,任务TTaskMessageSen发消息失败,错误号:%d\n",OSTimeGet(),err);
} OSQQuery(myQ,&myQData); printf("时间:%d,当前队列中消息数量:%d\n",OSTimeGet(),myQData.OSNMsgs); } }
实验 8 µC/OS-II 任务间通信设计
1 实验目的
掌握嵌入式实时操作系统µC/OS-II 中信号量、消息邮箱、消息队列机制的基本原理和使用方法。
2 实验内容
数据类型定义如下: typedef unsigned char BOOLEAN; typedef unsigned charpedef unsigned short INT16U; typedef signed short INT16S; typedef unsigned long INT32U; typedef signed long INT32S; typedef unsigned short OS_STK; 任务控制块的结构定义如下: typedef struct os_tcb {
if (myMBox==(OS_EVENT *)0) /*检查邮箱是否存在*/ {
2
printf("时间:%d,任务TaskMessageRec判定邮箱不存在!\n",OSTimeGet()); OSTaskDel(OS_PRIO_SELF); /*不成功则删除本任务*/ return; }
while(1) {
prcount=(INT32U * )OSMboxPend(myMBox,0,perr); /*请求消息,如果消息不存在就阻塞*/ if (*perr==OS_ERR_NONE) printf("时间:%d,任务TaskMessageRec接收消息为%d\n",OSTimeGet(),*prcount); else printf("时间:%d,任务TaskMessageRec等待异常结束,错误号:%d\n",*perr);

UCOSII操作系统实验教程

UCOSII操作系统实验教程

下次实验的准备工作
• 阅读《嵌入式实时操作系统μC/OS原理与 实践》P67-72任务的挂起和恢复
实验9
任务的挂起和恢复
• 1.编译运行代码,输入选项3继续运行程序 • 2.运行查看结果
• 3.查看代码,说明为什么得到这样的运行 结果 • 4.对任务代码进行修改,得到不同的结果 • 5.改变任务的优先级,查看运行结果,说 明输出的不同之处,说明原因
补充,各个例子的运行结果展示 3
下次实验的准备工作
• 阅读《嵌入式实时操作系统μC/OS原理与 实践》P102-129 • 事件管理的重要数据结构,事件管理程 序,信号量管理
实验10 信号量管理实验
• 1.例子程序说明见《嵌入式实时操作系统 μC/OS原理与实践》 P129,运行结果见 P133图4.9 • 打开原始工程运行代码,输入选项4继续 运行程序 • 2.运行查看结果 • 3.说明使用信号量实现的功能,为什么能 实现这样的功能,都使用了哪些数据结构。
补充,各个例子的运行结果展示 1
准备工作
• 阅读《嵌入式实时操作系统μC/OS原理与 实践》P24-40 2.1任务管理的重要数据结 构,为以后的实验做准备
实验2
调试模式跑第一个任务
• 本实验的目的在于学会使用VC的调试模式 运行和调试操作系统。 • 步骤 • 1.在上次实验的基础上不改动代码,打开工 程 • 2.在usercode.c中的 • printf(“welcome to embeded system\n”);处 设置断点。
• 阅读《嵌入式实时操作系统μC/OS原理与 实践》P41-43任务控制块的初始化,P5154任务的创建
实验3
任务的创建
• 掌握任务创建的过程 • 步骤 • 1. 去掉前面的断点,找到main.c中 OSTaskCreate(FirstTask, 0, &TaskStk[5][TASK_STK_SIZE-1], 5);函数,设置 断点,并按F5调试运行,运行代码的时候输入 1,在运行到断点时,按F11追进函数内部,再按 F10单步运行,与书上51页进行比较。 • 2。画出该函数运行完成后的就绪表和就绪组,任 务控制块空闲链表和任务链表。

ucosii 互斥信号量 创建条件

ucosii 互斥信号量 创建条件

ucosii 互斥信号量创建条件摘要:1.ucosii 简介2.互斥信号量的概念3.互斥信号量的创建条件4.互斥信号量在ucosii 中的应用正文:【1.ucosii 简介】ucosii是一款基于μC/OS-II实时操作系统的嵌入式软件开发平台。

μC/OS-II是一个源代码公开的实时操作系统内核,其主要特点是可移植性强、占用资源少、实时性能优越,适用于各种嵌入式系统。

ucosii在μC/OS-II的基础上,提供了丰富的组件和工具,便于开发者快速构建嵌入式系统。

【2.互斥信号量的概念】互斥信号量(Mutex)是一种同步原语,用于实现多任务之间的互斥访问。

互斥信号量有一个计数器,用于表示当前有多少任务正在访问共享资源。

当一个任务要访问共享资源时,需要先请求互斥信号量。

如果计数器为零,表示当前没有其他任务访问共享资源,请求信号量后计数器加一,任务可以访问共享资源;如果计数器大于零,表示其他任务正在访问共享资源,请求信号量后计数器加一,任务需要等待其他任务访问完成后才能访问共享资源。

任务访问完共享资源后,释放互斥信号量,计数器减一,表示可以有其他任务访问共享资源。

【3.互斥信号量的创建条件】在ucosii 中,创建互斥信号量需要满足以下条件:1.互斥信号量对象需要分配在用户空间,不能分配在内核空间。

2.互斥信号量对象的初始化需要保证计数器为零,表示没有任务访问共享资源。

3.互斥信号量对象需要关联一个等待队列,用于存放等待访问共享资源的任务。

【4.互斥信号量在ucosii 中的应用】在ucosii 中,互斥信号量可以用于保护共享资源,避免多任务同时访问导致的数据不一致问题。

以下是一个简单的互斥信号量使用示例:```c#include "ucosii.h"#include "ucosii_os.h"// 定义共享资源int32_t g_data;// 创建互斥信号量MUTEX_T g_mutex;// 初始化互斥信号量void init_mutex() {mutex_init(&g_mutex, 0);}// 访问共享资源void access_data() {int32_t i;for (i = 0; i < 10; i++) {// 获取互斥信号量mutex_lock(&g_mutex);// 访问共享资源g_data = i;// 释放互斥信号量mutex_unlock(&g_mutex);}}// 任务入口void app_main() {init_mutex();// 启动多个任务访问共享资源while (1) {task_create(1, access_data, NULL);}}```在这个示例中,我们定义了一个共享资源g_data,并创建了一个互斥信号量g_mutex。

uC_OS-II实验指导书

uC_OS-II实验指导书

µC_OS-II实验指导书电子科技大学嵌入式软件工程中心北京科银京成技术有限公司目录第一部分实验系统简介及入门 (5)1 实验系统的目的 (5)2 实验系统的构成 (5)3 操作系统简介 (5)3.1 µC/OS-II概述 (5)3.2 µC/OS-II的特点 (6)3.3 µC/OS-II主要源代码文件介绍 (7)4 LambdaTOOL集成开发环境简介 (7)5 µC/OS-II实验内容简介 (8)5.1 任务管理实验 (8)5.2 优先级反转实验 (8)5.3 优先级继承实验 (9)5.4 哲学家就餐实验 (9)5.5 内存管理实验 (9)5.6 时钟中断实验 (9)5.7 消息队列实验 (9)6 预备实验:嵌入式开发环境的建立 (9)6.1 目的 (9)6.2 实验步骤及说明 (10)第二部分µC/OS-II实验 (24)实验1 任务的基本管理 (24)1 实验目的 (24)2 实验原理及程序结构 (24)2.1 实验设计 (24)2.2 操作系统配置 (25)2.3 源程序说明 (27)3 运行及观察应用输出信息 (29)4 本实验中所用到的µC/OS-II相关函数 (31)4.1 OSTaskCreate() (31)4.2 OSTaskSuspend() (31)4.3 OSTaskResume() (32)实验2 优先级反转 (33)1 实验目的 (33)2 原理及程序结构 (33)2.1 实验设计 (33)2.2 操作系统配置 (35)2.3 源程序说明 (36)3 运行及观察应用输出信息 (39)4 本实验中所用到的µC/OS-II相关函数 (39)4.1 OSSemCreate() (39)4.2 OSSemPend() (40)4.3 OSemPost() (40)4.4 OSTimeDly() (41)实验3 优先级继承 (42)1 实验目的 (42)2 原理及程序结构 (42)2.1 实验设计 (42)2.2 操作系统配置 (45)3 运行及观察应用输出信息 (46)4 本实验中所用到的µC/OS-II相关函数 (47)4.1 OSMutexCreate() (47)4.2 OSMutexPend() (47)4.3 OSMutexPost() (48)5 应用调试过程 (49)实验4 信号量:哲学家就餐问题的实现 (51)1 实验目的 (51)2 原理及程序结构 (51)2.1 实验设计 (51)2.2 操作系统配置 (52)3运行及观察应用输出信息 (53)4 本实验中所用到的µC/OS-II相关函数 (55)实验5 µC/OS-II的内存管理 (56)1 实验目的 (56)2 原理及程序结构 (56)2.1实验设计 (56)2.2 操作系统配置 (62)3 本实验中所用到的µC/OS-II相关函数 (63)3.1 OSMemCreate() (63)3.2 OSMemGet() (64)3.3 OSMemPut() (64)3.4 OSMemQuery() (65)实验6 时钟中断 (66)1 实验目的 (66)2 原理及程序结构 (66)2.1 实验设计 (66)2.2 操作系统配置 (68)3 运行及观察应用输出信息 (70)4 本实验中所用到的µC/OS-II相关函数 (71)实验7 消息队列 (72)1 实验目的 (72)2 原理及程序结构 (72)2.1 实验设计 (72)2.2 源程序说明 (72)2.3 操作系统配置 (77)3 运行及观察应用输出信息 (78)4 本实验中所用到的µC/OS-II相关函数 (82)4.1 OSQCreate() (82)4.2 OSQPend() (82)4.3 OSQPostFront() (83)4.4 OSQPost() (83)4.5 OSQFlush () (84)4.6 OSQQuery() (84)4.7 OSQDel() (85)4.8 OSTimeDlyHMSM() (85)第一部分实验系统简介及入门1 实验系统的目的通过此实验系统,读者可以了解嵌入式实时操作系统µC_OS-II的内核机制和运行原理。

uCOS-II信号量集

uCOS-II信号量集

等待任务链表
事件标志组、事件标志节点及任务控 制块之间的关系
给等待任务链表添加节点的函数为OS_FlagBlock( ),这个函数 的原型为: static void OS_FlagBlock ( OS_FLAG_GRP *pgrp, //信号量集指针 OS_FLAG_NODE *pnode, //待添加的等待任务节点指针 OS_FLAGS flags, //指定等待信号的数据 INT8U wait_type, //信号与等待任务之间的逻辑 INT16U timeout //等待时限 ); 这个函数将在请求信号量集函数OSFlagPend ( )中被调用。
任务可以通过调用函数OSFlagPend( )请求一个信号量 集,OSFlagPend( )函数的原型为:
OS_FLAGS OSFlagPend ( OS_FLAG_GRP *pgrp, //所请求的信号量集指针 OS_FLAGS flags, //滤波器 INT8U wait_type, //逻辑运算类型 INT16U timeout, //等待时限 INT8U *err //错误信息 );
发送(置位)事件标志组中的事件标志OSFlagPost()
case OS_FLAG_WAIT_SET_ANY://”或”方式等待 flags_rdy = pgrp->OSFlagFlags & pnode->OSFlagNodeFlags; if (flags_rdy != (OS_FLAGS)0) {//有满足条件的事件标志 if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) sched = TRUE; //如果任务就绪,设置调度标志 } break; } pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;//下一个等待 事件标志的节点 } if (sched == TRUE) OS_Sched();//如果设置了调度标志,则实施调度 *err = OS_NO_ERR; return (pgrp->OSFlagFlags); }

UCOS-互斥信号量(学习笔记)

UCOS-互斥信号量(学习笔记)

UCOS-互斥信号量(学习笔记)互斥信号量主要是为了解决信号量出现的优先级反转的情况:任务的运⾏取决于优先级和获得信号量2个条件,并且获得信号量⼜优先于设定的优先级。

剥夺性内核对信号量进⾏独占访问,就有可能出现先获得信号量的低优先级任务在独占信号量过程中被⾼优先级任务剥夺CPU 控制权⽽挂起,不能及时释放信号量,⽽⾼优先级任务⼜需要该信号量从⽽出现优先级反转。

解决的办法:引⼊互斥信号量,在任务获得共享信号量过程中提升置最⾼优先级不被打断(通过将信号量计数器分成⾼8位作为提升优先级,低8位作为占⽤标志0XFF表明未占⽤),从⽽使低优先级任务及时释放共享信号量。

其它与信号量相同。

⼀创建互斥信号量: OS_EVENT *OSMutexCreat(INT8U prio,INT8U &err)//从任务链表中取得⼀个任务控制块赋值类型为OS_Event_TYPE_MUXTEX,然后给任务计数器的⾼8位赋值优先级,第⼋位赋值0XFF表明未被占⽤。

⼆申请互斥信号量:void OSMutexPend(OS_EVENT *P, INT16U timeout,INT8U &err)//访问任务计数器若为0xff则获得运⾏权,否则进⼊等待列表,timeout⽤于指定等待时间。

OSMutexAccept(OS_EVENT *P,INT8U &err)//⽆等待的请求⼀个信号量。

三发送(释放)互斥信号量:INT8U OSMutexPost(OS_EVENT *P)四获得互斥型信号量的当前状态:INT8U OSMutexQuery(OS_EVENT *P,OS_MUTEX_DATA *pdata)//需事先定义⼀个存储互斥型信号量状态的变量。

五删除互斥型信号量:OS_EVENT *OSMutexDel(OS_EVENT *P, INT8U opt,INT8U &err)//opt为删除的选择项:⽴即删除、等待⽆任务等待时再删除。

uCOS-II互斥信号量

uCOS-II互斥信号量

μCOS-II互斥信号量Application NoteAN-1002Jean J. Labrossebrosse@概述:使用互斥信号(Mutual Exclusion Semaphores)或者简单的互斥(mutexes)实现对资源的独占访问,互斥信号本身是一种二进制信号,具有超出μCOS-II提供的一般信号机制的特性。

本手册描述了&#61549;C/OS-II V2.04增加的mutex一系列服务。

简介:在应用程序中使用互斥信号是为了减少优先级翻转问题(priority inversion problem),如μC/OS-II, The Real-Time kernel (ISBN 0-87930-543-6), section 2.16, page 47中描述的。

当一个高优先级的任务需要的资源被一个低优先级的任务使用是,就会发生优先级翻转问题。

为了减少优先级翻转问题,内核可以提高低优先级任务的优先级,先于高优先级的任务运行,释放占用的资源。

为了实现互斥,实时内核需要具有支持在同一优先级具有多个任务的能力。

不幸的是,μC/OS-II不允许在相同的优先级有多个任务,必须只有一个任务。

但是我们有另外的方法解决这个问题。

可以把需要资源的高优先级任务上面的一个任务使用Mutex保留,允许提高低优先级任务的优先级。

举一个mutexes信号工作的例子,如listing1所示。

Listing 1中有三个任务可以使用共同的资源,为了访问这个资源,每个任务必须在互斥信号ResourceMutex上等待(pend),任务#1有最高优先级10,任务#2优先级为15,任务#3优先级为20,一个没有使用的正好在最高优先级之上的优先级#9用来作为优先级继承优先级(Priority Inheritance Priority-PIP)。

如main()所示,L1(1)进行μC/OS-II初始化,并通过调用OSMutexCreate() L1(2)创建了一个互斥信号。

第五篇:uCOS-II

第五篇:uCOS-II

第五篇:uCOS-II 信号量及其操作1.信号量使⽤信号量之前⾸先要对信号量有⼀个本质的认识(1)信号量的含义:信号量是⼀类事件,使⽤信号量的最初⽬的是为了给共享资源设⽴⼀个标志,该标志表⽰共享资源的占⽤情况,这样,当⼀个任务在访问共享资源之前,就可以对这个标志进⾏查询,从⽽在了解资源被占⽤的情况之后,再来决定⾃⼰的⾏为。

(2)UCOS-II的信号量⾥⾯有⼀个OSEventCnt,正确的认识这个,是使⽤信号量的关键。

OSSemCreate(0):这种情况下可以⽤任务的同步。

OSSemCreate(1):这种情况类似于互斥信号量,有⼀个名字就是⼆值信号量,可⽤于⼀个资源的使⽤OSSemCreate(>1):这种情况表⽰有>1个资源可以使⽤。

(3)OSEventCnt的初始数据代表可⽤的资源数,1就是⼀个可⽤资源,n就是n可⽤资源。

(4)OSTimeTick 函数⾥⾯有⼀个需要注意的地⽅。

a如果事件中设置了0SxxxPend的延时的话,会进到下⾯函数的这个地⽅。

b如果设置的是⼀直等到的话,将通过OSXXXPost释放。

在延迟的时间⾥⾯没有就绪的话,任务OSTCBStatPend被设置成超时,并清除相应的标志位。

if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {ptcb->OSTCBStat &= (INT8U)~(INT8U)OS_STAT_PEND_ANY;ptcb->OSTCBStatPend = OS_STAT_PEND_TO;}在延迟的时间⾥⾯任务收到信息,任务OSTCBStatPend被设置成OKelse{ptcb->OSTCBStatPend = OS_STAT_PEND_OK;}如果任务没有被挂起的话,任务将加⼊到就绪列表。

if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {OSRdyGrp |= ptcb->OSTCBBitY;OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;}(5)下⾯分两种情况进⾏详细的讨论A. OSSemCreate(0)这种情况下⽤于信号的同步OSSemPen(xx, 0, xx)设置为0的话,任务将被⼀直挂起直到收到OSSemPost信号。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验八uCOS的互斥信号量
一:实验目的:
1.理解互斥型信号量。

2.学会使用互斥型信号量实现对共享资源的独占式处理。

3.解决任务在使用独占式资源出现的优先级反转问题。

二:实验内容:
完成教材5-7实验,使用互斥型信号量实现对共享资源的独占式处理。

实验中要求要创建互斥型信号量,请求互斥型信号量,发送互斥型信号量,删除互斥型信号量。

三:程序代码:
#include "includes.h"
#define TASK_STK_SIZE 512
OS_STK StartTaskStk[TASK_STK_SIZE];
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YouTaskStk[TASK_STK_SIZE];
OS_STK HerTaskStk[TASK_STK_SIZE];
INT16S key;
char *s1="MyTask running--yangkun";
char *s2="YouTask running--yangkun";
char *s3="HerTask running--yangkun";
char *s4="MyTask pend_Semp";
char *s5="HerTask pend_Semp";
INT8U err;
INT8U y=0;
INT32U Times=0;
OS_EVENT *Semp;
void StartTask(void *pdata);
void MyTask(void *pdata);
void YouTask(void *pdata);
void HerTask(void *pdata);
void main (void)
{
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS, OSCtxSw);
Semp=OSMutexCreate(1,&err);
OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE - 1], 0);
OSStart();
}
void StartTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
OSTaskCreate(MyTask,(void*)0,&MyTaskStk[TASK_STK_SIZE - 1], 3);
OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE - 1], 4);
OSTaskCreate(HerTask,(void*)0,&HerTaskStk[TASK_STK_SIZE - 1], 5);
for (;;)
{
if (PC_GetKey(&key) == TRUE) {
if (key == 0x1B) {
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0, 0, 3, 0);
}
}
void MyTask(void *pdata)
{
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for(;;)
{
OSTimeDlyHMSM(0,0,0,200);
{
PC_DispStr(10,++y,s4,DISP_BGND_BLACK+DISP_FGND_WHITE);
OSMutexPend(Semp,0,&err);
PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
}
OSTimeDlyHMSM(0,0,0,200);
}
}
void YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for(;;)
{
PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);
OSTimeDlyHMSM(0,0,0,300);
}
}
void HerTask(void *pdata)
{
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for(;;)
{
PC_DispStr(10,++y,s5,DISP_BGND_BLACK+DISP_FGND_WHITE);
OSMutexPend(Semp,0,&err);
PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);
for(Times;Times<20000000;Times++)
{
OS_Sched();
}
PC_DispStr(20,++y,"***************",DISP_BGND_BLACK+DISP_FGND_WHITE);
OSMutexPost(Semp);
OSTimeDlyHMSM(0,0,1,0);
}
}
四:实验结果:。

相关文档
最新文档