uCOS-II(3)

2020-05-23 14:25

INT8U OSSemQuery (OS_EVENT *pevent,OS_SEM_DATA *pdata) pevent 创建队列时返回的指针

pdata 用于记录信号量信息的数据结构 返回值 有三个可能的返回值: 1.OS_NO_ERR 清空成功 2.OS_ERR_EVENT_TYPE 事件类型错误 3.OS_SEM_OVF 溢出 3、实验分析

实验创建两个任务,任务二每隔500ms发送发送两次信号量,并打印发送状态,任务一则一直等待接收信号,并接下来进行两次无等待接收信号,并打印两次接收的状态。其实验代码如下: int main (void)

{

INT8U err;

SysTick_Configuration(); //系统定时器初始化 USART_Configuration(); //串口初始化 LED_Configuration();

OSInit(); //usos ii初始化

DispSem= OSSemCreate(1); //建立显示设备的信号量 AppTaskCreate();//创建任务 OSStart(); //开始任务调度

}

static void AppTaskCreate(void) {

INT8U err;

OSTaskCreateExt(AppTask1,(void*)0,(OS_STK )&AppTask1Stk[APP_TASK1_STK_SIZE-1],APP_TASK1_PRIO,APP_TASK1_PRIO,(OS_STK)&AppTask1Stk[0],APP_TASK1_STK_SIZE,(void )0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); //创建任务1

OSTaskNameSet(APP_TASK1_PRIO, \&err);

OSTaskCreateExt(AppTask2,(void*)0,(OS_STK )&AppTask2Stk[APP_TASK2_STK_SIZE-1],APP_TASK2_PRIO,APP_TASK2_PRIO,(OS_STK )&AppTask2Stk[0],APP_TASK2_STK_SIZE,(void*)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); //创建任务2

OSTaskNameSet(APP_TASK2_PRIO, \&err); }

//任务1

static void AppTask1 (void *p_arg) {

INT8U err; while(1) {

OSSemPend(DispSem, 0, &err);

//P操作等待信号量置起才继续运行,最大为65535个时钟节拍,0为无限等待

printf(\成功\\r\\n\

err= OSSemAccept(DispSem); //P操作,立即返回,若成功err大于0 if (err> 0){

printf(\成功\\r\\n\ //P操作成功 }else {

printf(\失败\\r\\n\ //P操作失败 }

err= OSSemAccept(DispSem); //P操作,立即返回,若成功err大于0 if (err> 0){

printf(\成功\\r\\n\ //P操作成功

}else {

printf(\失败\\r\\n\ //P操作失败 } } }

//任务2

static void AppTask2 (void *p_arg) {

INT8U err; while(1) {

err= OSSemPost(DispSem); //V操作 err= OSSemPost(DispSem); //V操作 if (err == OS_NO_ERR){

printf(\信号量置起\\r\\n\//V操作成功 }else{

printf(\信号量溢出\\r\\n\//V操作失败

}

OSTimeDlyHMSM(0,0,0,500); } }

任务2每500ms发送两次V操作(发送信号),操作成功打印“信号量置起”,任务1循环查询一次等待获取信号量,后两次立即返回获取信号量,由于每次循环任务2进行两次V操作,而任务1进行一次等待获取信号量后,又立即获取两次(时间间隔很短),所以第一个立即获取成功,第二个立即获取失败。打印输出“OSSemPend成功”“OSSemAccept成功”和“OSSemAccept失败”,从串口打印如下:

实验五、互斥锁

本节我们主要介绍的是uC/OS-II的互斥锁 1、互斥锁

互斥锁即互斥型信号量,是一种特殊的信号量,他除了具有普通信号量的机制外,还有一些其他的特性。互斥信号量可以在应用程序中解决优先级反转问题。当高优先级的任务需要使用某个共享资源,而该资源已被一个低优先级的任务占用时,就会发生优先级反转。为了解决优先级反转,内核可以将低优先级任务的优先级提升到高于那个高优先级的任务,知道低优先级的任务使用完占用的共享资源。

如下图是任务与互斥锁之间的关系流程图,互斥锁智能提供任务使用。

2、互斥锁操作

μC/OS-II提供了一系列函数对互斥锁进行创建、上锁与解锁等。 1)创建互斥锁OSMutexCreate();

OS_EVENT *OSMutexCreate (INT8U prio, INT8U *perr) prio 优先级 perr 错误类型 返回值 NULL创建失败

否则返回事件控制块指针

2)上锁OSMutexPend( )等待和OSMutexAccept()立即返回

void OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr) BOOLEAN OSMutexAccept (OS_EVENT *pevent, INT8U *perr) pevent 创建互斥锁时返回的指针 timeout 阻塞超时时间。 err 错误类型 返回值 OS_TRUE上锁成功 OS_FALSE上锁失败 3)解锁OSMutexPost()

INT8U OSMutexPost (OS_EVENT *pevent)

pevent 创建队列时返回的指针 返回值 有六个可能的返回值:

1.OS_ERR_POST_ISR 不能从中断程序中发送 2.OS_ERR_PEVENT_NULL 不存在

3.OS_ERR_EVENT_TYPE 事件类型错误

4.OS_ERR_NOT_MUTEX_OWNER 不是本任务上锁

5.OS_ERR_PIP_LOWER 互斥锁的优先级低于当前任务的优先级 6.OS_ERR_NONE 解锁成功 4)获取互斥锁当前状态OSMutexQuery()

INT8U OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *p_mutex_data) pevent 创建队列时返回的指针 pdata 用于记录互斥锁的数据结构 返回值 有五个可能的返回值:

1.OS_ERR_QUERY_ISR 不能从中断程序中发送 2.OS_ERR_PEVENT_NULL 不存在

3.OS_ERR_PDATA_NULL 记录数据结构不存在 4.OS_ERR_EVENT_TYPE 事件类型错误 5.OS_ERR_NONE 获取成功 3、实验分析

实验创建两个任务,两个任务依次进行上锁,上锁后打印出字符串,然后解锁。其实验代码如下:

OS_EVENT *ResourceMutex; int main (void) {

INT8U err;

SysTick_Configuration(); //系统定时器初始化 USART_Configuration(); //串口初始化

LED_Configuration();

OSInit(); //usos ii初始化

ResourceMutex=OSMutexCreate(9, &err); //创建互斥锁优先级为9 AppTaskCreate();//创建任务 OSStart(); //开始任务调度 }

static void AppTaskCreate(void) {

INT8U err;

OSTaskCreateExt(AppTask1,(void*)0,(OS_STK )&AppTask1Stk[APP_TASK1_STK_SIZE-1],APP_TASK1_PRIO,APP_TASK1_PRIO,(OS_STK)&AppTask1Stk[0],APP_TASK1_STK_SIZE,(void )0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); //创建任务1

OSTaskNameSet(APP_TASK1_PRIO, \&err);

OSTaskCreateExt(AppTask2,(void*)0,(OS_STK )&AppTask2Stk[APP_TASK2_STK_SIZE-1],APP_TASK2_PRIO,APP_TASK2_PRIO,(OS_STK )&AppTask2Stk[0],APP_TASK2_STK_SIZE,(void*)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); //创建任务2

OSTaskNameSet(APP_TASK2_PRIO, \&err); }

//任务1

static void AppTask1 (void *p_arg) {

INT8U err; while(1) {

OSMutexPend(ResourceMutex, 0, &err); //获取资源,无限等待 LED1(1);

printf(\任务1获取资源\\r\\n\

OSTimeDlyHMSM(0,0,1,0);

printf(\任务1释放资源\\r\\n\ OSMutexPost(ResourceMutex);

//释放资源时进行任务调度 所以把输出写前面 LED1(0); } }

//任务2

static void AppTask2 (void *p_arg) {

INT8U err; while(1) {

OSMutexPend(ResourceMutex, 0, &err); // 获取资源,无限等待 printf(\任务2获取资源 \\r\\n\ LED2(1);

OSTimeDlyHMSM(0,0,0,500); printf(\任务2释放资源\\r\\n\

//释放资源时进行任务调度 所以把输出写前面 OSMutexPost(ResourceMutex); LED2(0);


uCOS-II(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:当代中国政府与政治

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: