OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3822|回复: 10

FREERTOS下的键盘输入相关问题!

[复制链接]

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2022-5-7
在线时间
20 小时
发表于 2022-11-20 16:45:58 | 显示全部楼层 |阅读模式
1金钱
不懂就问,当在freertos,我们进到某一个任务,需要获取键盘的值,除了while()一直等(得到要的值就break出来)还有其他方法吗?如果使用while等是要不要加延时好?
请懂得大侠指导一下!
两问。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2022-11-22 00:11:23 | 显示全部楼层
直接搞个任务,死循环扫描即可,任务优先级可以调低点
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-11-22 09:07:30 | 显示全部楼层
正点原子 发表于 2022-11-22 00:11
直接搞个任务,死循环扫描即可,任务优先级可以调低点



   1、直接搞个任务,死循环扫描即可
   2、任务优先级可以调低点
   3、采集到按键,用消息队列发送给主任务
            消息队列用自定义协议
                 例如:消息队列缓冲区buffer[]
                              buffer[0]=1  代表 按键任务发送的消息队列
                              buffer[1]=  按键码
                     
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2022-5-7
在线时间
20 小时
 楼主| 发表于 2022-11-22 12:33:53 | 显示全部楼层
本帖最后由 sinus 于 2022-11-22 12:38 编辑
正点原子 发表于 2022-11-22 00:11
直接搞个任务,死循环扫描即可,任务优先级可以调低点

感谢回复蛤,但是我这边需要按键处理的任务有多个,且进任务后有类似状态机的需要按钮,处理方式是:每个需要需要键值的时候就等队列的消息吗?如果不是或者有更好的方式,请指导一下。
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2022-5-7
在线时间
20 小时
 楼主| 发表于 2022-11-22 12:38:15 | 显示全部楼层
霸王猫 发表于 2022-11-22 09:07
1、直接搞个任务,死循环扫描即可
   2、任务优先级可以调低点
   3、采集到按键,用消息队列发 ...

感谢回复蛤,但是我这边需要按键处理的任务有多个,且进任务后有类似状态机的需要按钮,处理方式是:每个需要需要键值的时候就等队列的消息吗?如果不是或者有更好的方式,请指导一下。
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-11-22 18:40:51 | 显示全部楼层
sinus 发表于 2022-11-22 12:38
感谢回复蛤,但是我这边需要按键处理的任务有多个,且进任务后有类似状态机的需要按钮,处理方式是:每个 ...



     假如有4个任务
               (1)、按键任务,任务A,任务B,任务C

消息队列只支持以下2种方法:
    1、一对一
             按键任务给任务A发送按键码。          -----> 任务A
    2、多对一
             按键任务给任务A发送键码
             任务B给任务A发送模拟量AI数据          -----> 任务A
             任务C给任务A发送开关量DI数据。

    消息队列不支持:一对多和多对多。
               不支持:一对多
                               例如:   按键任务给任务A发送按键码。
                                          按键任务给任务B发送按键码。
                                          按键任务给任务c发送按键码。
               不支持:多对多
                                例如:   按键任务给任务A发送按键码。
                                          按键任务给任务B发送按键码。
                                          任务C任务给任务A发送按键码。   


      你提出的【但是我这边需要按键处理的任务有多个】不符合FREERTOS消息队列要求, FREERTOS解决方案:

                 把你【需要按键处理的任务有多个】合并成一个任务。



回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-11-24 17:08:17 | 显示全部楼层
屏幕截图 2022-11-24 170616.png

   兄弟,看看别人的通信程序设计。




回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2022-5-7
在线时间
20 小时
 楼主| 发表于 2022-11-24 22:17:56 | 显示全部楼层
霸王猫 发表于 2022-11-24 17:08
兄弟,看看别人的通信程序设计。

好的,我现在基本完成我的功能了,这两天用一下您提的这个方式。
另外提一下,我如果想用裸机使用SYSTICK那样,在FREERTOS下使用这种TICK该怎么操作?
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-11-25 15:51:02 | 显示全部楼层
在FREERTOS下SYSTICK(滴答中断)用作内核的心跳,你不能用喔,用了会影响内核调度

     在FREERTOS下,你想准确延时,可以用硬件定时器TIM或者FREERTOS提供的软定时器
     在FREERTOS下,你想不需要准确的延时,可以用vTaskDelay节拍函数,想延时3秒
                                      搞个计数器AA以及vTaskDelay(100),当计数器AA++ 后等于30,就是不太准确的3秒

回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-11-25 15:54:38 | 显示全部楼层
  1. /*
  2. *********************************************************************************************************
  3. *
  4. *        模块名称 : 数据观察点与跟踪(DWT)模块
  5. *        文件名称 : bsp_dwt.c
  6. *        版    本 : V1.0
  7. *        说    明 : 在CM3,CM4中可以有3种跟踪源:ETM, ITM 和DWT,本驱动主要实现
  8. *              DWT中的时钟周期(CYCCNT)计数功能,此功能非常重要,可以很方便的
  9. *              计算程序执行的时钟周期个数。
  10. *        修改记录 :
  11. *                版本号    日期        作者     说明
  12. *                V1.0    2015-08-18   Eric2013 正式发布
  13. *
  14. *        Copyright (C), 2015-2020, 安富莱电子 www.armfly.com
  15. *
  16. *********************************************************************************************************
  17. */

  18. #include "stm32f10x.h"
  19. #include "bsp_dwt.h"


  20. /*
  21. *********************************************************************************************************
  22. *                                             寄存器
  23. *********************************************************************************************************
  24. */
  25. #define  DWT_CYCCNT  *(volatile unsigned int *)0xE0001004
  26. #define  DWT_CR      *(volatile unsigned int *)0xE0001000
  27. #define  DEM_CR      *(volatile unsigned int *)0xE000EDFC
  28. #define  DBGMCU_CR   *(volatile unsigned int *)0xE0042004

  29. #define  DEM_CR_TRCENA               (1 << 24)
  30. #define  DWT_CR_CYCCNTENA            (1 <<  0)


  31. /*
  32. *********************************************************************************************************
  33. *        函 数 名: bsp_InitDWT
  34. *        功能说明: 初始化DWT. 该函数被 bsp_Init() 调用。
  35. *        形    参: 无
  36. *        返 回 值: 无
  37. *********************************************************************************************************
  38. */
  39. void bsp_InitDWT(void)
  40. {
  41.         DEM_CR         |= (unsigned int)DEM_CR_TRCENA;   /* Enable Cortex-M4's DWT CYCCNT reg.  */
  42.         DWT_CYCCNT      = (unsigned int)0u;
  43.         DWT_CR         |= (unsigned int)DWT_CR_CYCCNTENA;
  44. }



  45. /*
  46. *********************************************************************************************************
  47. *        函 数 名: bsp_DelayUS
  48. *        功能说明: 这里的延时采用CPU的内部计数实现,32位计数器
  49. *                     OSSchedLock(&err);
  50. *                                bsp_DelayUS(5);
  51. *                                OSSchedUnlock(&err); 根据实际情况看看是否需要加调度锁或选择关中断
  52. *        形    参: _ulDelayTime  延迟长度,单位1 us
  53. *        返 回 值: 无
  54. *   说    明: 1. 主频168MHz的情况下,32位计数器计满是2^32/168000000 = 25.565秒
  55. *                建议使用本函数做延迟的话,延迟在1秒以下。  
  56. *             2. 实际通过示波器测试,微妙延迟函数比实际设置实际多运行0.25us左右的时间。
  57. *             下面数据测试条件:
  58. *             (1). MDK5.15,优化等级0, 不同的MDK优化等级对其没有影响。
  59. *             (2). STM32F407IGT6
  60. *             (3). 测试方法:
  61. *                                 GPIOI->BSRRL = GPIO_Pin_8;
  62. *                                 bsp_DelayUS(10);
  63. *                                 GPIOI->BSRRH = GPIO_Pin_8;
  64. *             -------------------------------------------
  65. *                测试                 实际执行
  66. *             bsp_DelayUS(1)          1.2360us
  67. *             bsp_DelayUS(2)          2.256us
  68. *             bsp_DelayUS(3)          3.256us
  69. *             bsp_DelayUS(4)          4.256us
  70. *             bsp_DelayUS(5)          5.276us
  71. *             bsp_DelayUS(6)          6.276us
  72. *             bsp_DelayUS(7)          7.276us
  73. *             bsp_DelayUS(8)          8.276us
  74. *             bsp_DelayUS(9)          9.276us
  75. *             bsp_DelayUS(10)         10.28us
  76. *            3. 两个32位无符号数相减,获取的结果再赋值给32位无符号数依然可以正确的获取差值。
  77. *              假如A,B,C都是32位无符号数。
  78. *              如果A > B  那么A - B = C,这个很好理解,完全没有问题
  79. *              如果A < B  那么A - B = C, C的数值就是0xFFFFFFFF - B + A + 1。这一点要特别注意,正好用于本函数。
  80. *********************************************************************************************************
  81. */
  82. void bsp_DelayUS(uint32_t _ulDelayTime)
  83. {
  84.     uint32_t tCnt, tDelayCnt;
  85.         uint32_t tStart;
  86.                
  87.         tStart = DWT_CYCCNT;                                     /* 刚进入时的计数器值 */
  88.         tCnt = 0;
  89.         tDelayCnt = _ulDelayTime * (SystemCoreClock / 1000000);         /* 需要的节拍数 */                     

  90.         while(tCnt < tDelayCnt)
  91.         {
  92.                 tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */      
  93.         }
  94. }



  95. /*
  96. *********************************************************************************************************
  97. *        函 数 名: bsp_DelayMS
  98. *        功能说明: 为了让底层驱动在带RTOS和裸机情况下有更好的兼容性
  99. *             专门制作一个阻塞式的延迟函数,在底层驱动中ms毫秒延迟主要用于初始化,并不会影响实时性。
  100. *        形    参: n 延迟长度,单位1 ms
  101. *        返 回 值: 无
  102. *********************************************************************************************************
  103. */
  104. void bsp_DelayMS(uint32_t _ulDelayTime)
  105. {
  106.         bsp_DelayUS(1000*_ulDelayTime);
  107. }
复制代码

在FREERTOS下,你想准确延时,用于IIC或者SPI延时,可以用DWT
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-11-25 15:55:04 | 显示全部楼层
DWT可以完美的在FreeRTOS中做微秒延时

1、首先在main()中调用  bsp_InitDWT()
2、然后在程序中调用bsp_DelayUS(uint32_t _ulDelayTime)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 13:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表