*data = cb->buffer[cb->tail]; cb->tail = (cb->tail + 1) & cb->mask; return 0;
INTERRUPT(_U1RXInterrupt, 6) while (U1STAbits.URXDA) c30_cbuf_put(&uart_rx, U1RXREG);
// ------------------------------------------------------------ // 3. ISR MACRO (fixes C30's verbose/error-prone vector syntax) // ------------------------------------------------------------ #define INTERRUPT(vector, priority) void ((interrupt, auto_psv)) _ ## vector (void)
IFS0bits.U1RXIF = 0;
// ------------------------------------------------------------ // 1. SAFE BANKING MACROS (avoid manual BANKED/FAR typos) // ------------------------------------------------------------ #define BANKED_NEAR ((near)) // Accessible without PSV #define BANKED_FAR attribute ((far)) // Any RAM, slower access #define Y_DATA_SPACE attribute ((space(ymemory))) // For DSP #define AUTO_PSV attribute ((space(auto_psv))) // const in program memory
// ------------------------------------------------------------ // 4. DSP FIXED-POINT UTILITY (C30 lacks saturating arithmetic) // ------------------------------------------------------------ #define Q15(x) ((int)((x) * 32768.0)) #define SATURATE_Q15(x) ( (x) > 32767 ? 32767 : ( (x) < -32768 ? -32768 : (x) ) )
// Example: MAC with saturation inline int mac_saturate(int acc, int a, int b) acc += a * b; if (acc > 32767) acc = 32767; if (acc < -32768) acc = -32768; return acc;
void init_uart_buffer(void) c30_cbuf_init(&uart_rx, uart_rx_buf, 64);