队列本质及实验改进

目录

一、数据传输的方法

​编辑1、队列的本质 

1/环形缓冲区(数据传输)

2/两个链表:发送方的状态记录(send list)、接收方的状态记录(receive list)

2、任务B被A唤醒的情况

3、任务B被 超时唤醒的情况:

二、队列实验——多设备玩游戏


一、数据传输的方法

保护措施,传输效率

1、队列的本质 

队列的本质就是环形缓冲区,队列在环形缓冲区的基础上增加了互斥措施、阻塞-唤醒机制

int r;

int w;

int num; (互斥措施保护了全局变量)

任务A写队列{

 若队列满了,可阻塞一会      任务A的唤醒:任务B唤醒或时钟唤醒

}

 任务B读队列{

若有产品,就马上返回

若有产品就阻塞一会,    任务B的唤醒:时钟唤醒、任务A唤醒

}

1/环形缓冲区(数据传输)

2/两个链表:发送方的状态记录(send list)、接收方的状态记录(receive list)

2、任务B被A唤醒的情况

  1. 任务B读数据:若无数据,从就绪链表移除,放入接收链表和delay链表
  2. 轮到任务A数据后,任务A会顺道把任务B唤醒;
  3. 唤醒操作:取出接收链表中的第一个任务放入就绪链表,并在接受链表和delay链表中删除任务

3、任务B被 超时唤醒的情况:

不断产生TICK中断,在中断中判断链表中的任务是否超时,当超时时,会取出超时的任务放入就绪链表,并在接受链表和delay链表中删除任务

二、队列实验——多设备玩游戏

1、思路

1、创建游戏任务

{//游戏任务的函数及初始化

创建挡球板任务及循环

//挡球板任务  读取红外遥控器函数无阻塞(低效)

 {//判断读取的键值,调整左右位置

{//左右移动函数:设置变量

//根据左右移动来调整x坐标

//重新绘制挡球板

 2、读取红外遥控器函数——环形缓冲区

读红外遥控器函数读环形缓冲区

中断服务程序写环形缓冲区

2、用队列来提升读取红外遥控器步骤的效率 

1、改变:

  • 中断服务函数的数据写入队列(若没有数据就会阻塞)
  • 旋转编码器(遥控器较为迟钝)

2、旋转编码器的写队列方式

在终端服务程序中解析出,所以可以在中断处写入新队列,再单独增加一个任务进行数据处理再放入队列

因为中断会被频繁调用,所以把简单的处理放在中断中,复杂的处理放在新增的中断处理任务中

3、旋转编码器的驱动程序

记录了count和速度

4、新增的处理旋转编码器任务

要做的事情:
  1. 分辨速度
  2. 根据速度决定往队列A写入多少个数据(速度快,多写几个数据;速度慢,少写几个数据):有一个数据,调整三个位置,所以数据越多,调整的位置越远

3、队列的函数

1、队列的创建

动态

 

 

静态

2、读队列

 

 

3、写队列

 

在中断回调函数中写

4、旋转编码器控制 

创建队列 

 

创建旋转编码器的任务 

 

 

 

在中断回调函数中写队列

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值