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秒的延时。 无帝老三 发表于 2017-2-22 13:56
您好,是不是状态机加定时器?
可不可以用任务延时代替定时器?
是状态机+定时器的做法。
不建议用任务延时代替定时器,因为任务延时会额外占用一个任务描述符。但是在操作系统环境下,用一个专门的任务监控状态机并且分发按键消息是非常有必要的。 过来抢沙发 不错,先记号一下 标记下,正要学习这方面的 顶一下。 还没开始学习,希望楼主多共享经验 如何解决快速按键的缓冲问题呢?
用队列是否更好呢? moyanming2013 发表于 2015-5-4 14:16
如何解决快速按键的缓冲问题呢?
用队列是否更好呢?
快速按键用队列应该会好一些 帮顶一下。。。。。。。。 用队列是杀鸡用牛刀呀