|
今天学习互斥信号量,按下按键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);
}
} |
|