轮询、中断、DMA和通道

一、轮询方式
  对I/O设备的程序轮询的方式,是早期的计算机系统对I/O设备的一种管理方式。它定时对各种设备轮流询问一遍有无处理要求。轮流询问之后,有要求的,则加以处理。在处理I/O设备的要求之后,处理机返回继续工作。
  尽管轮询需要时间,但轮询不比I/O设备的速度要快得多,所以一般不会发生不能及时处理的问题。 
  当然,再快的处理机,能处理的输入输出设备的数量也是有一定限度的。而且,程序轮询毕竟占据了CPU相当一部分处理时间,因此程序轮询是一种效率较低的方式,在现代计算机系统中已很少应用。

二、中断方式 
  处理器的高速和输入输出设备的低速是一对矛盾,是设备管理要解决的一个重要问题。为了提高整体效率,减少在程序直接控制方式中CPU之间的数据传送,是很必要的。 
  在I/O设备中断方式下,中央处理器与I/O设备之间数据的传输步骤如下: 
  ⑴在某个进程需要数据时,发出指令启动输入输出设备准备数据 
  ⑵在进程发出指令启动设备之后,该进程放弃处理器,等待相关I/O操作完成。此时,进程调度程序会调度其他就绪进程使用处理器。 
  ⑶当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转向预先设计好的中断处理程序,对数据传送工作进行相应的处理。 
  ⑷得到了数据的进程,转入就绪状态。在随后的某个时刻,进程调度程序会选中该进程继续工作。 
  中断方式的优缺点 
  I/O设备中断方式使处理器的利用率提高,且能支持多道程序和I/O设备的并行操作。 
  不过,中断方式仍然存在一些问题。首先,现代计算机系统通常配置有各种各样的输入输出设备。如果这些I/O设备都同过中断处理方式进行并行操作,那么中断次数的急剧增加会造成CPU无法响应中断和出现数据丢失现象。 
  其次,如果I/O控制器的数据缓冲区比较小,在缓冲区装满数据之后将会发生中断。那么,在数据传送过程中,发生中断的机会较多,这将耗去大量的CPU处理时间。

三、直接内存存取(DMA)方式 
  直接内存存取技术是指,数据在内存与I/O设备间直接进行成块传输。 
  DMA技术特征 
  DMA有两个技术特征,首先是直接传送,其次是块传送。 
  所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。 
  DMA工作过程 
  ⑴当进程要求设备输入数据时,CPU把准备存放输入数据的内存起始地址以及要传送的字节数分别送入DMA控制器中的内存地址寄存器和传送字节计数器。
  ⑵发出数据传输要求的进行进入等待状态。此时正在执行的CPU指令被暂时挂起。进程调度程序调度其他进程占据CPU。
  ⑶输入设备不断地窃取CPU工作周期,将数据缓冲寄存器中的数据源源不断地写入内存,直到所要求的字节全部传送完毕。
  ⑷DMA控制器在传送完所有字节时,通过中断请求线发出中断信号。CPU在接收到中断信号后,转入中断处理程序进行后续处理。
  ⑸中断处理结束后,CPU返回到被中断的进程中,或切换到新的进程上下文环境中,继续执行。
  DMA与中断的区别
  ⑴中断方式是在数据缓冲寄存器满之后发出中断,要求CPU进行中断处理,而DMA方式则是在所要求传送的数据块全部传送结束时要求CPU 进行中断处理。这就大大减少了CPU进行中断处理的次数。
  ⑵中断方式的数据传送是在中断处理时由CPU控制完成的,而DMA方式则是在DMA控制器的控制下,不经过CPU控制完成的。这就排除了CPU因并行设备过多而来不及处理以及因速度不匹配而造成数据丢失等现象。
  DMA方式的优缺点
  在DMA方式中,由于I/O设备直接同内存发生成块的数据交换,因此I/O效率比较高。由于DMA技术可以提高I/O效率,因此在现代计算机系统中,得到了广泛的应用。许多输入输出设备的控制器,特别是块设备的控制器,都支持DMA方式。
  通过上述分析可以看出,DMA控制器功能的强弱,是决定DMA效率的关键因素。DMA控制器需要为每次数据传送做大量的工作,数据传送单位的增大意味着传送次数的减少。另外,DMA方式窃取了始终周期,CPU处理效率降低了,要想尽量少地窃取始终周期,就要设法提高DMA控制器的性能,这样可以较少地影响CPU出理效率。

四、通道方式
  输入/输出通道是一个独立于CPU的,专门管理I/O的处理机,它控制设备与内存直接进行数据交换。它有自己的通道指令,这些通道指令由CPU启动,并在操作结束时向CPU发出中断信号,见图6-3。
  输入/输出通道控制是一种以内存为中心,实现设备和内参内直接交换数据的控制方式。在通道方式中,数据的传送方向、存放数据的内存起始地址以及传送的数据块长度等都由通道来进行控制。
  另外,通道控制方式可以做到一个通道控制多台设备与内存进行数据交换。因而,通道方式进一步减轻了CPU的工作负担,增加了计算机系统的并行工作程度。
  输入/输出通道分类
  按照信息交换方式和所连接的设备种类不同,通道可以分为以下三种类型:
  ⑴字节多路通道
  它适用于连接打印机、终端等低速或中速的I/O设备。这种通道以字节为单位交叉工作:当为一台设备传送一个字节后,立即转去为另一它设备传送一个字节。
  ⑵选择通道
  它适用于连接磁盘、磁带等高速设备。这种通道以“组方式”工作,每次传送一批数据,传送速率很高,但在一段时间只能为一台设备服务。每当一个I/O请求处理完之后,就选择另一台设备并为其服务。
  ⑶成组多路通道
  这种通道综合了字节多路通道分时工作和选择通道传输速率高的特点,其实质是:对通道程序采用多道程序设计技术,使得与通道连接的设备可以并行工作。
  通道工作原理
  在通道控制方式中,I/O设备控制器(常简称为I/O控制器)中没有传送字节计数器和内存地址寄存器,但多了通道设备控制器和指令执行部件。CPU只需发出启动指令,指出通道相应的操作和I/O设备,该指令就可启动通道并使该通道从内存中调出相应的通道指令执行。
  一旦CPU发出启动通道的指令,通道就开始工作。I/O通道控制I/O控制器工作,I/O控制器又控制I/O设备。这样,一个通道可以连接多个I/O控制器,而一个I/O控制器又可以连接若干台同类型的外部设备。
  通道的连接
  由于通道和控制器的数量一般比设备数量要少,因此,如果连接不当,往往会导致出现“瓶颈”。故一般设备的连接采用交叉连接,这样做的好处是:
  ①  提高系统的可靠性:当某条通路因控制器或通道故障而断开时,可使用其他通路。
  ②   提高设备的并行性:对于同一个设备,当与它相连的某一条通路中的控制器或通道被占用时,可以选择另一条空闲通路,减少了设备因等待通路所需要花费的时间。
  通道处理机
  通道相当于一个功能单纯的处理机,它具有自己的指令系统,包括读、写、控制、转移、结束以及空操作等指令,并可以执行由这些指令编写的通道程序。
  通道的运算控制部件包括:
  ① 通道地址字(CAW):记录下一条通道指令存放的地址,其功能类似于中央处理机的指令寄存器。
  ② 通道命令字(CCW):记录正在执行的通道指令,其作用相当于中央处理机的指令寄存器。
  ③  通道状态字(CSW):记录通道、控制器、设备的状态,包括I/O传输完成信息、出错信息、重复执行次数等。
  通道对主机的访问
  通道一般需要与主机共享同一个内存,以保存通道程序和交换数据。通道访问内存采用“周期窃用”方式。
  采用通道方式后,输入/输出的执行过程如下:
  CPU在执行用户程序时遇到I/O请求,根据用户的I/O请求生成通道程序(也可以是事先编好的)。放到内存中,并把该通道程序首地址放入CAW中。
  然后,CPU执行“启动I/O”指令,启动通道工作。通道接收“启动I/O”指令信号,从CAW中取出通道程序首地址,并根据此地址取出通道程序的第一条指令,放入CCW中;同时向CU发回答信号,通知“启动I/O”指令完成完毕,CPU可继续执行。
  通道开始执行通道程序,进行物理I/O操作。当执行完一条指令后,如果还有下一条指令则继续执行;否则表示传输完成,同时自行停止,通知CPU转去处理通道结束事件,并从CCW中得到有关通道状态。
  总之,在通道中,I/O运用专用的辅助处理器处理I/O操作,从而减轻了主处理器处理I/O的负担。主处理器只要发出一个I/O操作命令,剩下的工作完全由通道负责。I/O操作结束后,I/O通道会发出一个中断请求,表示相应操作已完成。
  通道的发展
  通道的思想是从早期的大型计算机系统中发展起来的。在早期的大型计算机系统中,一般配有大量的I/O设备。为了把对I/O设备的管理从计算机主机中分离出来,形成了I/O通道的概念,并专门设计出I/O通道处理机。
  I/O通道在计算机系统中是一个非常重要的部件,它对系统整体性能的提高起了相当重要的作用。不过,随着技术不断的发展,处理机和I/O设备性能的不断提高,专用的、独立I/O通道处理机已不容易见到。但是通道的思想又融入了许多新的技术,所以仍在广泛地应用着。由于光纤通道技术具有数据传输速率高、数据传输距离远以及可简化大型存储系统设计的优点,新的通用光纤通道技术正在快速发展。这种通用光纤通道可以在一个通道上容纳多达127个的大容量硬盘驱动器。显然,在大容量高速存储应用领域,通用光纤通道有着广泛的应用前景。

通道处理机

转自http://blog.csdn.net/jxl_1207/article/details/51492194

对于工作方式、工作速度、工作性质不同的外围设备,采用三种常用的三种不同的输入输出方式:程序控制输入输出方式、中断输入输出方式以及DMA方式。

程序控制方式不论何时何地都受cpu的控制,不能与cpu并行工作;

中断方式虽然可以克服不能并行的缺点,但数据输入输出都要经过cpu;

DMA方式需要cpu在开始时对其进行初始化,结束时要向cpu申请中断;

所以,为了把对外围设备的管理工作从cpu分离出来,产生了通道处理机技术。

          通道处理机一次数据传送过程,如下:

 

        1、cpu执行到访管指令时,按其提供的入口地址,第一次进入管态(特权态),将管理程序调出来执行。这个管理程序的任务是利用所带的参数来编制通道程序。
    在通道程序编好并且存入主存中某个通道缓冲区时,置好相应的通道地址字(即就是在主存的地址),当管理程序执行到“启动I/O”的管态程序时,开始选择设备。
      2、cpu选择指定的通道、子通道、设备控制器和设备后,发出启动命令,设备成功启动后,cpu就退出管态,返回目态(用户态)去执行其他的用户程序。

      3、被启动的通道开始执行存放于通道缓冲区的通道程序具体组织I/O操作,直至执行到断开通道指令完成了通道程序后,又向cpu发出I/O中断请求。
      4、cpu在响应I/O中断请求后,第二次进入管态,调出相应的管理程序,进行善后登记和处理后(正常结束则进行登记工作,异常情况则进行额外处理),重新返回目态。

             若是看明白所描述的过程,那么就很容易可以看懂下图了

 

           其中,在cpu发中断请求和响应中断请求之间的时间是中断响应时间。

   通道可划分为三类:字节多路通道,选择通道,数组多路通道。

         对数据传送时间作以解释:

            Ts是设备选择时间,Td是传送一个字节所用的时间。

       通道流量是指一个数据在传送期间,单位时间内能够传送的最大数据量,一般用字节个数表示。

       传送过程说明:

       通道在每个工作周期里,对设备发出的请求进行一次排队,选出优先级高的设备请求予以响应和处理,只有在此刻之前或与此刻同时发出的请求传送数据的设备,才能参加本次排队,错过这个时间,必须等到下一次设备选择期,开始参加排队。
        流量设计的要求:要求实际流量接近极限流量,但可能会造成数据丢失,所以一般会增加通道最大流量,保证请求都可以被响应,或者动态改变优先级,增加数据缓冲寄存器。

  • 6
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TIM1_CNT产生溢出中断时的中断通道配置代码可以根据具体的需求而有所不同,以下是一个可能的示例: ```c // 使能TIM1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 配置TIM1的基本参数 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 65535; // 设置自动重载寄存器的值 TIM_TimeBaseStructure.TIM_Prescaler = 719; // 设置预分频值 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 使能TIM1的溢出中断 TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); // 配置中断通道 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; // TIM1的溢出中断对应的中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 启动TIM1 TIM_Cmd(TIM1, ENABLE); ``` 在上述代码中,首先使用`RCC_APB2PeriphClockCmd()`函数使能TIM1的时钟,然后配置了TIM1的基本参数,包括自动重载寄存器的值和预分频值。接下来,使用`TIM_ITConfig()`函数使能TIM1的溢出中断。最后,使用`NVIC_Init()`函数配置TIM1的溢出中断对应的中断通道,并启动TIM1。 ### 回答2: 当TIM1_CNT产生溢出中断时,需要进行中断通道的配置。下面是配置代码的例子: 首先,确保TIM1时钟被使能。例如,可以使用下列代码启用TIM1的时钟: ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); ``` 接下来,配置TIM1溢出中断。 首先,使能TIM1的溢出中断。可以通过以下代码实现: ```c TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); ``` 然后,配置NVIC(Nested Vectored Interrupt Controller)来使能TIM1中断。 先定义一个NVIC_InitTypeDef类型的变量,如: ```c NVIC_InitTypeDef NVIC_InitStructure; ``` 然后,为TIM1配置中断优先级。可以使用以下代码设置中断优先级: ```c NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); ``` 其中,TIM1_UP_IRQn表示TIM1产生溢出中断中断向量。 最后,在ATIM1的初始化代码中,启用中断发送。例如: ```c TIM_ClearFlag(TIM1, TIM_FLAG_Update); TIM_Cmd(TIM1, ENABLE); ``` 以上是使用中断的配置代码。在TIM1_CNT产生溢出时,中断程序将被触发执行。 ### 回答3: 在STM32中配置TIM1_CNT产生溢出中断中断通道,可以使用以下代码: 首先,需要在中断向量表中配置TIM1的中断处理函数。在汇编文件startup_stm32.s中,找到TIM1_IRQHandler标签,并在其下方添加一个跳转指令,跳转到我们要定义的中断处理函数。 TIM1_IRQHandler: B .Tim1_Overflow_Handler 然后,在主程序的C文件中,定义TIM1的中断处理函数Tim1_Overflow_Handler。此函数将会在TIM1_CNT溢出时被调用,进行相应的处理逻辑。 void Tim1_Overflow_Handler(void) { // 这里执行当TIM1_CNT溢出时的处理逻辑 } 接下来,在主程序中进行中断通道配置。我们需要启用TIM1的中断,并将中断优先级设置为所需的值。以下是配置代码的示例: // 使能TIM1的中断 NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn); // 设置TIM1的中断优先级 NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0); 其中,TIM1_UP_TIM10_IRQn是TIM1的溢出中断对应的中断号。NVIC_EnableIRQ()函数用于使能中断,NVIC_SetPriority()函数用于设置中断优先级。将中断优先级设置为0表示最高优先级。 最后,记得在TIM1初始化代码中启用溢出中断。以下是TIM1初始化的示例代码: TIM1->CR1 |= TIM_CR1_URS; // 只有在计数器溢出时产生中断 TIM1->DIER |= TIM_DIER_UIE; // 使能溢出中断 这样,当TIM1的计数器CNT达到最大值时,即产生溢出,就会触发TIM1的中断,执行Tim1_Overflow_Handler()函数中的处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值