Mplab C30 Compiler [ EXCLUSIVE 2027 ]
cb->buffer[cb->head] = data; cb->head = next_head; return 0;
// Usage: INTERRUPT(_U1RXInterrupt, 6) /* code */
void init_uart_buffer(void) c30_cbuf_init(&uart_rx, uart_rx_buf, 64); mplab c30 compiler
*data = cb->buffer[cb->tail]; cb->tail = (cb->tail + 1) & cb->mask; return 0;
// ------------------------------------------------------------ // 3. ISR MACRO (fixes C30's verbose/error-prone vector syntax) // ------------------------------------------------------------ #define INTERRUPT(vector, priority) void ((interrupt, auto_psv)) _ ## vector (void) head] = data
#endif // C30_UTILS_H #include "c30_utils.h" // Force buffer into Y data space for faster DSP-style UART processing unsigned char Y_DATA_SPACE uart_rx_buf[64]; // 64 bytes, must be power of two c30_cbuf_t uart_rx;
// Example: declare a large array without banking mistakes #define LARGE_BUFFER(type, name, size) type BANKED_FAR name[size] head = next_head
// ------------------------------------------------------------ // 2. CIRCULAR BUFFER (with DMA/DSP-friendly alignment) // ------------------------------------------------------------ typedef struct volatile unsigned int head; volatile unsigned int tail; unsigned int mask; // size-1, must be power of two unsigned char Y_DATA_SPACE *buffer; // force Y-space for DSP unsigned int len; c30_cbuf_t;