你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

FREERTOS下的按键处理方式讨论  

[复制链接]
netlhx 提问时间:2015-5-3 21:45 /
本帖最后由 netlhx 于 2015-5-3 21:51 编辑

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

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

  1. osSemaphoreId key0PressedBinSemHandle;


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

  6. /* StartCheckKeyPressedTask function */
  7. void StartCheckKeyPressedTask(void const * argument)
  8. {
  9.   /* USER CODE BEGIN StartCheckKeyPressedTask */
  10.         //static uint8_t key0Pressed = 0;
  11.         static uint16_t count = 0;
  12.        
  13.   /* Infinite loop */
  14.   for(;;)
  15.   {
  16.                 if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET)
  17.                 {
  18.                         //key0Pressed = 1;
  19.                         count ++;
  20.                        
  21.                 }
  22.                 else
  23.                 {
  24.                         //key0Pressed = 0;
  25.                         count = 0;
  26.                 }
  27.                 if(count > 40)
  28.                 {
  29.                         count = 0;
  30.                         osSemaphoreRelease(key0PressedBinSemHandle);
  31.                 }
  32.     osDelay(50);
  33.   }
  34.   /* USER CODE END StartCheckKeyPressedTask */
  35. }

  36. /* StartKey0PressedTask function */
  37. void StartKey0PressedTask(void const * argument)
  38. {
  39.   /* USER CODE BEGIN StartKey0PressedTask */
  40.         osSemaphoreWait(key0PressedBinSemHandle, 0);
  41.   /* Infinite loop */
  42.   for(;;)
  43.   {
  44.                 osSemaphoreWait(key0PressedBinSemHandle, osWaitForever);
  45.                 HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
  46.     osDelay(1);
  47.   }
  48.   /* USER CODE END StartKey0PressedTask */
  49. }
复制代码



注意调整count值的比较量,就可以实现不同按键时长的选择,代码中实现的是2秒的延时。
收藏 3 评论24 发布时间:2015-5-3 21:45

举报

24个回答
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
用队列是杀鸡用牛刀呀
123下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版