当前位置: 代码迷 >> 单片机 >> _delay_ms函数会对影响到定时器中断么解决思路
  详细解决方案

_delay_ms函数会对影响到定时器中断么解决思路

热度:398   发布时间:2016-04-28 14:43:37.0
__delay_ms函数会对影响到定时器中断么
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中无法中断。
------解决思路----------------------
不会,
但保险起见你还是得看下_delay_ms的代码.
就像前一阵碰到的一个BSP, 到处都是设置systick去延时,也不考虑下OS的感受
------解决思路----------------------
引用:
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。
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

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上了
------解决思路----------------------
用操作系统未免改动太大了。
这段程序如果不是在中断中而且延时程序也没有改变定时器设置的话,不会影响。没有其它实时要求的话不用大改了
  相关解决方案