工具/软件:TI-RTOS
支持路径:/工具与软件/帮助我解决问题/嵌入式产品软件工具/RTOS/
大家好、
我正在尝试使用 MSP432 1.40.00.28 SDK 在 TI-RTOS 中运行两个 UART 端口。
其中一个被 Display_printf()使用,另一个被连接到一个外部 UART 上,该 UART 连接到 FTDI USB 的 TX 和 RX 以串行方式,我使用 PC 中的串行终端发送和接收命令。 我能够在两个端口上输出。
接下来、我需要执行 UART_Read。 当接收到字符时、我在 UART 读取回调函数中执行 Semaphore_post 操作。
void UART_read_callback (UART_Handle handle、void * buffer、size_t num) { Semaphore_post (uart3gSemHandle); }
然后在 UART 解析函数中完成 Semaphore_pend 函数,如果 Semaphore_pend 成功,它将知道有 UART 数据要接收,因此执行 UART_read。 在读取它时、我让它通过写操作将它回传到我的终端、这样我就知道它是被读取的。
void * Uart3gParserTask (void * arg0) { const char testString[]="Testing\r\n"; int16 uart3gReturn=0; /*创建 UART 实例*/ UART_PARAMS_INIT (uart3gParams); uart3gParams.writeMode = UART_MODE_CALLBACK; uart3gParams.readMode = UART_MODE_CALLACK; uart3gParams.writeDataMode = UART_DATA_BINARY; uart3gParams.readDataMode = UART_DATA_BINARY; uart3gParams.readCallback = UART_READ_CALLBACK; uart3gParams.writeCallback = UART_Write_Callback; uart3gParams.readReturnMode = UART_return_full; uart3gParams.readEcho = UART_ECHO_OFF; uart3gParams.baudrate = 115200; uart3g = UART_open (Board_UART1、&uart3gParams);// UART1为 eusciA2 Semaphore_Params_init (uart3gSemParams); uart3gSemParams.mode = ti_SysBIOS_KNL_Semaphore_Mode_binary; uart3gSemParams.instance->name ="OurSem3g"; Semaphore_struction (&uart3gSemStruct, 1,&uart3gSemParams); uart3gSemHandle = Semaphore_handle (&uart3gSemStruct); if (uart3g ==空) { Display_printf (myDisplay、0、0、"错误- UART 未打开\r\n); } UART_WRITE (uart3g、testString、sizeof (testString)); //仅用于测试 while (1) { //在这里挂起一个信号量。 这将阻止 while 环路并让其他任务运行、直到在 UART 读取回调中发布信标 int semCount = Semaphore_getCount (uart3gSemHandle); Semaphore_pend (uart3gSemHandle、BIOS_WAIT_FOREVE); semCount = Semaphore_getCount (uart3gSemHandle); uart3gReturn = UART_Read (uart3g,&uart3gRxChar,7); GPIO_TOGGLE (Board_GPIO_LED1); UART_WRITE (uart3g、&uart3gRxChar、sizeof (uart3gRxChar)); usleep(10); } }
1) 在 while (1)循环中、Semaphore_getCount 在 Semaphore_pend 前返回1。 在经过信标挂起后、它为0。 这就是要发生的事情。 但是、下次它绕过 while 循环时、即使 Semaphore_getCount 为0、它也会超过 Semaphore_pend。 这是非常令人困惑的、因为信标在信标被发布之前不会超过这个点。 在这种情况下、通过 UART 读取回调函数。 更令人困惑的是信标是第一次发生的、即使没有 UART_READ_CALLACK 函数触发一次、即使自程序启动以来、UART_READ_CALLACK 也是完成 Semaphore_POST 的唯一位置。 我使用断点在 Semaphore_Pend 前后检查 semCount 来观察这种现象。
2) 2) 我遇到的另一个问题是、如果我删除断点、它将向我的终端打印几个字符并跳转到 Hwi 异常处理程序。 在这里、它卡在连续环路中。 当然、我没有处理该异常、但为什么会发生这种情况、我无法理解。
void Hwi_exHandler (UINT * exstack、UINT LR)
{
Hwi_module->exACTIVe[0]= true;
/*如果没有插入异常处理程序,请在此处旋转*/
while (Hwi_excHandlerFunc == NULL ){
;
}
Hwi_exHandlerFunc (exstack、LR);
}
我想我应该附加一个 ROV 的屏幕截图、ROV 在 Hwi 异常处理程序的连续循环中卡住后被捕获、因为它可能很有用。 我对 TI-RTOS 非常陌生、因此仍处于早期阶段。 是否有人能够帮助我解决这两个问题? 如果我可以提供任何其他信息、请告诉我。 提前感谢您。
此致、
Guyan
