Example #1
0
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);
	}

}
Example #2
0
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;

}
Example #3
0
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);
}
Example #4
0
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;

}