硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3536|回复: 3
收起左侧

[μCOS-III] 请教互斥信号量的使用

[复制链接]

91

主题

289

回帖

562

积分

金牌会员

积分
562
发表于 2015-11-30 16:30:06 | 显示全部楼层 |阅读模式
今天学习互斥信号量,按下按键K2,发出互斥信号量,当检测到信号量时,LED灯状态取反。
如果不是互斥信号量(下面程序中屏蔽的函数),就可以,如果是互斥信号量,LED灯一直取反,不受互斥信号量控制,这是为什么呢?
static  OS_MUTEX  SEM_MUTEX;       /* 互斥信号量 */

static void AppSemCreate(void)
{
    OS_ERR err;
   
    OSMutexCreate ((OS_MUTEX *)&SEM_MUTEX,
                   (CPU_CHAR *)"SEM MUTEX",
                   (OS_ERR     *)&err);
//    OSSemCreate((OS_SEM    *)&SEM_SYNCH,
//                (CPU_CHAR  *)"SEM_SYNCH",
//                (OS_SEM_CTR )0,
//                (OS_ERR    *)&err);
}

static void AppTaskLED3(void *p_arg)
{
    OS_ERR      err;

    (void)p_arg;                  /* 避免编译器报警 */
  
    while (1)
    {           
        OSMutexPend((OS_MUTEX *)&SEM_MUTEX,                /* 获得信号量(按下K2键发出) */
                    (OS_TICK    )0,
                    (OS_OPT     )OS_OPT_PEND_BLOCKING,
                    (CPU_TS    *)0,
                    (OS_ERR    *)&err);
//        OSSemPend((OS_SEM *)&SEM_SYNCH,
//                   (OS_TICK )0,
//                   (OS_OPT  )OS_OPT_PEND_BLOCKING,
//                   (CPU_TS *)0,
//                   (OS_ERR *)&err);
        
        bsp_LedToggle(3);
        OSTimeDly(1000, OS_OPT_TIME_DLY, &err);
    }
}


static void AppTaskKEY(void *p_arg)
{
    OS_ERR      err;
    uint8_t  ucKeyCode;
   
    (void)p_arg;                  /* 避免编译器报警 */
  
    while (1)
    {
        ucKeyCode = bsp_GetKey();
        if (ucKeyCode != KEY_NONE)
        {
            switch (ucKeyCode)
            {
                case KEY_DOWN_K1:             /* K1(Temper)键按下 挂起任务AppTaskLED3 */
                    OSTaskSuspend(&AppTaskLED3TCB, &err);
                    break;
                case KEY_DOWN_K2:            /* K2(WKUP)键按下,发出一个信号量 */
                    OSMutexPost((OS_MUTEX *)&SEM_MUTEX,
                                (OS_OPT       )OS_OPT_POST_NONE,
                                (OS_ERR      *)&err);
//                    OSSemPost((OS_SEM *)&SEM_SYNCH,
//                              (OS_OPT  )OS_OPT_POST_1,
//                              (OS_ERR *)&err);   
               
                case KEY_DOWN_K3:             /* K3(user)键按下 恢复任务AppTaskLED3 */
                    OSTaskResume(&AppTaskLED3TCB, &err);
                    break;
                default:
                    break;
            }
        }
        OSTimeDly(20, OS_OPT_TIME_DLY, &err);
    }
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2015-12-1 00:56:29 | 显示全部楼层
注意,互斥信号量不是这么用的,互斥信号量要成对出现,而且这一对互斥信号量要在一个任务里面。
回复

使用道具 举报

91

主题

289

回帖

562

积分

金牌会员

积分
562
 楼主| 发表于 2015-12-1 08:28:17 | 显示全部楼层
成对出现是指发送信号量和获取信号量要在一个任务里同时都有吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2015-12-1 09:16:04 | 显示全部楼层

回 feiante 的帖子

feiante:成对出现是指发送信号量和获取信号量要在一个任务里同时都有吗 (2015-12-01 08:28) 
互斥信号量必须这么用,要不就出问题了。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 06:06 , Processed in 0.184355 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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