定长么,就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;
}
串口发送100多个字节怎么可能到了秒级,就算9600波特率也到不了秒级,从来没有遇到这类的烦恼,是不是某个中断里面纠缠太久的时间,尽可能的优化一下其它代码,避免影响串口中断,另外你适当提高串口中断优先级试试。 晓飛飛 发表于 2024-10-21 19:39
串口发送100多个字节怎么可能到了秒级,就算9600波特率也到不了秒级,从来没有遇到这类的烦恼,是不是某个 ...
串口中断优先级已经设置为最高了。
有空试一下发送串口数据的时候暂时停止定时器。 xxkj2010 发表于 2024-10-23 12:14
串口中断优先级已经设置为最高了。
有空试一下发送串口数据的时候暂时停止定时器。 ...
建议优化定时器中断服务函数,把里面一些空等待任务通过状态机碎片化,只要别的中断不长时间占用进程,串口中断就有机会及时响应。 晓飛飛 发表于 2024-10-23 13:41
建议优化定时器中断服务函数,把里面一些空等待任务通过状态机碎片化,只要别的中断不长时间占用进程,串 ...
定时器0只执行变量累加:
void Timer0_Isr(void) interrupt 1
{
fc++;
}
请问大神:如果定时器0正在执行中断程序,而这下又来了串口中断,即使串口中断优先级设置为最高,这时系统会不会等待执行定时器0中断程序后才去执行串口中断程序?
页:
1
[2]