void csp_buffer_free_isr(void *packet) { CSP_BASE_TYPE task_woken = 0; if (!packet) return; csp_skbf_t * buf = packet - sizeof(csp_skbf_t); if (((uintptr_t) buf % CSP_BUFFER_ALIGN) > 0) { //csp_log_error("FREE: Unaligned CSP buffer pointer %p\r\n", packet); return; } if (buf->skbf_addr != buf) { //csp_log_error("FREE ISR: Invalid CSP buffer pointer %p\r\n", packet); return; } if (buf->refcount == 0) { //csp_log_error("FREE ISR: Buffer already free %p\r\n", buf); return; } else if (buf->refcount > 1) { buf->refcount--; //csp_log_error("FREE ISR: Buffer %p in use by %u users\r\n", buf, buf->refcount); return; } else { buf->refcount = 0; //csp_log_buffer("FREE: %p\r\n", buf); csp_queue_enqueue_isr(csp_buffers, &buf, &task_woken); } }
int csp_route_enqueue(csp_queue_handle_t handle, void * value, uint32_t timeout, CSP_BASE_TYPE * pxTaskWoken) { int result; if (pxTaskWoken == NULL) result = csp_queue_enqueue(handle, value, timeout); else result = csp_queue_enqueue_isr(handle, value, pxTaskWoken); #ifdef CSP_USE_QOS static int event = 0; if (result == CSP_QUEUE_OK) { if (pxTaskWoken == NULL) csp_queue_enqueue(router_input_event, &event, 0); else csp_queue_enqueue_isr(router_input_event, &event, pxTaskWoken); } #endif return (result == CSP_QUEUE_OK) ? CSP_ERR_NONE : CSP_ERR_NOBUFS; }
void csp_buffer_free_isr(void *packet) { CSP_BASE_TYPE task_woken = 0; if (!packet) return; csp_queue_enqueue_isr(csp_buffers, &packet, &task_woken); }
int csp_rx_callback(can_frame_t *frame, CSP_BASE_TYPE *task_woken) { int ret = csp_queue_enqueue_isr(can_rx_queue, frame, task_woken); return ret == CSP_QUEUE_OK ? CSP_ERR_NONE : CSP_ERR_NOMEM; }