中断方式的发送过程是怎么回事?

有人问过这个问题

“用串口中断接收比较好理解,只要接收缓存接收到数据,标志位就会置位,然后进入中断服务程序读取接收缓存中的数据,但是在发送时,应该是在数据发送出去之后发送标志位才会置位(我是msp430单片机),那么此时等数据发送出去之后进入中断又有什么意义呢?到底如何通过串口中断来发送数据呢?”

通过阅读 STM32 官方库的代码,我找到了答案。

中断发送方式的基本过程是:每发送一个字节,该字节发送完毕引发中断,中断处理程序再发送下一个字节……直到发送完成。

     这里有两个细节问题需要注意:

  1. 第一个字节是怎样发送的?因为发第一个字节之前,并没有发送字节完成所触发的中断,那第一个字节怎么被发送出去?这关系到中断在硬件层面的触发方式:如果是电平触发的中断,在中断式发送函数中会使能相应的中断,因为发送缓冲区为空,其所处的电平状态就在中断功能被使能后会直接触发中断,导致第一个字节在中断处理函数中被发送出去;如果是电平跳变触发的中断,为了引发中断,只好把第一个字节在中断式发送函数中“手动”发送出去,由此引发一个中断的“多米诺”效应,把后面的字节依次发送出去。
  2. 怎么才算“完成”?完成是用参数指定的欲发送字节数决定的,但发送达到指定数目,中断处理函数中就失能相应中断,于是中断的“多米诺”链条停止。
时间: 2024-10-07 07:42:47

中断方式的发送过程是怎么回事?的相关文章

OpenWRT数据发送过程【Linux内核-OpenWRT】

之前一篇写的不完整,重新写一篇 OpenWRT数据发送过程 这里使用的是ath9k网卡驱动,硬件平台是TP-link TL-WR841N V7.1 路由器 1.  packet_sendmsg() Linux kernel发送数据的接口函数是packet_sendmsg,本质上对应了user space的sendmsg实现.上层通过调用sendmsg实现数据的发送.将待发送的数据放入kernel space中. 在内核文件夹linux-3.3.8的子目录:/net/packet中,找到文件af_

在Linux下的中断方式读取按键驱动程序

// 在Linux下的中断方式读取按键驱动程序 //包含外部中断 休眠 加入poll机制 // 采用异步通知的方式 // 驱动程序发 ---> app接收 (通过kill_fasync()发送) // 为了使设备支持异步通知机制,驱动程序中涉及以下3项工作: // 1. 支持F_SETOWN命令,能在这个控制命令处理中设置filp->f_owner为对应进程ID. // 不过此项工作已由内核完成,设备驱动无须处理. // 2. 支持F_SETFL命令的处理,每当FASYNC标志改变时,驱动程序

Linux网络 - 数据包的发送过程【转】

转自:https://segmentfault.com/a/1190000008926093 继上一篇介绍了数据包的接收过程后,本文将介绍在Linux系统中,数据包是如何一步一步从应用程序到网卡并最终发送出去的. 如果英文没有问题,强烈建议阅读后面参考里的文章,里面介绍的更详细. 本文只讨论以太网的物理网卡,并且以一个UDP包的发送过程作为示例,由于本人对协议栈的代码不熟,有些地方可能理解有误,欢迎指正 socket层 +-------------+ | Application | +-----

[转]Linux网络 - 数据包的发送过程

转, 原文:https://segmentfault.com/a/1190000008926093 -------------------------------------------------------------------------------------------------------------------- 继上一篇介绍了数据包的接收过程后,本文将介绍在Linux系统中,数据包是如何一步一步从应用程序到网卡并最终发送出去的. 如果英文没有问题,强烈建议阅读后面参考里的文章

S5PV210 串口实验(中断方式)

结合之前的串口实验(轮询方式)与中断体系分析,我们来做下中断方式的串口接收实验. start.S .global _start .global IRQ_handle _start: /* 关 Watch Dog */ ldr r0, =0xE2700000 mov r1, #0 str r1, [r0] /* 设置系统模式栈指针 */ ldr sp, =0x40000000 /* 开 IRQ 总中断开关 */ mov r0, #0x53 msr CPSR_cxsf, r0 /* 时钟初始化 */

RTX——第19章 SVC 中断方式调用用户函数(后期补历程)

本章节为大家讲解如何采用 SVC 中断方式调用用户函数. 当用户将 RTX 任务设置为工作在非特权级模式时,任务中是不允许访问特权级寄存器的,这个时候使用 SVC 中断,此问题就迎刃而解了. SVC 功能介绍SVC 用于产生系统函数的调用请求.例如,操作系统通常不让用户程序直接访问硬件,而是通过提供一些系统服务函数,让用户程序使用 SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件.因此,当用户程序想要控制特定的硬件时,它就要产生一个 SVC 异常,然后操作系统提供的SVC

28335scififo中断接收与发送

#include "DSP28x_Project.h"// Device Headerfile and Examples Include File interrupt void scibTxFifoIsr(void);//fifo发送中断函数 interrupt void scibRxFifoIsr(void);//fifo接收中断函数 void scib_fifo_init(void);//scib fifo模式 初始化函数 char buffer [100];//数据缓冲数组 vo

单片机第12课:串口通信---中断方式--从计算机接收数据

JP3和P0口连接.用中断的方式来接收数据. #include<reg51.h> //声明初始化子函数 void initSer(); void main() { //初始化子函数调用 initSer(); while(1) { //一句话都没有 } } //定义初始化子函数 void initSer() { //定时器工作方式为2 TMOD = 0x20; //波特率9600,SMOD=0 TH1 = 0xfd; TL1 = 0xfd; //启动定时器 TR1 = 1; //串口工作方式1

Android4.4 Telephony流程分析——彩信(MMS)发送过程

本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. 彩信收发依靠WAP网络,在Android4.4中的实现基于Http协议的应用.下图为几个彩信传输过程中的关键类: SendTransaction:发送彩信 NotificationTransaction:彩信接收 ReadRecTransaction:彩信阅读报告 RetrieveTransaction:彩信下载 TransactionService是个service,负责调度处理各种彩信事