马老师,问您一个问题?我认为这样的代码可能会出现问题.
您的文章连接:http://www.ouravr.com/machao_rs232_sample.html下面是您原来的代码:
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0;
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
#pragma used-
#endif
个人认为应该调整关中断的位置,因为中断运行的不确定性.我觉得应该这样,您认为了?
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0);
#asm("cli")
data=rx_buffer0;
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
//#asm("cli") 这行改到上面去
--rx_counter0;
#asm("sei")
return data;
}
#pragma used-
#endif 在这段程序中,改变rx_counter0需要关中断,因为在中断服务中要改变该变量的。其它的如rx_rd_index0以及rx_rd_buffer0的值在中断服务中不会改变,所以不需要关中断。因此,不需要改动。
关中断的时间越短越好,使系统尽快的响应中断。 谢谢马老师回答,我仔细看了一下确实如此.
页:
[1]