本帖最后由 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秒的延时。 |
是状态机+定时器的做法。
不建议用任务延时代替定时器,因为任务延时会额外占用一个任务描述符。但是在操作系统环境下,用一个专门的任务监控状态机并且分发按键消息是非常有必要的。
用队列是否更好呢?
快速按键用队列应该会好一些