脚本宝典收集整理的这篇文章主要介绍了ucos(9)互斥锁和死锁,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
void OSMutexCreate (OS_MUTEX *p_mutex,
CPU_CHAR *p_name,
OS_ERR *p_err)
void OSMutexPost (OS_MUTEX *p_mutex, OS_OPT opt, OS_ERR *p_err)
void T1(void *parg)
{
while(1)
{
(1)等待事件发生
(2)请求互斥锁M1
(3)访问共享资源R1
:
:
(4)------- 中断!
:
:
(8)请求互斥锁M2
(9)访问共享资源R2
}
}
void T2(void *parg)
{
while(1)
{
等待事件发生
(5)请求互斥锁M2
(6)访问共享资源R2
:
:
(7)请求互斥锁M1
访问共享资源R1
}
}
void T1(void *parg)
{
while(1)
{
等待事件发生
请求互斥锁M1
请求互斥锁M2
访问共享资源R1
访问共享资源R2
释放互斥锁M1
释放互斥锁M2
}
}
void T2(void *parg)
{
while(1)
{
等待事件发生
请求互斥锁M1
请求互斥锁M2
访问共享资源R1
访问共享资源R2
释放互斥锁M1
释放互斥锁M2
}
}
void T1(void *parg)
{
while(1)
{
等待事件发生
请求互斥锁M1
访问共享资源R1
释放互斥锁M1
请求互斥锁M2
访问共享资源R2
释放互斥锁M2
}
}
void T2(void *parg)
{
while(1)
{
等待事件发生
请求互斥锁M1
访问共享资源R1
释放互斥锁M1
请求互斥锁M2
访问共享资源R2
释放互斥锁M2
}
}
#include "Sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "includes.h"
//任务1控制块
OS_TCB Task1_TCB;
void task1(void *parg);
CPU_STK task1_stk[128]; //任务1的任务堆栈,大小为128字,也就是512字节
//任务2控制块
OS_TCB Task2_TCB;
void task2(void *parg);
CPU_STK task2_stk[128]; //任务2的任务堆栈,大小为128字,也就是512字节
OS_MUTEX g_mutex_1; //互斥锁1
OS_MUTEX g_mutex_2; //互斥锁1
void res1(void)
{
volatile uint32_t i=0x50;
while(i--)
{
delay_ms(10);
}
}
void res2(void)
{
volatile uint32_t i=0x50;
while(i--)
{
delay_ms(10);
}
}
//主函数
int main(void)
{
OS_ERR err;
systick_inIT(); //时钟初始化
NVIC_PRiorityGroupconfig(NVIC_PriorityGroup_2); //中断分组配置
usart_init(9600); //串口初始化
LED_Init(); //LED初始化
//OS初始化,它是第一个运行的函数,初始化各种的全局变量,例如中断嵌套计数器、优先级、存储器
OSInit(&err);
//创建任务1
OSTaskCreate( (OS_TCB *)&Task1_TCB, //任务控制块,等同于线程id
(CPU_CHAR *)"Task1", //任务的名字,名字可以自定义的
(OS_TASK_PTR)task1, //任务函数,等同于线程函数
(void *)0, //传递参数,等同于线程的传递参数
(OS_PRIO)6, //任务的优先级6
(CPU_STK *)task1_stk, //任务堆栈基地址
(CPU_STK_SIZE)128/10, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE)128, //任务堆栈大小
(OS_MSG_QTY)0, //禁止任务消息队列
(OS_TICK)0, //默认时间片长度
(void *)0, //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
);
if(err!=OS_ERR_NONE)
{
printf("task 1 create failrn");
while(1);
}
//创建任务2
OSTaskCreate( (OS_TCB *)&Task2_TCB, //任务控制块
(CPU_CHAR *)"Task2", //任务的名字
(OS_TASK_PTR)task2, //任务函数
(void *)0, //传递参数
(OS_PRIO)6, //任务的优先级6
(CPU_STK *)task2_stk, //任务堆栈基地址
(CPU_STK_SIZE)128/10, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE)128, //任务堆栈大小
(OS_MSG_QTY)0, //禁止任务消息队列
(OS_TICK)0, //默认时间片长度
(void *)0, //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
);
if(err!=OS_ERR_NONE)
{
printf("task 2 create failrn");
while(1);
}
//创建互斥锁1
OSMutexCreate(&g_mutex_1,"g_mutex_1",&err);
OSMutexCreate(&g_mutex_2,"g_mutex_2",&err);
//启动OS,进行任务调度
OSStart(&err);
printf(".......rn");
while(1);
}
void task1(void *parg)
{
OS_ERR err;
printf("task1 is create okrn");
while(1)
{
OSMutexPend(&g_mutex_1,0,OS_OPT_PEND_BLOCKING,NULL,&err);
printf("[task1]access res1 beginrn");
res1();
printf("[task1]access res1 endrn");
OSMutexPend(&g_mutex_2,0,OS_OPT_PEND_BLOCKING,NULL,&err);
printf("[task1]access res2 beginrn");
res2();
printf("[task1]access res2 endrn");
OSMutexPost(&g_mutex_1,OS_OPT_POST_NONE,&err);
OSMutexPost(&g_mutex_2,OS_OPT_POST_NONE,&err);
}
}
void task2(void *parg)
{
OS_ERR err;
printf("task2 is create okrn");
while(1)
{
OSMutexPend(&g_mutex_2,0,OS_OPT_PEND_BLOCKING,NULL,&err);
printf("[task2]access res2 beginrn");
res2();
printf("[task2]access res2 endrn");
OSMutexPend(&g_mutex_1,0,OS_OPT_PEND_BLOCKING,NULL,&err);
printf("[task2]access res1 beginrn");
res1();
printf("[task2]access res1 endrn");
OSMutexPost(&g_mutex_1,OS_OPT_POST_NONE,&err);
OSMutexPost(&g_mutex_2,OS_OPT_POST_NONE,&err);
}
}
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "includes.h"
//任务1控制块
OS_TCB Task1_TCB;
void task1(void *parg);
CPU_STK task1_stk[128]; //任务1的任务堆栈,大小为128字,也就是512字节
//任务2控制块
OS_TCB Task2_TCB;
void task2(void *parg);
CPU_STK task2_stk[128]; //任务2的任务堆栈,大小为128字,也就是512字节
OS_MUTEX g_mutex_1; //互斥锁1
OS_MUTEX g_mutex_2; //互斥锁1
void res1(void)
{
volatile uint32_t i=0x50;
while(i--)
{
delay_ms(10);
}
}
void res2(void)
{
volatile uint32_t i=0x50;
while(i--)
{
delay_ms(10);
}
}
//主函数
int main(void)
{
OS_ERR err;
systick_init(); //时钟初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
usart_init(9600); //串口初始化
LED_Init(); //LED初始化
//OS初始化,它是第一个运行的函数,初始化各种的全局变量,例如中断嵌套计数器、优先级、存储器
OSInit(&err);
//创建任务1
OSTaskCreate( (OS_TCB *)&Task1_TCB, //任务控制块,等同于线程id
(CPU_CHAR *)"Task1", //任务的名字,名字可以自定义的
(OS_TASK_PTR)task1, //任务函数,等同于线程函数
(void *)0, //传递参数,等同于线程的传递参数
(OS_PRIO)6, //任务的优先级6
(CPU_STK *)task1_stk, //任务堆栈基地址
(CPU_STK_SIZE)128/10, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE)128, //任务堆栈大小
(OS_MSG_QTY)0, //禁止任务消息队列
(OS_TICK)0, //默认时间片长度
(void *)0, //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
);
if(err!=OS_ERR_NONE)
{
printf("task 1 create failrn");
while(1);
}
//创建任务2
OSTaskCreate( (OS_TCB *)&Task2_TCB, //任务控制块
(CPU_CHAR *)"Task2", //任务的名字
(OS_TASK_PTR)task2, //任务函数
(void *)0, //传递参数
(OS_PRIO)6, //任务的优先级6
(CPU_STK *)task2_stk, //任务堆栈基地址
(CPU_STK_SIZE)128/10, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE)128, //任务堆栈大小
(OS_MSG_QTY)0, //禁止任务消息队列
(OS_TICK)0, //默认时间片长度
(void *)0, //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
);
if(err!=OS_ERR_NONE)
{
printf("task 2 create failrn");
while(1);
}
//创建互斥锁1
OSMutexCreate(&g_mutex_1,"g_mutex_1",&err);
OSMutexCreate(&g_mutex_2,"g_mutex_2",&err);
//启动OS,进行任务调度
OSStart(&err);
printf(".......rn");
while(1);
}
void task1(void *parg)
{
OS_ERR err;
printf("task1 is create okrn");
while(1)
{
OSMutexPend(&g_mutex_1,0,OS_OPT_PEND_BLOCKING,NULL,&err);
OSMutexPend(&g_mutex_2,0,OS_OPT_PEND_BLOCKING,NULL,&err);
printf("[task1]access res1 beginrn");
res1();
printf("[task1]access res1 endrn");
printf("[task1]access res2 beginrn");
res2();
printf("[task1]access res2 endrn");
OSMutexPost(&g_mutex_1,OS_OPT_POST_NONE,&err);
OSMutexPost(&g_mutex_2,OS_OPT_POST_NONE,&err);
}
}
void task2(void *parg)
{
OS_ERR err;
printf("task2 is create okrn");
while(1)
{
OSMutexPend(&g_mutex_1,0,OS_OPT_PEND_BLOCKING,NULL,&err);
OSMutexPend(&g_mutex_2,0,OS_OPT_PEND_BLOCKING,NULL,&err);
printf("[task2]access res2 beginrn");
res2();
printf("[task2]access res2 endrn");
printf("[task2]access res1 beginrn");
res1();
printf("[task2]access res1 endrn");
OSMutexPost(&g_mutex_1,OS_OPT_POST_NONE,&err);
OSMutexPost(&g_mutex_2,OS_OPT_POST_NONE,&err);
}
}
执行结果:
task1执行完毕,task2执行,如此循环..。
以上是脚本宝典为你收集整理的ucos(9)互斥锁和死锁全部内容,希望文章能够帮你解决ucos(9)互斥锁和死锁所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。