野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5606|回复: 6

[ucos] 请教大家:火哥UCOSIII 互斥信号演示例程修改后的疑问?

[复制链接]
发表于 2018-6-5 20:30:33 | 显示全部楼层 |阅读模式
本帖最后由 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在闪,没有堵塞,为什么写任务没有堵塞呢,互斥信号量都没有发送呢?




回复

使用道具 举报

发表于 2018-6-6 09:01:18 | 显示全部楼层
帮顶,还没学到
回复 支持 反对

使用道具 举报

发表于 2018-6-6 09:07:03 | 显示全部楼层
调试看看它是不是每次write函数里的pend都能执行完而不阻塞
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-6 10:36:38 | 显示全部楼层
并且还有另一个现象:这样改了后,write和Read任务哪个任务先创建就只运行哪个任务,另一个后创建的则不会运行
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-7 16:54:54 | 显示全部楼层
RAYINGPX 发表于 2018-6-6 10:36
并且还有另一个现象:这样改了后,write和Read任务哪个任务先创建就只运行哪个任务,另一个后创建的则不会 ...

优先级相同的情况下,创建任务时,在任务就绪表中,是按创建的先后顺序排列的,先创建的排在表前面,后创建的在后面。所以运行任务时,是从前到后顺序切换任务的。不知是否如此理解?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-7 17:02:25 | 显示全部楼层
在创建互斥信号量后,“写任务”是第一个申请此互斥信号的(没有别的任务占用),所以肯定会申请成功,如此 AppTaskWrite ( void * p_arg )不会堵塞,能正常运行,LED1正常闪烁。但是此任务一直占有此互斥信号量,不释放,导致“读任务”申请不成功,堵塞,所以LED2也就不能闪烁了。是否如此?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-7 17:04:25 | 显示全部楼层
有疑问还是得自己多看几遍书!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-2 10:04 , Processed in 0.038123 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表