zjybest 发表于 2007-4-24 16:03:47

马老师,问您一个问题?我认为这样的代码可能会出现问题.

您的文章连接: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

machao 发表于 2007-4-24 18:05:52

在这段程序中,改变rx_counter0需要关中断,因为在中断服务中要改变该变量的。其它的如rx_rd_index0以及rx_rd_buffer0的值在中断服务中不会改变,所以不需要关中断。因此,不需要改动。



关中断的时间越短越好,使系统尽快的响应中断。

zjybest 发表于 2007-4-29 21:03:04

谢谢马老师回答,我仔细看了一下确实如此.
页: [1]
查看完整版本: 马老师,问您一个问题?我认为这样的代码可能会出现问题.