研究生
最后登录1970-1-1
在线时间 小时
注册时间2015-6-23
|
本帖最后由 RAYINGPX 于 2018-6-5 20:32 编辑
在《μC/OS-III应用开发指南》基于STM32F103 系列的互斥信事情量的实例演示中,如果把两个任务的释放互斥信号量部分都取消即如下:写任务如下:取消了互斥信号量的发布
static void AppTaskWrite ( void * p_arg )
{
OS_ERR err;
(void)p_arg;
while (DEF_TRUE) { //任务体
OSMutexPend ((OS_MUTEX *)&mutex, //申请互斥信号量 mutex
(OS_TICK )0, //无期限等待
(OS_OPT )OS_OPT_PEND_BLOCKING, //如果不能申请到信号量就堵塞任务
(CPU_TS *)0, //不想获得时间戳
(OS_ERR *)&err); //返回错误类型
ucValue [ 0 ] ++;
OSTimeDly ( 200, OS_OPT_TIME_DLY, & err ); //延时100个时钟节拍(100ms)
macLED1_TOGGLE(); //LED1指示用
ucValue [ 1 ] ++;
// OSMutexPost ((OS_MUTEX *)&mutex, //释放互斥信号量 mutex
// (OS_OPT )OS_OPT_POST_NONE, //进行任务调度
// (OS_ERR *)&err); //返回错误类型
//
}
}
读的任务如下:取消了互斥信号量的发布
static void AppTaskRead ( void * p_arg )
{
OS_ERR err;
CPU_SR_ALLOC(); //使用到临界段(在关/开中断时)时必需该宏,该宏声明和
//定义一个局部变量,用于保存关中断前的 CPU 状态寄存器
// SR(临界段关中断只需保存SR),开中断时将该值还原。
(void)p_arg;
while (DEF_TRUE) { //任务体
OSMutexPend ((OS_MUTEX *)&mutex, //申请互斥信号量 mutex
(OS_TICK )0, //无期限等待
(OS_OPT )OS_OPT_PEND_BLOCKING, //如果申请不到就堵塞任务
(CPU_TS *)0, //不想获得时间戳
(OS_ERR *)&err); //返回错误类型
macLED2_TOGGLE(); //LED2指示用
if ( ucValue [ 0 ] == ucValue [ 1 ] )
{
OS_CRITICAL_ENTER(); //进入临界段
printf ( "\r\nSUCCESSFUL\r\n" );
printf ( "\r\n%d\r\n",ucValue [ 0 ] );
printf ( "\r\n%d\r\n",ucValue [ 1 ] );
OS_CRITICAL_EXIT();
}
else
{
OS_CRITICAL_ENTER(); //进入临界段
printf ( "\r\nFAIL\r\n" );
OS_CRITICAL_EXIT();
}
// OSMutexPost ((OS_MUTEX *)&mutex, //释放互斥信号量 mutex
// (OS_OPT )OS_OPT_POST_NONE, //进行任务调度
// (OS_ERR *)&err); //返回错误类型
OSTimeDly ( 1000, OS_OPT_TIME_DLY, & err ); //延时1000个时钟节拍(1s)
}
}
发现读任务的LED2不会亮,说明任务堵塞,但是写任务的LED1在闪,没有堵塞,为什么写任务没有堵塞呢,互斥信号量都没有发送呢?
|
|