xiangzichen 发表于 2024-10-21 12:17:08

本帖最后由 xiangzichen 于 2024-10-21 12:21 编辑

定长么,就DMA了,不定长,用中断加队列,这个和dma的效果差不多.还不挑单片机.(有无DMA都可),下面是我用队列的一部分程序
u8 buff_size = 0;
u8* buff_p = NULL;

void UartIsr() interrupt 4{
    if(TI) {
      TI = 0;
      if(buff_size > 0) {
            SBUF = *buff_p;
            buff_p++;
            buff_size--;
      }
      else {
            if(mov.send_ok == 0) {
                mov.send_ok = 1;
            }
      }
    }
    if(RI) {
      RI = 0;
      mov.comm_empty_cnt = 1;
      UsbOutBuffer = SBUF;
      mov.comm_buff_index++;
      mov.comm_buff_index &= 0x3f;
    }
}

void uartBuffAutoSend(u8* buff, u8 bf) {
    SendEn();
    buff_p = buff;
    buff_size = bf;
    mov.send_ok = 0;
    TI = 1;
}


晓飛飛 发表于 2024-10-21 19:39:51

串口发送100多个字节怎么可能到了秒级,就算9600波特率也到不了秒级,从来没有遇到这类的烦恼,是不是某个中断里面纠缠太久的时间,尽可能的优化一下其它代码,避免影响串口中断,另外你适当提高串口中断优先级试试。

xxkj2010 发表于 2024-10-23 12:14:31

晓飛飛 发表于 2024-10-21 19:39
串口发送100多个字节怎么可能到了秒级,就算9600波特率也到不了秒级,从来没有遇到这类的烦恼,是不是某个 ...

串口中断优先级已经设置为最高了。
有空试一下发送串口数据的时候暂时停止定时器。

晓飛飛 发表于 2024-10-23 13:41:38

xxkj2010 发表于 2024-10-23 12:14
串口中断优先级已经设置为最高了。
有空试一下发送串口数据的时候暂时停止定时器。 ...

建议优化定时器中断服务函数,把里面一些空等待任务通过状态机碎片化,只要别的中断不长时间占用进程,串口中断就有机会及时响应。

xxkj2010 发表于 2024-10-23 15:48:22

晓飛飛 发表于 2024-10-23 13:41
建议优化定时器中断服务函数,把里面一些空等待任务通过状态机碎片化,只要别的中断不长时间占用进程,串 ...

定时器0只执行变量累加:

void Timer0_Isr(void) interrupt 1
{
    fc++;
}

xxkj2010 发表于 2024-10-23 16:34:51

请问大神:如果定时器0正在执行中断程序,而这下又来了串口中断,即使串口中断优先级设置为最高,这时系统会不会等待执行定时器0中断程序后才去执行串口中断程序?
页: 1 [2]
查看完整版本: 怎样尽量减少串口发送数据等待中断(完成)的时间?