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);

北航ARM9实验报告:实验3uCOS-II实验

北航ARM9实验报告:实验3uCOS-II实验

北航ARM9实验报告:实验3uCOS-II实验北航 ARM9 实验报告:实验 3uCOSII 实验一、实验目的本次实验的主要目的是深入了解和掌握 uCOSII 实时操作系统在ARM9 平台上的移植和应用。

通过实际操作,熟悉 uCOSII 的任务管理、内存管理、中断处理等核心机制,提高对实时操作系统的理解和应用能力,为后续的嵌入式系统开发打下坚实的基础。

二、实验环境1、硬件环境:ARM9 开发板、PC 机。

2、软件环境:Keil MDK 集成开发环境、uCOSII 源代码。

三、实验原理uCOSII 是一个可裁剪、可剥夺型的多任务实时内核,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。

其基本原理包括任务管理、任务调度、时间管理、内存管理和中断管理等。

任务管理:uCOSII 中的任务是一个独立的执行流,每个任务都有自己的堆栈空间和任务控制块(TCB)。

任务可以处于就绪、运行、等待、挂起等状态。

任务调度:采用基于优先级的抢占式调度算法,始终让优先级最高的就绪任务运行。

时间管理:通过系统时钟节拍来实现任务的延时和定时功能。

内存管理:提供了简单的内存分区管理和内存块管理机制。

中断管理:支持中断嵌套,在中断服务程序中可以进行任务切换。

四、实验步骤1、建立工程在 Keil MDK 中创建一个新的工程,选择对应的 ARM9 芯片型号,并配置相关的编译选项。

2、导入 uCOSII 源代码将 uCOSII 的源代码导入到工程中,并对相关的文件进行配置,如设置任务堆栈大小、系统时钟节拍频率等。

3、编写任务函数根据实验要求,编写多个任务函数,每个任务实现不同的功能。

4、创建任务在主函数中使用 uCOSII 提供的 API 函数创建任务,并设置任务的优先级。

5、启动操作系统调用 uCOSII 的启动函数,使操作系统开始运行,进行任务调度。

6、调试与测试通过单步调试、查看变量值和输出信息等方式,对系统的运行情况进行调试和测试,确保任务的执行符合预期。

4、uCOS-II-任务同步与通信-2

4、uCOS-II-任务同步与通信-2
某一分布式系统,需要主设备(M_Dev)使用同一个 UART 资源分别与从设备1(S_Dev1)和从设备2(S_Dev2) 以不同的 “串行通信模式” 进行通信。
Rx
Tx
UART
M_Dev
Rx
Tx
UART
S_Dev1
Rx
Tx
UART
S_Dev2
2020/8/23
page 7
void main(void) //系统主函数 { OSInit();
void Task_A(void * pdata) { ......; //Task_A环境初始化
for (;;) { ......; // Task_A 业务 OSTaskCreate(UART_S1_Task,(void *)US1,......); ......; // Task_A 业务 OSTimeDly( xxx ); } }
常用的事件:信号量(计数型---SEM/互斥型--MUTEX)、消息邮箱(MBOX)、消息队列(Q)、事件标 志组等。
2020/8/23 事件用 “事件控制块”(ECB) 来描述。
page 1
目录
1、 任务间的同步和事件控制块 2、 信号量及其操作 3、互斥型信号量和任务优先级反转 4、消息邮箱及其操作 5、消息队列及其操作
Task_A
Task_B
Task_A would print
Prtinter
Task_B would print
备注:数据采集任务A 和数据处理任务B 之间存在互斥关系。
2020/8/23
page 5
1 任务间的同步和事件控制块
任务之间的这种相互制约、相互合作的运行机 制称为 “任务间的同步”

uCOS-II任务间通讯和同步实验15页

uCOS-II任务间通讯和同步实验15页
3
二 实验内容
实验内容
使用信号量实现任务间同步 使用邮箱实现任务之间的通讯
4
三 预备知识
预备知识
了解操作系统任务调度的机制 了解操作系统任务间通讯的机制 学习uC/OS-II操作系统下多任务应用程序的编写方法
5
四 实验设备
实验设备
JX44B0教学实验箱 ADT1000仿真器和ADT IDE集成开发环境 串口连接线
JX44B0实验系统教案 uC/OS-II任务间通讯和同步实验
武汉创维特信息技术有限公司
11.01.2020
提纲
1
实验目的
2 实验内容
3 预备知识
4 实验设备
5 基础知识 6 实验过程 7 实验报告要求
2
一 实验目的
实验目的
掌握uC/OS-II操作系统下使用信号量解决任务之间的同步 问题
掌握uC/OS-II操作系统下任务间通讯的-II中使用消息队列实现任务之间的通讯
消息队列是uC/OS-II中另一种通讯机制,它可以使一个任 务或者中断服务子程序向另一个任务发送以指针方式定义 的变量。因具体的应用有所不同,每个指针指向的数据结 构变量也有所不同。
uC/OS-II提供了7个对消息队列进行操作的函数:创建消 息队列函数OSQCreate(),等待消息队列函数OSQPend(), 先进先出(FIFO)发送消息函数OSQPost(),后进先出(LIFO) 发送消息函数OSQPostFront(),无等待获取消息函数 OSQAccept(),清空消息队列函数OSQFlush()和查询消息 队列函数OSQQuery()。
12
六 实验过程
实验过程
13
六 实验报告要求

实验2 uCOS-II任务间通讯和同步实验

实验2 uCOS-II任务间通讯和同步实验

嵌入式实时操作系统实验报告1实验名称:uC/OS-II任务间通讯和同步实验姓名:班级:信科10-4班学号:uC/OS-II任务间通讯和同步实验一、实验目的1、掌握uC/OS-II操作系统下使用信号量解决任务之间的同步问题;2、掌握uC/OS-II操作系统下任务间通讯的方法。

二、实验内容1、使用信号量实现任务间同步(Eg2工程)2、使用邮箱实现任务之间的通讯(Eg3工程)三、基础知识uC/OS-II任务之间的通讯与同步方式1、利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中断2、利用函数OSSchedLock()和OSSchekUnlock()对µC/OS-II中的任务调度函数上锁和开锁3、信号量4、邮箱5、队列uC/OS-II中使用信号量进行任务之间同步1、通过调用OSSemCreate()建立信号量2、通过调用OSSemPost()函数发送一个信号量3、通过调用OSSemPend()函数等待一个信号量OSSemCreate1、Sem1 = OSSemCreate(0);2、参数为信号量的初始计数值赋值。

该初始值为0到65,535之间的一个数。

3、如果信号量是用来表示一个或者多个事件的发生,那么该信号量的初始值应设为0。

4、如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1(例如,把它当作二值信号量使用)。

5、如果该信号量是用来表示允许任务访问n个相同的资源,那么该初始值显然应该是n,并把该信号量作为一个可计数的信号量使用。

OSSemPost和OSSemPend1、如果信号量当前是可用的(信号量的计数值大于0),将信号量的计数值减1,然后函数将“无错”错误代码返回给它的调用函数。

如果信号量的计数值为0,而OSSemPend()函数又不是由中断服务子程序调用的,则调用OSSemPend()函数的任务要进入睡眠状态,等待另一个任务(或者中断服务子程序)发出该信号量。

第7章uCOS-II操作系统实验

第7章uCOS-II操作系统实验

第7章uCOS-II操作系统实验第7章μC/OS-II操作系统实验7.1 实验目的掌握μC/OS-II操作系统的基本使用方法。

掌握μC/OS-II操作系统中时钟节拍的概念和方法。

掌握μC/OS-II操作系统的任务管理的机制。

掌握μC/OS-II操作系统的任务之间进行通讯的方法。

掌握使用标准库函数和μC/OS-II操作系统编写多任务程序的设计方法。

7.2 实验内容(1)设计具有串口通信功能的多任务程序●每个任务在运行时向上位机串口输出“Taskx is running”,x 为任务号;●至少创建除启动任务外的3个任务;●任务1和任务2根据延时运行,运行1次任务1之后运行2次任务2;●任务1运行5次后删除任务1;●任务2运行10次后,通过挂起和恢复方式,任务2执行3次后执行一次任务3。

(2)设计基于邮箱消息的多任务程序●每个任务在运行时向上位机串口输出“Taskx is running”,x 为任务号;●至少创建除启动任务外的2个任务;●任务1根据延时运行;●任务2由串口命令运行(一个任意字符运行一次)或定时器触发运行(邮箱消息方式);●发挥:能够基于ucos-II设计一个显示任务,显示动画。

7.3 实验步骤(1)设计具有串口通信功能的多任务程序。

设计多任务方案、分析功能、设计流程图、确定变量功能和作用域、编写程序、调试代码、记录实验结果。

(2)设计基于邮箱消息的多任务程序。

设计多任务方案、设计通讯方案、分析功能、设计流程图、确定变量功能和作用域、编写程序、调试代码、记录实验结果。

7.4 实验结果附设计方案、流程图、程序的执行结果7.5 实验总结总结实验经验、总结中断服务程序的编写方法、分析程序中的缺陷及改进的方法。

7.6多任务例程Main.c的代码#include#define STACK_SIZE 128static OS_STK MyTask1Stack[STACK_SIZE];static OS_STK MyTask2Stack[STACK_SIZE];static OS_STK StartTaskStack[STACK_SIZE];#define MYTASK1_PRIO 10#define MYTASK2_PRIO 15#define STARTTASK_PRIO 8void MyTask1(void* p_arg);void MyTask2(void* p_arg);void StartTask(void* p_arg);void GPIO_Conf(void);int main(void){OSInit();OSTaskCreate(StartTask,(void*)0,(OS_STK*)&StartTaskStack[S TACK_SIZE-1],STARTTASK_P RIO);OSStart();void GPIO_Conf(){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE );GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOF,&GPIO_InitStructure);GPIO_SetBits(GPIOF,GPIO_Pin_6|GPIO_Pin_7);}void StartTask(void* p_arg){GPIO_Conf();SysTick_Config(SystemCoreClock/1000);OSTaskCreate(MyTask1,(void*)0,(OS_STK*)&MyTask1Stack[STACK_SIZE-1],MYTASK1_PRIO);OSTaskCreate(MyTask2,(void*)0,(OS_STK*)&MyTask2Stack[STACK_SIZE-1],MYTASK2_PRIO);OSTaskDel(OS_PRIO_SELF);}void MyTask1(void* p_arg){while(1){GPIO_WriteBit(GPIOF,GPIO_Pin_6,(BitAction)(1-GPIO_ReadInputDataBit(GPIOF,GPIO_ Pin_6)));OSTimeDly(1000);}void MyTask2(void* p_arg){while(1){GPIO_WriteBit(GPIOF,GPIO_Pin_7,(BitAction)(1-GPIO_ReadInputDataBit(GPIOF,GPIO_ Pin_7)));OSTimeDly(100);}}。

4、uCOS-II-任务同步与通信-1

4、uCOS-II-任务同步与通信-1
Repeat
禁止,然后允许任务切换 :利用μC/OS_Ⅱ 函数调用
Entry section (进入区)
Critical section (临界区)
Exit section (退出区)
Remainder section (剩余区)
Until false
2020/8/23
OSSchedLock();
if (OSRunning == TRUE) { /* Make sure multitasking is running */ OS_ENTER_CRITICAL(); if (OSLockNesting < 255) { /* Prevent OSLockNesting from wrapping
互斥信号量状态图
释放(递归) 锁定数减1
page 21
互斥信号量
所有权:当一个任务通过获取互斥信号量 而将其锁定时,得到该互斥信号量的所有 权。相反,当一个任务释放信号量时,失 去对其的所有权。
当一个任务拥有互斥信号量时,其他的任 务不能再锁定或释放它,即任务要释放互 斥信号量,必须事前先获取该信号量。
这通常称作测试并置位(Test-And-Set),或称作TAS。 TAS操作可能是微处理器的单独一条不会被中断的 指令,或者是在程序中关中断做TAS操作再开中断。
有的微处理器有硬件的TAS指令(如Motorola 68000系列,就 有这条指令)
2020/8/23
page 14
访问临界资源
Repeat
当运行到P1:request(D2)时,P1占用D1,但D2已经被P2占用, P1阻塞; 当运行到P2:request(D1)时,也将因为D1已被P1占用而阻塞, 产生死锁(条件: P1:request(D1), P2:request(D2))。 死锁:多个任务在运行过程中因争夺资源而造成的一种僵局。 原因:竞争资源引起;任务间推进顺序非法。

uCOS-II操作系统简介及实验解读

uCOS-II操作系统简介及实验解读
uC/OS-II操作系统
uC/OS-II操作系统
uC/OS-II操作系统简介 及开发过程
uC/OS-II操作系统
内 容
• • • • • • • •
一、 uCOS-II操作系统简介 二、 uCOS-II操作系统内核结构
三、 uCOS-II操作系统任务管理
四、 uCOS-II操作系统内存管理 五、 uCOS-II操作系统时间管理 六、 uCOS-II操作系统任务间的通讯 七、 uCOS-II操作系统移植 八、 uCOS-II操作系统实验
}任务(task)

μC/OS-Ⅱ可以管理多达64个任务。
优先级为0-63 优先级号越低,任务的优先级越高。 每个任务的优先级不能相同。

保留优先级:
高优先级:0、1、2、3 低优先级:OS_LOWEST_PRIO-3、 OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及 OS_LOWEST_PRI0

用户可以有多达56个应用任务。
uC/OS-II操作系统
删除任务
2.3 任务状态
等待 或挂 起 收 到 消 息
挂 起 时 间 到 任务调度
等 待 消 息
挂 起
中断
创建任务
休眠
删除任务
就绪
任务被抢占
删除任务
运行
中断结束
中断 服务
uC/OS-II操作系统
任务状态
• • • • • •
休眠态 - OSTaskCreate()或OSTaskCreateExt() 就绪态 等待态,就绪态,运行态 - OSTaskDel() - 休眠态 就绪态 - OSStart() - 运行态 运行态 - OSTimeDly()或OSTimeDlyHMSM() , OSSemPend(),OSMboxPend(),或OSQPend() 等待态 等待态 - OSTimeTick() -就绪态 空闲任务 - OSTaskIdle()

实验二-UCOS-II任务管理

实验二-UCOS-II任务管理

班级学号姓名同组人实验日期室温大气压成绩实验二 UCOS-II任务管理一、实验目的1、掌握UCOS-II中任务管理的函数的应用。

2、掌握UCOS-II在STM32平台下对硬件的控制。

3、掌握开发UCOS-II应用的程序结构。

二、实验步骤1、UCOSII工作原理UCOSII提供系统时钟节拍,实现任务切换和任务延时等功能。

这个时钟节拍由OS_TICKS_PER_SEC(在os_cfg.h中定义)设置,一般我们设置UCOSII的系统时钟节拍为1ms~100ms。

本次实验利用STM32的SYSTICK定时器来提供UCOSII时钟节拍。

UCOSII的任何任务都是通过一个叫任务控制块(TCB)的东西来控制的,每个任务管理块有3个最重要的参数:(1)任务函数指针;(2)任务堆栈指针;(3)任务优先级。

在UCOSII中,使用CPU的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得CPU使用权,只有高优先级的任务让出CPU使用权(比如延时)时,低优先级的任务才能获得CPU使用权。

UCOSII不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。

任务的调度其实就是CPU 运行环境的切换,即:PC指针、SP指针和寄存器组等内容的存取过程UCOSII的每个任务都是一个死循环。

每个任务都处在以下5种状态之一的状态下,这5种状态是:睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。

睡眠状态,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。

就绪状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行,这时任务的状态叫做就绪状态。

运行状态,该任务获得CPU使用权,并正在运行中,此时的任务状态叫做运行状态等待状态,正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。

4、uCOS-II-任务同步与通信-1

4、uCOS-II-任务同步与通信-1
当运行到P1:request(D2)时,P1占用D1,但D2已经被P2占用, P1阻塞; 当运行到P2:request(D1)时,也将因为D1已被P1占用而阻塞, 产生死锁(条件: P1:request(D1), P2:request(D2))。 死锁:多个任务在运行过程中因争夺资源而造成的一种僵局。 原因:竞争资源引起;任务间推进顺序非法。
POST
任务与ISR 之间的同步 (单向)
任务与任务 之间的同步 (双向)
page 8
在嵌入式多任务系统中,任务间的耦合 程度是不一样的:
耦合程度较高:任务之间需要进行大量的通 信,相应的系统开销较大;
耦合程度较低:任务之间不存在通信需求, 其间的同步关系很弱甚至不需要同步或互斥, 系统开销较小。
Exit section (退出区)
Remainder section (剩余区)
Until false
2020/8/23
关中断和开中断:利用μC/OS_Ⅱ 宏调用
OS_ENTER_CRITICAL();
__asm { MRS temp, SPSR ORR temp, temp, #NoInt MSR SPSR_c, temp } OsEnterSum++;
双向同步或通信:两个任务相互同步或通信。 双向同步不能在任务与ISR之间进行,因为 ISR不能等待。
2020/8/23
page 7
Task x
POST
ISR x
POST
POST
Task x
PEND
2020/8/23
PEND
Task y
任务与任务 之间的同步 (单向)
PEND
Task y
PEND

2 uCOS-II操作系统实验

2 uCOS-II操作系统实验

uC/OS-II操作系统
实验视频
• 点击此处观看视频 • 如果不能正确观看,请点击此处 • 本实验使用简易JTAG接口,在程序中必
须选择ARM9Simple ,如果使用标准 JTAG接口,请选择ARM9Lpt
uC/OS-II操作系统
2.6 uC/OS-II软件定时器编程实验
uC/OS-II操作系统
uC/OS-II操作系统
实验视频
• 点击此处观看视频 • 如果不能正确观看,请点击此处 • 本实验使用简易JTAG接口,在程序中必
须选择ARM9Simple ,如果使用标准 JTAG接口,请选择ARM9Lpt
uC/OS-II操作系统
2.11 uC/OS-II俄罗斯方块游戏设计
uC/OS-II操作系统
uC/OS-II操作系统
2.1 uC/OS-II移植实验
uC/OS-II操作系统
实验效果
• 如果实验运行正确,实验箱上最右边的 •

数码管将依次从0到F显示数据,同时四 个跑马灯由亮变灭或者由灭变亮 跑马灯闪烁和数码管显示分别在两个不 同的任务中进行 在DNW中有相应的显示
uC/OS-II操作系统
实验效果
• 采集实验箱的AIN0和AIN1两个通道的模 •
拟量,并转换成为数字以曲线的方式显 示在LCD上 通过旋动AIN0和AIN1旋钮可以改变输入 模拟的值,LCD上显示将发生变化 编译这些应用之前,必须先编译uc-gui库 工程

uC/OS-II操作系统
实验视频
• 点击此处观看视频 • 如果不能正确观看,请点击此处 • 本实验使用简易JTAG接口,在程序中必
须选择ARM9Simple ,如果使用标准 JTAG接口,请选择ARM9Lpt

嵌入式实时操作系统ucosII实验2

嵌入式实时操作系统ucosII实验2

嵌入式实时操作系统实验报告任务间通信机制的建立系别计算机与电子系专业班级电子0901班学生姓名高傲指导教师黄向宇提交日期 2012 年 4 月 1 日一、实验目的二掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。

掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理及解决优先级反转的策略——优先级继承的原理。

二、实验内容1.建立并熟悉Borland C 编译及调试环境。

2.使用课本配套光盘中第五章的例程运行(例5-4,例5-5,例5-6),观察运行结果,掌握信号量的基本原理及使用方法,理解出现优先级反转现象的根本原因并提出解决方案。

3.试编写一个应用程序,采用计数器型信号量(初值为2),有3个用户任务需要此信号量,它们轮流使用此信号量,在同一时刻只有两个任务能使用信号量,当其中一个任务获得信号量时向屏幕打印“TASK N get the signal”。

观察程序运行结果并记录。

4. 试编写一个应用程序实现例5-7的内容,即用优先级继承的方法解决优先级反转的问题,观察程序运行结果并记录。

5.在例5-8基础上修改程序增加一个任务HerTask,它和YouTask一样从邮箱Str_Box里取消息并打印出来,打印信息中增加任务标识,即由哪个任务打印的;MyTask发送消息改为当Times为5的倍数时才发送,HerTask接收消息采用无等待方式,如果邮箱为空,则输出“The mailbox is empty”, 观察程序运行结果并记录。

三、实验原理1. 信号量µC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。

用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样µC/OS-II 才能支持信号量。

在使用一个信号量之前,首先要建立该信号量,也即调用OSSemCreate()函数(见下一节),对信号量的初始计数值赋值。

实验二UCOS-II任务管理(DOC)

实验二UCOS-II任务管理(DOC)

班级学号姓名同组人实验日期室温大气压成绩实验二 UCOS-II 任务管理一、实验目的1、掌握 UCOS-II 中任务管理的函数的应用。

2、掌握 UCOS-II 在 STM32平台下对硬件的控制。

3、掌握开发 UCOS-II 应用的程序构造。

二、实验步骤1、 UCOSII工作原理UCOSII供给系统时钟节拍,实现任务切换和任务延时等功能。

这个时钟节拍由OS_TICKS_PER_SEC(在 os_cfg.h 中定义)设置,一般我们设置 UCOSII的系统时钟节拍为1ms~100ms。

本次实验利用 STM32的SYSTICK准时器来供给 UCOSII时钟节拍。

UCOSII的任何任务都是经过一个叫任务控制块( TCB)的东西来控制的,每个任务管理块有 3 个最重要的参数:( 1)任务函数指针; (2) 任务货仓指针; (3) 任务优先级。

在UCOSII中,使用 CPU的时候,优先级高(数值小)的任务比优先级低的任务拥有优先使用权,即任务就绪表中老是优先级最高的任务获取 CPU使用权,只有高优先级的任务让出 CPU使用权(比方延时)时,低优先级的任务才能获取 CPU使用权。

UCOSII不支持多个任务优先级相同,也就是每个任务的优先级一定不相同。

任务的调动其实就是 CPU 运转环境的切换,即: PC指针、 SP指针和存放器组等内容的存取过程UCOSII的每个任务都是一个死循环。

每个任务都处在以下5种状态之一的状态下,这 5种状态是:睡眠状态、就绪状态、运转状态、等候状态 ( 等候某一事件发生 ) 和中断服务状态。

睡眠状态,任务在没有被装备任务控制块或被剥夺了任务控制块时的状态。

就绪状态,系统为任务装备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但因为该任务的优先级比正在运转的任务的优先级低,还临时不可以运转,这时任务的状态叫做就绪状态。

运转状态,该任务获取 CPU使用权,并正在运转中,此时的任务状态叫做运转状态等候状态,正在运转的任务,需要等候一段时间或需要等候一个事件发生再运转时,该任务就会把 CPU的使用权让给其余任务而使任务进入等候状态。

实验四 uCOS II多事件同步实验

实验四 uCOS II多事件同步实验

实验四uC/OS II多事件同步实验一、实验目的●回顾uC/OS II 在Cortex-M3(LM3S9B2芯片)平台上的移植,以及RS232串口、TFT显示等驱动程序的加载。

●回顾µC/OS-II任务管理的基本函数调用,任务堆栈、任务控制块、任务就绪表的结构和作用。

●回顾嵌入式操作系统任务间通信的基本原理,消息邮箱和消息队列进行任务间的数据交换、数据通信等的基本函数,以及常用的应用场合。

●掌握信号量、互斥信号量以及信号量集的基本函数以及相关原理。

●应用µC/OS-II中的信号量、互斥信号量以及事件组(信号量集)处理简单的实际问题。

二、实验环境与设备1、实验独立进行,每位学生上交一份实验报告及其相应的程序。

2、安装Windows操作系统(Windows Xp)的计算机,并且已经安装VC 6.0编程调试软件。

3、安装Keil for ARM 仿真调试软件,JLink软件,超级终端或者串口精灵等辅助调试工具。

4、Cortex-M3(LM3S9B92内核)评估板,串口线,USB线,电源等。

三、预习要求1. 基本概念在µC/OS-II操作系统中,系统中的多个任务在运行时,经常需要相互无冲突地访问同一个共享资源,或者需要互相支持和依赖,甚至有时还要互相加以必要的限制和制约,才保证任务的顺利运行。

因此,µC/OS-II操作系统必须具有对任务的运行进行协调的能力,从而使任务之间可以无冲突、流畅地同步运行,而不致导致灾难性的后果。

在上一次的实验中,我们讨论并应用消息邮箱和消息队列完成了一些列的实验。

在uC/OS II中,除了消息邮箱和消息队列外,信号量、互斥信号量,以及事件组等都是为多任务间的同步与通信设计的,他们都在事件数据结构中定义。

事件的数据结构如下:typedef struct{INT8U OSEventType; //事件的类型INT16U OSEventCnt; //信号量计数器void *OSEventPtr; //消息或消息队列的指针INT8U OSEventGrp; //等待事件的任务组INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//任务等待表} OS_EVENT;其中OSEventType用来指明事件的类型OS_EVENT_TYPE_SEM 表明事件是信号量,值为3。

uCOS-II原理3_任务的同步与通信

uCOS-II原理3_任务的同步与通信
在一般的情況下,這個初始值為NULL;但也可以 事先vo定id義*O一SM個b郵ox箱Pen,d (然後把這個郵箱的指針作為參 數指向傳OIINN一遞STT_18個到E6UVU郵函E*teNir箱數mrTe。O*opuSet,vMenbto, x//C請r求ea消t//e//息等錯( )郵待誤中箱時資,指限訊使針之一開始就
(0IxNFTF)8U以*e表rr明信號量尚未被任//錯何誤任資務訊所佔用,處於有效狀態。
);
創數任息的建務,原郵如這可型箱個以果為函通需把數過:要數的調調據原用用緩型函函衝為數數:O區SOM的Sb指Mox針Pboos賦xtC(給r)e向a一t消e個息(事郵),件箱這發送個消函
消息郵箱及其操作 Ov)函消調;oIOv)SN;i息用o數S_di當個N用知則函T_dE郵函8*中EU控控O控兩緩*使數一函V任函UmVLm箱數S的EO任個數EL務s個制 衝制 制數sO_gNgN,S的O務E參任S的獲的M塊需區塊 塊TTMV如S進務任指取b*數/主M就要指的 的bE/o*p果消入o請務x消e針NO要mbx叫通針成 成Pv不等Po息求T,See息s。作oxnn做信的Mg員員_是待st郵同dC指成,為Tt用(bN消的/方OOr(狀Y箱時/)功e針o消的就消USSaP態x息任法時用;LtEE息C原E是e息L,vv需O郵務來_r如郵(型就eee查MS/並的要)/nan果箱之通_箱消為需把t看ttBN引ePT指調郵指息:,間信O郵O先yr郵(發t用p針_針指箱,X箱消通的定Ee箱一函,為針R指,同中息過。次指義R數則針常函的時通任郵傳針mOO該數消過數務S使sO箱遞SMgES息事函調的事的是數bEvo指數度ev件件返初xne在據tP的。針nPet始回tPn參返rt是dr值值(數是回N)。為e否給,UrrL調通為這L,

ucos-ii工作原理

ucos-ii工作原理

ucos-ii工作原理uC/OS-II(Micro C/Operating System-II)是一种用于嵌入式系统的实时操作系统。

它的工作原理可以简单归纳为以下几个步骤:1. 任务管理:uC/OS-II使用优先级调度算法管理多个任务。

每个任务都有一个优先级,高优先级的任务会优先执行。

uC/OS-II通过一个任务控制块(TCB)来管理每个任务的信息,包括任务的状态、堆栈信息、优先级等。

2. 中断处理:uC/OS-II可以处理多种类型的中断。

当发生中断时,uC/OS-II会根据中断类型进行相应的处理,并且可以自动切换到中断服务程序(ISR)进行执行。

中断服务程序中的代码通常是短小且高效的,用于处理特定的中断事件。

3. 任务切换:uC/OS-II使用抢占式的任务调度方式,因此任务切换可以发生在任何时刻。

当一个任务的时间片用尽或者有更高优先级的任务需要执行时,uC/OS-II会保存当前任务的上下文信息,并切换到下一个任务的执行。

任务切换时,uC/OS-II会保存当前任务的栈指针等信息,并从下一个任务的栈指针中恢复相应的上下文,以使下一个任务继续执行。

4. 事件同步:uC/OS-II提供了多种事件同步机制,如信号量、事件标志、消息邮箱等,用于任务之间的同步和通信。

这些机制可以帮助任务之间按照一定的顺序进行执行,实现数据共享和互斥访问等功能。

5. 内存管理:uC/OS-II提供了内存管理功能,可以动态分配和释放内存块。

这种内存管理机制可以帮助节省内存空间,提高系统的效率。

总而言之,uC/OS-II通过任务管理、中断处理、任务切换、事件同步和内存管理等机制,实现了对嵌入式系统的实时调度和资源管理,以提供稳定、可靠的操作系统支持。

4、uCOS-II-任务同步与通信-3

4、uCOS-II-任务同步与通信-3
消息邮箱 消息指针
PC
2020/8/23
page 3
4 消息邮箱及其操作
消息邮箱(Mbox)
它的主要功能就是用于在任务间传递一个数据;还要 为操作系统管理事件和任务提供一些参数。结构如下:
pevent
OSEventType OSEventCnt OSEventPtr OSEventGrp
OS_EVENT_TYPE_MBOX
0x0000
&message
0x00
0



0


message 消息数据 缓冲区
消息邮箱使用传递变量指针的手 段在任务之间进行通信。
OSEventTbl[ ]
0
2020/8/23
page 4
4 消息邮箱及其操作
消息邮箱的操作 ---- 创建消息邮箱
可以调用系统函数OSMboxCreate( )函数创建消息邮箱; 其原型如下:
4 消息邮箱及其操作
消息邮箱的操作 ---- 请求消息邮箱
err 是本函数执行状态的返回值,*err 的值含义:
➢ OS_NO_ERR ---- 请求成功,得到目标数据; ➢ OS_TIMEOUT ---- 超时,未得到目标数据; ➢ OS_ERR_EVENT_TYPE ---- 无效的事件类型; ➢ OS_ERR_PEND_ISR ---- 不支持ISR中的消息邮箱请求; ➢ OS_ERR_PEVENT_NULL ---- 指定的事件为空(不存在);
函数参数说明:
1、opt == OS_DEL_NO_PEND 如果没有等待任务时删除邮箱;
2、opt == OS_DEL_ALWAYS 无条件删除又向,所有等待该事 件的任务急转到就绪状态;

ucosII任务间通信详解

ucosII任务间通信详解

ucos II 任务间通信详解ucos II 任务间通信之一 :全局变量任务创建好了之后,只是完成了系统编程的一小步,更为重要的是任务间的通信。

比如在mcu21的项目里,有通信任务,有液晶显示任务,有控制任务。

控制任务需要用到通信任务接受到的数据,液晶显示任务也显示控制任务的数据。

这就需要用到任务间的通信了。

Mcu21总结了一下,在ucos II 里任务间通信可以采用以下几种方式。

z共享全局变量,这是最快捷有效的方式,实现这种通信可以采用以下两种方式:一是利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中断,二是利用函数OSSchedLock()和OSSchedUnlock()对μC/OS‐II中的任务调度函数上锁和开锁.z使用信号量z使用邮箱z使用消息队列下面介绍下共享全局变量的实现过程。

(1)宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()是在移植ucos II过程中由用户定义的。

在os_cpu.h这个文件中。

代码如下,这部分代码的作用是关,开中断,具体和CPU有关。

当我们调用OS_ENTER_CRITICAL()时,系统中断被关闭,我们知道,任务切换时基于定时器中断的,当系统中断别关闭时,其它中断,包括定时器中断也就被关闭,任务切换也不可能发生,所以确保在访问变量的时候,不会有其它的任务或中断也在同时访问这个变量。

这两个宏非常好用,在mcu21的项目里经常用到。

尤其在中断处理函数里面。

因为现在的很多CPU是支持中断嵌套的,为了防止中断执行的时候不被其它的中断打断,就可以调用这两个宏。

(2)第二种方法是给任务调度函数上锁,开锁。

这种方法和使用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()最大的区别是:中断是可以执行的。

尽管不执行任务切换,变量依然有可以被中断函数访问。

给任务调度器上锁的函数如下void OSSchedLock (void){if (OSRunning == TRUE) {OS_ENTER_CRITICAL();OSLockNesting++;OS_EXIT_CRITICAL();}}给任务调度器解锁的函数如下void OSSchedUnlock (void){if (OSRunning == TRUE) {OS_ENTER_CRITICAL();if (OSLockNesting > 0) {OSLockNesting‐‐;if ((OSLockNesting | OSIntNesting) == 0) { (1)OS_EXIT_CRITICAL();OSSched(); (2)} else {OS_EXIT_CRITICAL();}} else {OS_EXIT_CRITICAL();}}}它实现的原理大致是这样的。

实验五 任务的同步与通信

实验五 任务的同步与通信

实验五任务的挂起与删除一:实验目的:1.掌握uCOS-II中任务的挂起.2.掌握uCOS-II中任务的删除.二:实验内容:完成教材3-9的实验内容。

当任务MyTask运行10次时用函数OSSchedLock()对调度器进行加锁,而当任务MyTask运行到第80次时调用函数OSSchedUnlock()对调度器进行解锁。

三:程序代码:#include "includes.h”#define TASK_STK_SIZE 512OS_STK MyTaskStk[TASK_STK_SIZE];OS_STK YouTaskStk[TASK_STK_SIZE];INT16S key;INT8U x=0,y=0;INT8U times=0;voidMyTask(void *pdata);voidYouTask(void *pdata);void main (void){char *s_M="M";OSInit();PC_DOSSaveReturn();PC_VectSet(uCOS, OSCtxSw);OSTaskCreate(MyTask,s_M,&MyTaskStk[TASK_STK_SIZE - 1], 0);OSStart();}void MyTask (void *pdata){char *s_Y="Y";char *s="MyTask:I ask YouTaskdelete itself! ";#if OS_CRITICAL_METHOD == 3OS_CPU_SR cpu_sr;#endifpdata = pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08, OSTickISR);PC_SetTickRate(OS_TICKS_PER_SEC);OS_EXIT_CRITICAL();OSStatInit();OSTaskCreate(YouTask,s_Y,&YouTaskStk[TASK_STK_SIZE-1],2);for (;;){if(x>30){while(OSTaskDelReq(2)!=OS_TASK_NOT_EXIST){PC_DispStr(10,8,s,DISP_FGND_BLACK+DISP_FGND_WHITE);OSTimeDly(1);}}if(x>50){x=0;y+=2;}PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);x+=1;if (PC_GetKey(&key) == TRUE) {if (key == 0x1B) {PC_DOSReturn();}}OSTimeDlyHMSM(0, 0, 3, 0);}}voidYouTask(void *pdata){char *s1="YouTask:I must delete myself!";char *s2="YouTask:I have deleted myself!";#if OS_CRITICAL_METHOD==3OS_CPU_SR cpu_sr;#endifpdata=pdata;for(;;){if(OSTaskDelReq(OS_PRIO_SELF)==OS_TASK_DEL_REQ){PC_DispStr(10,10,s1,DISP_FGND_WHITE+DISP_BGND_BLACK); OSTimeDlyHMSM(0,0,15,0);PC_DispStr(10,12,s2,DISP_FGND_WHITE+DISP_BGND_BLACK); OSTaskDel(OS_PRIO_SELF);}if(x>50){x=0;y+=2;}PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);x+=1;OSTimeDlyHMSM(0,0,1,0);}}四:实验结果:。

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

6

基础知识
uC/OS-II任务之间的通讯与同步方式
在µC/OS-II中,有多种方法可以保护任务之间的共享数
据和提供任务之间的通讯。
利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开 中断。当两个任务或者一个任务和一个中断服务子程序共享某些数据
10五基础知识uC/OS-II中使用邮箱进行任务之间通讯
下面的代码每100个时钟节拍从TaskSEG中发送一个字符串, 在TaskLED中接收并打印出来。
11

基础知识
uC/OS-II中使用消息队列实现任务之间的通讯
消息队列是uC/OS-II中另一种通讯机制,它可以使一个任 务或者中断服务子程序向另一个任务发送以指针方式定义 的变量。因具体的应用有所不同,每个指针指向的数据结 构变量也有所不同。 uC/OS-II提供了7个对消息队列进行操作的函数:创建消 息队列函数OSQCreate(),等待消息队列函数OSQPend(), 先进先出(FIFO)发送消息函数OSQPost(),后进先出(LIFO) 发送消息函数OSQPostFront(),无等待获取消息函数 OSQAccept(),清空消息队列函数OSQFlush()和查询消息 队列函数OSQQuery()。
时,可以采用这种方法
利用函数OSSchedLock()和OSSchekUnlock()对µC/OS-II中的任务调度 函数上锁和开锁
信号量
邮箱 队列
7

基础知识
uC/OS-II中使用信号量
通过调用OSSemCreate()建立信号量,并对信号量的初始 计数值赋值。该初始值为0到65,535之间的一个数。如果 信号量是用来表示一个或者多个事件的发生,那么该信号 量的初始值应设为0。如果信号量是用于对共享资源的访 问,那么该信号量的初始值应设为1(例如,把它当作二 值信号量使用)。 通过调用OSSemPost()函数发送一个信号量,通过调用 OSSemPend()函数等待一个信号量。如果信号量当前是可 用的(信号量的计数值大于0),将信号量的计数值减1, 然后函数将“无错”错误代码返回给它的调用函数。如果 信号量的计数值为0,而OSSemPend()函数又不是由中断服 务子程序调用的,则调用OSSemPend()函数的任务要进入 睡眠状态,等待另一个任务(或者中断服务子程序)发出 该信号量。 8
JX44B0实验系统教案 uC/OS-II任务间通讯和同步实验
武汉创维特信息技术有限公司
2018/9/15
提纲
1
实验目的
2
实验内容
3 4
预备知识
实验设备
5
6
基础知识
实验过程
2
7
实验报告要求

实验目的
实验目的
掌握uC/OS-II操作系统下使用信号量解决任务之间的同步 问题 掌握uC/OS-II操作系统下任务间通讯的方法

基础知识
uC/OS-II中使用信号量进行任务之间同步
右边的代码使用两个信 号量实现了两个任务之 间的同步。信号量创建 的代码如下,信号量 Sem2初始为可用状态, 而信号量Sem1初始为不 可用状态。 Sem1 = OSSemCreate(0); Sem2 = OSSemCreate(1); 任务TaskLED必须等待 Sem2可用才能够继续往 下运行,而Sem2在 TaskSEG中发送。同样 TaskSEG必须等待Sem1可 用才能够继续往下运行, 而Sem1在TaskLED中发送, 这样就实现了程序中 “…”之间代码的顺序执 行,而不受OSTimeDly的 延时值的影响。 9

基础知识
uC/OS-II中使用邮箱
邮箱可使一个任务或者中断服务子程序向另一个任务发送 一个指针型的变量。该指针指向一个包含了特定“消息” 的数据结构。通过调用OSMboxCreate()函数来创建邮箱, 并指定指针的初始值。如果使用邮箱的目的是用来通知一 个事件的发生(发送一条消息),那么就要初始化该邮箱 为NULL,因为在开始时,事件还没有发生。如果用户用邮 箱来共享某些资源,那么就要初始化该邮箱为一个非NULL 的指针。在这种情况下,邮箱被当成一个二值信号量使用。 使用邮箱同样可以实现任务间的同步。 通过OSMboxPost()函数发送一个消息到邮箱中,通过 OSMboxPend()函数等待一个邮箱中的消息,如果邮箱中没 有可用的消息,OSMboxPend()的调用任务就被挂起,直到 邮箱中有了消息或者等待超时。
12

实验过程
实验过程
13

实验报告要求
实验报告要求
简述邮箱和信号量的作用?
简述邮箱和信号量的在ucOS中的是如何实现的?
14
3

实验内容
实验内容
使用信号量实现任务间同步 使用邮箱实现任务之间的通讯
4

预备知识
预备知识
了解操作系统任务调度的机制 了解操作系统任务间通讯的机制 学习uC/OS-II操作系统下多任务应用程序的编写方法
5

实验设备
实验设备
JX44B0教学实验箱 ADT1000仿真器和ADT IDE集成开发环境 串口连接线
相关文档
最新文档