netlhx 发表于 2015-5-3 21:45:37

FREERTOS下的按键处理方式讨论

本帖最后由 netlhx 于 2015-5-3 21:51 编辑

最近学习FREERTOS,研究了一下按键处理的方式,提出来供讨论。
该方法有如下特色:
1. 基于信号量方式,比查询方式效率更高
2. 可灵活调整按键时长,可实现常规按键、任意时长按键
3. 结合信号量还可实现组合按键。

下面是代码部分,比较简单,就不解释了

osSemaphoreId key0PressedBinSemHandle;


/* Create the semaphores(s) */
/* definition and creation of key0PressedBinSem */
osSemaphoreDef(key0PressedBinSem);
key0PressedBinSemHandle = osSemaphoreCreate(osSemaphore(key0PressedBinSem), 1);

/* StartCheckKeyPressedTask function */
void StartCheckKeyPressedTask(void const * argument)
{
/* USER CODE BEGIN StartCheckKeyPressedTask */
        //static uint8_t key0Pressed = 0;
        static uint16_t count = 0;
       
/* Infinite loop */
for(;;)
{
                if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET)
                {
                        //key0Pressed = 1;
                        count ++;
                       
                }
                else
                {
                        //key0Pressed = 0;
                        count = 0;
                }
                if(count > 40)
                {
                        count = 0;
                        osSemaphoreRelease(key0PressedBinSemHandle);
                }
    osDelay(50);
}
/* USER CODE END StartCheckKeyPressedTask */
}

/* StartKey0PressedTask function */
void StartKey0PressedTask(void const * argument)
{
/* USER CODE BEGIN StartKey0PressedTask */
        osSemaphoreWait(key0PressedBinSemHandle, 0);
/* Infinite loop */
for(;;)
{
                osSemaphoreWait(key0PressedBinSemHandle, osWaitForever);
                HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
    osDelay(1);
}
/* USER CODE END StartKey0PressedTask */
}


注意调整count值的比较量,就可以实现不同按键时长的选择,代码中实现的是2秒的延时。

suyong_yq 发表于 2017-3-5 00:47:20

无帝老三 发表于 2017-2-22 13:56
您好,是不是状态机加定时器?
可不可以用任务延时代替定时器?

是状态机+定时器的做法。
不建议用任务延时代替定时器,因为任务延时会额外占用一个任务描述符。但是在操作系统环境下,用一个专门的任务监控状态机并且分发按键消息是非常有必要的。

tg1991 发表于 2015-5-4 08:22:33

过来抢沙发

anny 发表于 2015-5-4 08:29:36

不错,先记号一下

qiu-368230 发表于 2015-5-4 08:53:52

标记下,正要学习这方面的

shaoziyang 发表于 2015-5-4 10:11:38

顶一下。

stary666 发表于 2015-5-4 11:35:45

还没开始学习,希望楼主多共享经验

moyanming2013 发表于 2015-5-4 14:16:58

如何解决快速按键的缓冲问题呢?
用队列是否更好呢?

netlhx 发表于 2015-5-5 07:55:55

moyanming2013 发表于 2015-5-4 14:16
如何解决快速按键的缓冲问题呢?
用队列是否更好呢?

快速按键用队列应该会好一些

数码小叶 发表于 2015-5-5 14:53:34

帮顶一下。。。。。。。。

Tension 发表于 2015-5-6 17:15:35

用队列是杀鸡用牛刀呀
页: [1] 2 3
查看完整版本: FREERTOS下的按键处理方式讨论