cc1310 运行tirtos,在串口接收中断里采用event_post不能唤醒任务
时间:12-23
整理:3721RD
点击:
cc1310 运行tirtos,在串口接收中断里采用event_post不能唤醒任务
/* uart 中断接收函数 */
static void uart_rx_callback(UART_Handle h, void *buf, size_t count){
Event_post(uart_event_handle, UART_RX_DATA_DONE_EVENT);
}
任务:
while(1){
events = Event_pend(uart_event_handle, 0,
UART_RX_DATA_DONE_EVENT | UART_TX_DATA_EVENT,
BIOS_WAIT_FOREVER);
}
我在资料上看到event_post不能再hwi里调用,不知道应该怎么解决。
你可以参照UART Echo示例代码。
另外,针对你的代码,可否贴出你对UART的初始化和callback函数的注册代码。
建议有信号量试一下。
这是我的uart的配置和callback,
我在
events = Event_pend(uart_event_handle, 0,
UART_RX_DATA_DONE_EVENT | UART_TX_DATA_EVENT,
10);
调用event_pend,如果是 BIOS_WAIT_FOREVER 这线程就不会被唤醒
/* ** uart_task.c ** */
/* XDCtools Header files */
#include <xdc/std.h>
#include <xdc/runtime/System.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/IHeap.h>
#include <xdc/runtime/Memory.h>
/* BIOS Header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include <ti/sysbios/knl/Semaphore.h>
#include <ti/sysbios/knl/Event.h>
#include <ti/sysbios/knl/Clock.h>
//#include <ti/sysbios/knl/Mailbox.h>
#include <ti/sysbios/knl/Queue.h>
#include <ti/sysbios/heaps/HeapBuf.h>
/* drivers */
#include "Board.h"
#include <ti/drivers/UART.h>
#include <ti/drivers/uart/UARTCC26XX.h>
/* std files */
#include <string.h>
/* task file */
#include "task/uart_task.h"
#include "task/task_config.h"
/* protocol */
#include "protocol/protocol.h"
/* base file*/
#include "base/error_code.h"
#include "base/type.h"
#include "base/const.h"
#include "struct.h"
#include "event_id.h"
/* logger */
#include "logger/logger.h"
/* task */
static Task_Struct uart_task_struct;
static mm_uint8 uart_task_stack[UART_TASK_STACK_SIZE];
/* handle */
static UART_Handle uart_handle;
/*事件*/
Event_Handle uart_event_handle = 0;
static Event_Struct uart_event_stru;
/* 串口的中断接收缓冲 1Byte */
//static mm_uint8 uart_rx_tmp_buffer[32];
static mm_buffer_item* uart_rx_buffer_item;
static mm_buffer_item* uart_tx_buffer_item;
/* uart 接收发送队列 */
static Queue_Struct uart_rx_queue_stru;
Queue_Handle uart_rx_queue_handle;
static Queue_Struct uart_tx_queue_stru;
Queue_Handle uart_tx_queue_handle;
/* 接收缓冲区 */
#define HEAP_BUFFER_COUNT 1
static mm_buffer_item uart_rx_heap_buffer[UART_HEAP_BUFFER_COUNT];
static HeapBuf_Struct uart_rx_heap_buf_stru;
static HeapBuf_Handle uart_rx_heap_buf_handle;
IHeap_Handle uart_rx_heap_handle;
static mm_buffer_item uart_tx_heap_buffer[UART_HEAP_BUFFER_COUNT];
static HeapBuf_Struct uart_tx_heap_buf_stru;
static HeapBuf_Handle uart_tx_heap_buf_handle;
IHeap_Handle uart_tx_heap_handle;
/* 事件 */
extern Event_Handle service_event_handle;
static mm_bool is_running = mm_true;
/* uart 中断接收函数 */
static void uart_rx_callback(UART_Handle h, void *buf, size_t count){
/*
if(uart_rx_buffer_item->data.lenght < BUFFER_MAX_SIZE-1){
//uart_rx_buffer_item->data.payload[uart_rx_buffer_item->data.lenght++] = ((mm_uint8 *)buf)[0];
memcpy(&uart_rx_buffer_item->data.payload[uart_rx_buffer_item->data.lenght],
(mm_uint8 *)buf, count);
uart_rx_buffer_item->data.lenght += count;
}
else
uart_rx_buffer_item->data.lenght = 0;
*/
uart_rx_buffer_item->data.lenght += count;
if(check_uart_protocol_valid(uart_rx_buffer_item->data.payload,
&uart_rx_buffer_item->data.lenght) == MM_ERR_OK){
Event_post(uart_event_handle, UART_RX_DATA_DONE_EVENT);
}
else {
if(uart_rx_buffer_item->data.lenght >= sizeof(uart_rx_buffer_item->data.payload)){
UART_read(uart_handle, uart_rx_buffer_item->data.payload,
sizeof(uart_rx_buffer_item->data.payload));
uart_rx_buffer_item->data.lenght = 0;
}
else{
UART_read(uart_handle, uart_rx_buffer_item->data.payload + uart_rx_buffer_item->data.lenght,
sizeof(uart_rx_buffer_item->data.payload) - uart_rx_buffer_item->data.lenght);
}
}
}
/* uart收发线程 */
static void uart_task(UArg arg0, UArg arg1){
mm_uint32 events = 0;
Task_Stat statbuf;
LOG_D("uart_task start\n");
/* 初始化串口 */
System_printf("start init uart\n");
UART_Params uart_params;
UART_Params_init(&uart_params);
uart_params.readMode = UART_MODE_CALLBACK;
uart_params.writeMode = UART_MODE_BLOCKING;
uart_params.readCallback = uart_rx_callback;
uart_params.writeCallback = 0;
uart_params.readReturnMode = UART_RETURN_FULL;
uart_params.readDataMode = UART_DATA_BINARY;
uart_params.writeDataMode = UART_DATA_BINARY;
uart_params.readEcho = UART_ECHO_OFF;
uart_params.baudRate = UART_BAUD;
uart_params.dataLength = UART_LEN_8;
uart_params.stopBits = UART_STOP_ONE;
uart_params.parityType = UART_PAR_NONE;
uart_handle = UART_open(Board_UART0, &uart_params);
if(uart_handle == NULL)
LOG_E("Error opening the UART");
UART_control(uart_handle, UARTCC26XX_CMD_RETURN_PARTIAL_ENABLE, NULL);
uart_rx_buffer_item = Memory_alloc(uart_rx_heap_handle, sizeof(mm_buffer), 0, NULL);
if(!uart_rx_buffer_item){
LOG_E("Memory_alloc Failed");
}
uart_rx_buffer_item->data.lenght = 0;
UART_read(uart_handle, uart_rx_buffer_item->data.payload,
sizeof(uart_rx_buffer_item->data.payload));
while(is_running){
Task_stat(Task_self(), &statbuf);
if (statbuf.used > (statbuf.stackSize * 9 / 10)){
LOG_D("uart_task Over 90%% of task's stack is in use = %d, size = %d\n", statbuf.used, statbuf.stackSize);
}
events = Event_pend(uart_event_handle, 0,
UART_RX_DATA_DONE_EVENT | UART_TX_DATA_EVENT,
10); // BIOS_WAIT_FOREVER
/* 接收串口数据*/
if(events & UART_RX_DATA_DONE_EVENT){
LOG_MD(uart_rx_buffer_item->data.payload, uart_rx_buffer_item->data.lenght,
"uart rx ok, lenght=%d, msg=\n", uart_rx_buffer_item->data.lenght);
Queue_enqueue(uart_rx_queue_handle, &uart_rx_buffer_item->_elem);
uart_rx_buffer_item = NULL;
Event_post(uart_event_handle, UART_RX_DATA_EVENT);
Event_post(service_event_handle, SERVICE_EVENT_UART_DATA_TX_RX);
uart_rx_buffer_item = Memory_alloc(uart_rx_heap_handle, sizeof(mm_buffer), 0, NULL);
if(!uart_rx_buffer_item){
LOG_E("Memory_alloc Failed");
}
uart_rx_buffer_item->data.lenght = 0;
UART_read(uart_handle, uart_rx_buffer_item->data.payload,
sizeof(uart_rx_buffer_item->data.payload));
}
/* 发送数据 */
if(events & UART_TX_DATA_EVENT){
while(Queue_empty(uart_tx_queue_handle) != TRUE){
uart_tx_buffer_item = Queue_dequeue(uart_tx_queue_handle);
if(uart_tx_buffer_item){
UART_write(uart_handle, uart_tx_buffer_item->data.payload, uart_tx_buffer_item->data.lenght);
LOG_MD(uart_tx_buffer_item->data.payload, uart_tx_buffer_item->data.lenght,
"uart tx ok, lenght=%d, msg=\n", uart_tx_buffer_item->data.lenght);
Memory_free(uart_tx_heap_handle, uart_tx_buffer_item, sizeof(mm_buffer_item));
uart_tx_buffer_item = NULL;
if(service_event_handle){ // 发送事件
Event_post(service_event_handle, SERVICE_EVENT_UART_DATA_TX_RX);
}
}
}
}
}
}
void init_uart_task(void){
/* 初始化 uart_task */
Error_Block eb;
Task_Params task_params;
/* 初始化 err */
Error_init(&eb);
/* 初始化事件 */
Event_Params event_param;
Event_Params_init(&event_param);
Event_construct(&uart_event_stru, &event_param);
uart_event_handle = Event_handle(&uart_event_stru);
/* 初始化消息队列 */
Queue_Params queue_params;
Queue_Params_init(&queue_params);
Queue_construct(&uart_rx_queue_stru, &queue_params);
uart_rx_queue_handle = Queue_handle(&uart_rx_queue_stru);
Queue_construct(&uart_tx_queue_stru, &queue_params);
uart_tx_queue_handle = Queue_handle(&uart_tx_queue_stru);
/* 初始化内存heap */
HeapBuf_Params heap_buf_params;
HeapBuf_Params_init(&heap_buf_params);
heap_buf_params.blockSize = sizeof(mm_buffer_item);
heap_buf_params.numBlocks = UART_HEAP_BUFFER_COUNT;
heap_buf_params.align = 4;
heap_buf_params.buf = uart_rx_heap_buffer;
heap_buf_params.bufSize = sizeof(uart_rx_heap_buffer);
HeapBuf_construct(&uart_rx_heap_buf_stru, &heap_buf_params, NULL);
uart_rx_heap_buf_handle = HeapBuf_handle(&uart_rx_heap_buf_stru);
uart_rx_heap_handle = HeapBuf_Handle_upCast(uart_rx_heap_buf_handle);
HeapBuf_Params_init(&heap_buf_params);
heap_buf_params.blockSize = sizeof(mm_buffer_item);
heap_buf_params.numBlocks = UART_HEAP_BUFFER_COUNT;
heap_buf_params.align = 4;
heap_buf_params.buf = uart_tx_heap_buffer;
heap_buf_params.bufSize = sizeof(uart_tx_heap_buffer);
HeapBuf_construct(&uart_tx_heap_buf_stru, &heap_buf_params, NULL);
uart_tx_heap_buf_handle = HeapBuf_handle(&uart_tx_heap_buf_stru);
uart_tx_heap_handle = HeapBuf_Handle_upCast(uart_tx_heap_buf_handle);
Task_Params_init(&task_params);
task_params.stackSize = sizeof(uart_task_stack);
task_params.stack = &uart_task_stack;
task_params.priority = UART_TASK_PRIORITY;
Task_construct(&uart_task_struct, (Task_FuncPtr)uart_task, &task_params, &eb);
}
void stop_uart_task(void){
is_running = mm_false;
}
