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

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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版