OpenEdv-开源电子网

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

FIFO 的一个小探讨

[复制链接]

76

主题

355

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2012-9-19
在线时间
5 小时
发表于 2012-9-27 15:27:09 | 显示全部楼层 |阅读模式

这东西看到就头疼了,
typedef struct
{
 uint8_t Buf[KEY_FIFO_SIZE];  /* 键值缓冲区 */
 uint8_t Read; /* 缓冲区读指针 */
 uint8_t Write; /* 缓冲区写指针 */
}KEY_FIFO_T;

/*******************************************************************************
 函数名: PutKey
 输  入: 键值
 输  出:
 功能说明:将1个键值压入按键FIFO缓冲区
*/
void PutKey(uint8_t _KeyCode)
{
 s_Key.Buf[s_Key.Write] = _KeyCode;

 if (++s_Key.Write  >= KEY_FIFO_SIZE)
 {
  s_Key.Write = 0;
 }
}
/*******************************************************************************
 函数名: GetKey
 输  入:
 输  出: 返回键值, KEY_NONE ( = 0) 表示无键按下
 功能说明:从按键FIFO取1个键值
*/
uint8_t GetKey(void)
{
 uint8_t ret;

 if (s_Key.Read == s_Key.Write)
 {
  return KEY_NONE;
 }
 else
 {
  ret = s_Key.Buf[s_Key.Read];

  if (++s_Key.Read >= KEY_FIFO_SIZE)
  {
   s_Key.Read = 0;
  }
  return ret;
 }
}

来大家看一下程序。分析一番,他这意思就是自己访问自己的第N位,然后指针++只要不超过20就OK,读取的时候也有自己相应的读取位,挤压函数放入SYSTICK不停搜索,   一旦有按键安。就压入BUF中,然后再while(1)里一直读这个值。。。。你们分析呢

具有资深STM32点灯技术,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

100

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-9-27 19:19:16 | 显示全部楼层
这段代码实现的应该就是,先进缓存的先被读的过程吧。
喜欢单片机,没什么道理,就像爱吃水煮鱼,对味而已。
回复 支持 反对

使用道具 举报

76

主题

355

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2012-9-19
在线时间
5 小时
 楼主| 发表于 2012-9-28 08:59:14 | 显示全部楼层
回复【2楼】爱吃水煮鱼:
---------------------------------
差不多。中断函数放到SYSTICK里 一个心跳 扫面一次。有键职按下就压入BUF里。然后直接读出来。其实是个循环的那种。
具有资深STM32点灯技术,
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 02:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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