TI大神,您好!
使用TI15.4 collector例程进行串口数据传输时出现,MAIN_ASSERT_HWI_TIRTOS错误。
硬件情况:
采用TI官方LAUNCHXL_PAD,能够正确执行uartecho例程。
软件配置:
(与uartecho例程相同,默认阻塞方式)
uartParams.baudRate = 115200;uartParams.writeDataMode = UART_DATA_BINARY;uartParams.readDataMode = UART_DATA_BINARY;uartParams.readReturnMode = UART_RETURN_FULL;uartParams.readEcho = UART_ECHO_OFF;
在执行
UART_read(uartHandle, &input, 1)
中报错
单步进入 UARTCC26XX_read,执行:
/* Pend on semaphore and wait for Hwi to finish. */if (SemaphoreP_OK != SemaphoreP_pend(&(object->readSem),object->readTimeout)) {
后进入
ti_sysbios_knl_Semaphore_pend__E:
1001a000: E92D41F0 push.w {r4, r5, r6, r7, r8, lr}
1001a004: 460E mov r6, r1
进入:
ti_sysbios_knl_Task_blockI__E
后就出现上述错误。
请TI大神指导!!!
Alvin Chen:
首先你要注释掉预编译的display uart 那个选项,如图像lcd display 那样打个x让他不能生效。
Alvin Chen:
回复 Alvin Chen:
其次建议用callback的模式去做。
user5153918:
回复 Alvin Chen:
更改成callback模式后,可以正常写,但是读还是同样的问题。
Alvin Chen:
回复 user5153918:
void Uart_WriteCallback(UART_Handle handle, void *txBuf, size_t size); void Uart_ReadCallback(UART_Handle handle, void *rxBuf, size_t size);void Uart_ReadCallback(UART_Handle handle, void *rxBuf, size_t size) {UART_read(handle, Uart_RxTempBuf, 200);}void Uart_WriteCallback(UART_Handle handle, void *txBuf, size_t size) {}void HwUARTInit(void) {UART_init();UART_Params_init(&UARTparams);UARTparams.baudRate = 115200;UARTparams.dataLength = UART_LEN_8;UARTparams.stopBits = UART_STOP_ONE;UARTparams.readDataMode = UART_DATA_BINARY;UARTparams.writeDataMode = UART_DATA_TEXT;UARTparams.readMode = UART_MODE_CALLBACK;UARTparams.writeMode = UART_MODE_CALLBACK;UARTparams.readEcho = UART_ECHO_OFF;UARTparams.readReturnMode = UART_RETURN_NEWLINE;UARTparams.readCallback = Uart_ReadCallback;UARTparams.writeCallback = Uart_WriteCallback;UARTHandle = UART_open(Board_UART0, &UARTparams);UART_control(UARTHandle, UARTCC26XX_RETURN_PARTIAL_ENABLE,NULL);}参考一下上面的程序
user5153918:
回复 Alvin Chen:
已经注释掉-DxBOARD_DISPLAY_USE_UART,但是问题依旧,阻塞和callback模式都会报错,问题应该不是这,还有没有其他的可能性?
Alvin Chen:
回复 user5153918:
你怎么改的?你可以把我贴的程序把HwUARTInit放在你的collector初始化即可。
user5153918:
回复 Alvin Chen:
我分析了一下代码,这个问题是否和macTask有关系?我看Collector任务初始化中要向macTask注册一些信息。
user5153918:
回复 Alvin Chen:
我另外起了个任务。。。。
Alvin Chen:
回复 user5153918:
这可能是task 抢占的问题,如果不是必要请采纳我的建议在collector这个task里面使用
user4203015:
回复 Alvin Chen:
UART_read(UART_Handle handle, void *buffer, size_t size)的注释中有这句话
* @warning Do not call %UART_read() from its own callback function when in * #UART_MODE_CALLBACK.
意思是不要在自己的回调函数中使用UART_read吗?