找回密码
 立即注册
楼主: xxkj2010

怎样尽量减少串口发送数据等待中断(完成)的时间?

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-04-25 16:31:21
已绑定手机

14

主题

600

回帖

2199

积分

荣誉版主

积分
2199
发表于 2024-10-21 12:17:08 | 显示全部楼层
本帖最后由 xiangzichen 于 2024-10-21 12:21 编辑

定长么,就DMA了,不定长,用中断加队列,这个和dma的效果差不多.还不挑单片机.(有无DMA都可),下面是我用队列的一部分程序
  1. u8 buff_size = 0;
  2. u8* buff_p = NULL;
  3. void UartIsr() interrupt 4{
  4.     if(TI) {
  5.         TI = 0;
  6.         if(buff_size > 0) {
  7.             SBUF = *buff_p;
  8.             buff_p++;
  9.             buff_size--;
  10.         }
  11.         else {
  12.             if(mov.send_ok == 0) {
  13.                 mov.send_ok = 1;
  14.             }
  15.         }
  16.     }
  17.     if(RI) {
  18.         RI = 0;
  19.         mov.comm_empty_cnt = 1;
  20.         UsbOutBuffer[mov.comm_buff_index] = SBUF;
  21.         mov.comm_buff_index++;
  22.         mov.comm_buff_index &= 0x3f;
  23.     }  
  24. }
  25. void uartBuffAutoSend(u8* buff, u8 bf) {
  26.     SendEn();
  27.     buff_p = buff;
  28.     buff_size = bf;
  29.     mov.send_ok = 0;
  30.     TI = 1;
  31. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-10-21 19:39:51 | 显示全部楼层
串口发送100多个字节怎么可能到了秒级,就算9600波特率也到不了秒级,从来没有遇到这类的烦恼,是不是某个中断里面纠缠太久的时间,尽可能的优化一下其它代码,避免影响串口中断,另外你适当提高串口中断优先级试试。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-10-23 12:14:31 | 显示全部楼层
晓*** 发表于 2024-10-21 19:39
串口发送100多个字节怎么可能到了秒级,就算9600波特率也到不了秒级,从来没有遇到这类的烦恼,是不是某个 ...

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

点评

建议优化定时器中断服务函数,把里面一些空等待任务通过状态机碎片化,只要别的中断不长时间占用进程,串口中断就有机会及时响应。  详情 回复 发表于 2024-10-23 13:41
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-10-23 13:41:38 | 显示全部楼层
xxkj*** 发表于 2024-10-23 12:14
串口中断优先级已经设置为最高了。
有空试一下发送串口数据的时候暂时停止定时器。 ...

建议优化定时器中断服务函数,把里面一些空等待任务通过状态机碎片化,只要别的中断不长时间占用进程,串口中断就有机会及时响应。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-10-23 15:48:22 | 显示全部楼层
晓*** 发表于 2024-10-23 13:41
建议优化定时器中断服务函数,把里面一些空等待任务通过状态机碎片化,只要别的中断不长时间占用进程,串 ...

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

  1. void Timer0_Isr(void) interrupt 1
  2. {
  3.     fc++;
  4. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-10-23 16:34:51 | 显示全部楼层
请问大神:如果定时器0正在执行中断程序,而这下又来了串口中断,即使串口中断优先级设置为最高,这时系统会不会等待执行定时器0中断程序后才去执行串口中断程序?
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:36 , Processed in 0.120058 second(s), 74 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表