I/O控制方式——通道控制方式

一、定义

通道是一个独立于 CPU的专管输入/输出控制的处理机,它控制设备与内存直接进行数据交换。它有自己的通道指令,这些通道指令受CPU启动,并在操作结束时向CPU发中断信号。

二、原理

2.1 通道控制方式的引入

通道控制方式与DMA控制方式类似,也是一种以内存为中心,实现设备与内存直接交换数据的控制方式。与DMA控制方式相比,通道方式所需要的CPU干预更少,而且可以做到一个通道控制多台设备,从而进一步减轻了CPU负担

 I/O通道控制方式是对DMA控制方式的发展,它进一步使CPU参与到数据传输的控制减少,即把对一个数据块的读/写为单位的干预,减少为对一组数据块的读/写及有关的控制和管理为单位的干预。同时,又可实现CPU、通道和I/O设备的并行操作,从而更有效地提高整个系统的资源利用率。在通道控制方式中,CPU只需发出启动指令,指出要求通道执行的操作和使用的I/O设备,该指令就可以启动通道并使该通道从内存中调出相应的通道程序执行
 

2.2 通道指令

通道是通过执行通道程序,并与设备控制器共同实现对I/O设备的控制的。通道程序是由一系列通道指令所构成的。通道指令和一般的机器

指令不同,在它的每条指令中都包含下列诸信息:

1)操作码。操作码规定了指令所执行的操作,如读、写、控制等操作。
2)内存地址。内存地址标明字符送入内存(读操作)和从内存取出(写操作)时的内存首址。 3)计数。该信息表示本条指令所要读/写数据的字节数。

4)通道程序结束位P。该位用于表示通道程序是否结束。P=1表示本条指令是通道程序的最后一条指令。

5)记录结束标志R。R=0表示本通道指令与下一条指令所处理的数据是同属于一个记录;R=1表示这是处理某记录的最后一条指令。

三、优缺点

优点:通道控制进一步减轻了CPU的工作负担,增加了计算机系统的并行工作程度。把CPU从繁琐的输入/输出操作中解放出来。采用通道技术后,不仅能实现CPU和通道的并行操作,而且通道与通道之间也能实现并行操作,各通道上的外设也能实现并行操作,从而可提高整个系统的效率。

缺点:由于需要更多硬件(通道处理器),因此其成本较高。通道控制方式通常应用于大型数据交互的场合。

四、通道控制方式与DMA控制方式的区别

1)DMA控制方式中需要CPU来控制所传输数据块的大小,传输的内存地址;通道控制方式中这些信息都是由通道来控制管理的。

2)一个DMA控制器对应一台设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换。

五、 I/O通道与一般处理器的区别

I/O通道的指令类型单一,其所能执行的命令主要局限于与I/O操作有关的指令;通道没有自己的内存,通道所执行的通道程序放在主机的内存中,也就是说通道是与CPU共享内存的。
 

参考:

https://blog.csdn.net/yingshuanglu2564/article/details/82881770

https://blog.csdn.net/dongyanxia1000/article/details/51899369?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-7.control

 

要让乌龟走正方形,需要让它先向前走一段距离,然后右转90度,再向前走一段距离,再右转90度,如此往复。可以通过改变线速度和角速度来实现这个过程。以下是修改后的代码: ``` #include "ros/ros.h" #include "geometry_msgs/Twist.h" int main(int argc, char * argv[]) { ros::init(argc,argv,"pub"); ros::NodeHandle nodeHandle; ros::Publisher publisher = nodeHandle.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10); geometry_msgs::Twist message; // 设置线速度和角速度 double linear_speed = 1.0; // 线速度 double angular_speed = 1.0; // 角速度 // 首先向前走一段距离 message.linear.x = linear_speed; message.angular.z = 0.0; ros::Rate rate(1); int count = 0; while(count < 4) { // 循环4次,每次走直线和转弯 // 走直线 double t1 = ros::Time::now().toSec(); double distance = 0.0; while(distance < 1.0) { // 直线走1米 publisher.publish(message); double t2 = ros::Time::now().toSec(); distance = linear_speed * (t2-t1); } message.linear.x = 0.0; // 停止走直线 // 右转90度 message.angular.z = angular_speed; double t3 = ros::Time::now().toSec(); double angle = 0.0; while(angle < 1.57) { // 转弯90度 publisher.publish(message); double t4 = ros::Time::now().toSec(); angle = angular_speed * (t4-t3); } message.angular.z = 0.0; // 停止转弯 count++; } return 0; } ``` 在这个代码中,首先设置了线速度和角速度的值。然后,在一个循环中,先让乌龟向前走一段距离,然后通过控制时间和角速度来让它右转90度。接着,重复这个过程,让乌龟走完一个正方形。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值