To avoid the overhead of printf() I have created the following routine:
void write_0(unsigned char* c) { int cnt = 0; int len = strlen( c ); // Disable interrupts EA = 0 ; for ( cnt = 0; cnt < len; cnt++ ) { tx_buffer_0[ tx_write_0++ ] = c[ cnt ]; } //__for ( i = 0; i < len; i++ )__ EA = 1; // Prime buffer if ( sys_tx_0_ready ) { sys_tx_0_ready = 0; TI_0 = 1; } //__if ( sys_tx_0_ready )__ }
In my serial ISR I have the following:
void Serial_isr(void) interrupt 4 { // Handle port 0 tx if ( TI_0 ) { TI_0 = 0; if ( sys_tx_0_ready == 0 ) { SBUF0 = tx_buffer_0[ tx_read_0++ ]; if ( tx_write_0 == tx_read_0 ) sys_tx_0_ready = 1; }//__if ( sys_tx_0_ready == 0 )__ } //__if ( TI_0 )__ }
The code works, I was just wondering if anyone could suggest a better way of doing this.
Thanks.
Why call strlen() when you don't need to? You are scanning through the string anyway, so it would be trivial to break when you find the termination character.
One good thing with ring buffers is that you don't need to turn off the interrupts unless you have multiple writers.
http://www.keil.com/download/docs/200.asp