目录
2/两个链表:发送方的状态记录(send list)、接收方的状态记录(receive list)
一、数据传输的方法
保护措施,传输效率
1、队列的本质
队列的本质就是环形缓冲区,队列在环形缓冲区的基础上增加了互斥措施、阻塞-唤醒机制
int r;
int w;
int num; (互斥措施保护了全局变量)
任务A写队列{
若队列满了,可阻塞一会 任务A的唤醒:任务B唤醒或时钟唤醒
}
任务B读队列{
若有产品,就马上返回
若有产品就阻塞一会, 任务B的唤醒:时钟唤醒、任务A唤醒
}
1/环形缓冲区(数据传输)
2/两个链表:发送方的状态记录(send list)、接收方的状态记录(receive list)
2、任务B被A唤醒的情况
- 任务B读数据:若无数据,从就绪链表移除,放入接收链表和delay链表
- 轮到任务A数据后,任务A会顺道把任务B唤醒;
- 唤醒操作:取出接收链表中的第一个任务放入就绪链表,并在接受链表和delay链表中删除任务
3、任务B被 超时唤醒的情况:
不断产生TICK中断,在中断中判断链表中的任务是否超时,当超时时,会取出超时的任务放入就绪链表,并在接受链表和delay链表中删除任务
二、队列实验——多设备玩游戏
1、思路
1、创建游戏任务
{//游戏任务的函数及初始化
创建挡球板任务及循环
//挡球板任务 读取红外遥控器函数无阻塞(低效)
{//判断读取的键值,调整左右位置
{//左右移动函数:设置变量
//根据左右移动来调整x坐标
//重新绘制挡球板
2、读取红外遥控器函数——环形缓冲区
读红外遥控器函数读环形缓冲区
中断服务程序写环形缓冲区
2、用队列来提升读取红外遥控器步骤的效率
1、改变:
- 中断服务函数的数据写入队列(若没有数据就会阻塞)
- 旋转编码器(遥控器较为迟钝)
2、旋转编码器的写队列方式
在终端服务程序中解析出,所以可以在中断处写入新队列,再单独增加一个任务进行数据处理再放入队列
因为中断会被频繁调用,所以把简单的处理放在中断中,复杂的处理放在新增的中断处理任务中
3、旋转编码器的驱动程序
记录了count和速度
4、新增的处理旋转编码器任务
要做的事情:
- 分辨速度
- 根据速度决定往队列A写入多少个数据(速度快,多写几个数据;速度慢,少写几个数据):有一个数据,调整三个位置,所以数据越多,调整的位置越远
3、队列的函数
1、队列的创建
动态
静态
2、读队列
3、写队列
在中断回调函数中写
4、旋转编码器控制
创建队列
创建旋转编码器的任务
在中断回调函数中写队列