__delay_ms函数会对影响到定时器中断么

时间:2022-07-19 23:45:26
TXB0CONbits.TXREQ = 1; //置1,则开始发送
    while(TXB0CONbits.TXREQ);//等待其发送完毕,问题在于,如果总线上其他设备都已关闭,则会发送失败,在此处死循环

    问题如上,在此处,如果不添加后面一句,那么在下一次用发送缓冲区0时,就会无法发送。但如果添加上此句,那么我关闭上位机时,就会在此处死循环。

   我知道有错误中断,我自己试了几次,却各种不成功。
   
   后来使用__delay_ms函数,
while(1) {
 if (!TXB0CONbits.TXREQ) break;//发送完毕,退出
__delay_m(1);//延时1ms
 n++;
 if (n>=5) break;//超时,退出。
}
但是我有一个疑问,就是如果我使用这个函数,是否会影响到定时器中断,使之在此1ms中无法中断。

6 个解决方案

#1


不会,
但保险起见你还是得看下_delay_ms的代码.
就像前一阵碰到的一个BSP, 到处都是设置systick去延时,也不考虑下OS的感受

#2


引用 楼主 qq_24751415 的回复:
TXB0CONbits.TXREQ = 1; //置1,则开始发送
    while(TXB0CONbits.TXREQ);//等待其发送完毕,问题在于,如果总线上其他设备都已关闭,则会发送失败,在此处死循环

    问题如上,在此处,如果不添加后面一句,那么在下一次用发送缓冲区0时,就会无法发送。但如果添加上此句,那么我关闭上位机时,就会在此处死循环。

   我知道有错误中断,我自己试了几次,却各种不成功。
   
   后来使用__delay_ms函数,
while(1) {
 if (!TXB0CONbits.TXREQ) break;//发送完毕,退出
__delay_m(1);//延时1ms
 n++;
 if (n>=5) break;//超时,退出。
}
但是我有一个疑问,就是如果我使用这个函数,是否会影响到定时器中断,使之在此1ms中无法中断。


不会影响到定时器中断。
建议:
1.如果这个通信外设支持发送中断,那开启发送中断最好,然后配合发送中断的ISR,就不会那么浪费CPU了
2.这个通信外设不支持发送中断,因为你这里是1ms的延时,其实也不算短,可以的话,倒不如用OS。

#3


引用 2 楼 lr2131 的回复:
Quote: 引用 楼主 qq_24751415 的回复:

TXB0CONbits.TXREQ = 1; //置1,则开始发送
    while(TXB0CONbits.TXREQ);//等待其发送完毕,问题在于,如果总线上其他设备都已关闭,则会发送失败,在此处死循环

    问题如上,在此处,如果不添加后面一句,那么在下一次用发送缓冲区0时,就会无法发送。但如果添加上此句,那么我关闭上位机时,就会在此处死循环。

   我知道有错误中断,我自己试了几次,却各种不成功。
   
   后来使用__delay_ms函数,
while(1) {
 if (!TXB0CONbits.TXREQ) break;//发送完毕,退出
__delay_m(1);//延时1ms
 n++;
 if (n>=5) break;//超时,退出。
}
但是我有一个疑问,就是如果我使用这个函数,是否会影响到定时器中断,使之在此1ms中无法中断。


不会影响到定时器中断。
建议:
1.如果这个通信外设支持发送中断,那开启发送中断最好,然后配合发送中断的ISR,就不会那么浪费CPU了
2.这个通信外设不支持发送中断,因为你这里是1ms的延时,其实也不算短,可以的话,倒不如用OS。


OS是什么意思,抱歉,我是初入门。

#4


引用 3 楼 qq_24751415 的回复:
Quote: 引用 2 楼 lr2131 的回复:

Quote: 引用 楼主 qq_24751415 的回复:

TXB0CONbits.TXREQ = 1; //置1,则开始发送
    while(TXB0CONbits.TXREQ);//等待其发送完毕,问题在于,如果总线上其他设备都已关闭,则会发送失败,在此处死循环

    问题如上,在此处,如果不添加后面一句,那么在下一次用发送缓冲区0时,就会无法发送。但如果添加上此句,那么我关闭上位机时,就会在此处死循环。

   我知道有错误中断,我自己试了几次,却各种不成功。
   
   后来使用__delay_ms函数,
while(1) {
 if (!TXB0CONbits.TXREQ) break;//发送完毕,退出
__delay_m(1);//延时1ms
 n++;
 if (n>=5) break;//超时,退出。
}
但是我有一个疑问,就是如果我使用这个函数,是否会影响到定时器中断,使之在此1ms中无法中断。


不会影响到定时器中断。
建议:
1.如果这个通信外设支持发送中断,那开启发送中断最好,然后配合发送中断的ISR,就不会那么浪费CPU了
2.这个通信外设不支持发送中断,因为你这里是1ms的延时,其实也不算短,可以的话,倒不如用OS。


OS是什么意思,抱歉,我是初入门。


OS:Operating system  也就是操作系统。你这里没有MMU的话,当然得用单片机的操作系统。

单片机的操作系统,建议你使用UCOS2或UCOS3的单片机操作系统。

你这里1ms的延时值刚好可以做UCOS2/3的系统心跳频率。
这样就不会把CPU浪费在delay上了

#5


用操作系统未免改动太大了。
这段程序如果不是在中断中而且延时程序也没有改变定时器设置的话,不会影响。没有其它实时要求的话不用大改了

#6


经过测试,确实不会。根据诸位的说法,delay比较浪费,我规避了它的使用,恩,其实主要是考虑到每次delay需要的时间其实并不一定,可能会让单片机跑起来更慢,

#1


不会,
但保险起见你还是得看下_delay_ms的代码.
就像前一阵碰到的一个BSP, 到处都是设置systick去延时,也不考虑下OS的感受

#2


引用 楼主 qq_24751415 的回复:
TXB0CONbits.TXREQ = 1; //置1,则开始发送
    while(TXB0CONbits.TXREQ);//等待其发送完毕,问题在于,如果总线上其他设备都已关闭,则会发送失败,在此处死循环

    问题如上,在此处,如果不添加后面一句,那么在下一次用发送缓冲区0时,就会无法发送。但如果添加上此句,那么我关闭上位机时,就会在此处死循环。

   我知道有错误中断,我自己试了几次,却各种不成功。
   
   后来使用__delay_ms函数,
while(1) {
 if (!TXB0CONbits.TXREQ) break;//发送完毕,退出
__delay_m(1);//延时1ms
 n++;
 if (n>=5) break;//超时,退出。
}
但是我有一个疑问,就是如果我使用这个函数,是否会影响到定时器中断,使之在此1ms中无法中断。


不会影响到定时器中断。
建议:
1.如果这个通信外设支持发送中断,那开启发送中断最好,然后配合发送中断的ISR,就不会那么浪费CPU了
2.这个通信外设不支持发送中断,因为你这里是1ms的延时,其实也不算短,可以的话,倒不如用OS。

#3


引用 2 楼 lr2131 的回复:
Quote: 引用 楼主 qq_24751415 的回复:

TXB0CONbits.TXREQ = 1; //置1,则开始发送
    while(TXB0CONbits.TXREQ);//等待其发送完毕,问题在于,如果总线上其他设备都已关闭,则会发送失败,在此处死循环

    问题如上,在此处,如果不添加后面一句,那么在下一次用发送缓冲区0时,就会无法发送。但如果添加上此句,那么我关闭上位机时,就会在此处死循环。

   我知道有错误中断,我自己试了几次,却各种不成功。
   
   后来使用__delay_ms函数,
while(1) {
 if (!TXB0CONbits.TXREQ) break;//发送完毕,退出
__delay_m(1);//延时1ms
 n++;
 if (n>=5) break;//超时,退出。
}
但是我有一个疑问,就是如果我使用这个函数,是否会影响到定时器中断,使之在此1ms中无法中断。


不会影响到定时器中断。
建议:
1.如果这个通信外设支持发送中断,那开启发送中断最好,然后配合发送中断的ISR,就不会那么浪费CPU了
2.这个通信外设不支持发送中断,因为你这里是1ms的延时,其实也不算短,可以的话,倒不如用OS。


OS是什么意思,抱歉,我是初入门。

#4


引用 3 楼 qq_24751415 的回复:
Quote: 引用 2 楼 lr2131 的回复:

Quote: 引用 楼主 qq_24751415 的回复:

TXB0CONbits.TXREQ = 1; //置1,则开始发送
    while(TXB0CONbits.TXREQ);//等待其发送完毕,问题在于,如果总线上其他设备都已关闭,则会发送失败,在此处死循环

    问题如上,在此处,如果不添加后面一句,那么在下一次用发送缓冲区0时,就会无法发送。但如果添加上此句,那么我关闭上位机时,就会在此处死循环。

   我知道有错误中断,我自己试了几次,却各种不成功。
   
   后来使用__delay_ms函数,
while(1) {
 if (!TXB0CONbits.TXREQ) break;//发送完毕,退出
__delay_m(1);//延时1ms
 n++;
 if (n>=5) break;//超时,退出。
}
但是我有一个疑问,就是如果我使用这个函数,是否会影响到定时器中断,使之在此1ms中无法中断。


不会影响到定时器中断。
建议:
1.如果这个通信外设支持发送中断,那开启发送中断最好,然后配合发送中断的ISR,就不会那么浪费CPU了
2.这个通信外设不支持发送中断,因为你这里是1ms的延时,其实也不算短,可以的话,倒不如用OS。


OS是什么意思,抱歉,我是初入门。


OS:Operating system  也就是操作系统。你这里没有MMU的话,当然得用单片机的操作系统。

单片机的操作系统,建议你使用UCOS2或UCOS3的单片机操作系统。

你这里1ms的延时值刚好可以做UCOS2/3的系统心跳频率。
这样就不会把CPU浪费在delay上了

#5


用操作系统未免改动太大了。
这段程序如果不是在中断中而且延时程序也没有改变定时器设置的话,不会影响。没有其它实时要求的话不用大改了

#6


经过测试,确实不会。根据诸位的说法,delay比较浪费,我规避了它的使用,恩,其实主要是考虑到每次delay需要的时间其实并不一定,可能会让单片机跑起来更慢,