Other Parts Discussed in Thread: SYSBIOS
/* Standard Include Files. */
#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
/* BIOS/XDC Include Files. */
#include <xdc/std.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include <ti/sysbios/knl/Semaphore.h>
/* mmWave SDK Include Files: */
#include <ti/drivers/pinmux/pinmux.h>
#include <ti/drivers/uart/UART.h>
#include <ti/utils/testlogger/logger.h>
/**************************************************************************
*************************** Global Definitions ***************************
**************************************************************************/
/* Global Variable which holds the CPU Clock Frequency */
uint32_t gCPUClockFrequency = (200 * 1000000);
/* Global Variable which holds the DMA Instance */
DMA_Handle gDMAHandle;
/* MAX Data Pattern Test Size for the Data Tests: */
#define MAX_TEST_BUFFER_SIZE 128
Int myHookSetId, myHookSetId2; // Hook functions params
/* Hook function
* */
/* HookSet functions */
/* ======== myRegister ========
* invoked during Swi module startup before main()
* for each HookSet */
Void myRegister(Int hookSetId)
{
printf("myRegister: assigned HookSet Id = %d\n", hookSetId);
myHookSetId = hookSetId;
}
/* ======== myCreate ========
* invoked during Task_create for dynamically
* created Tasks */
Void myCreate(Task_Handle task, Error_Block *eb)
{
String name;
Ptr pEnv;
name = Task_Handle_name(task);
pEnv = Task_getHookContext(task, myHookSetId);
printf("myCreate: task name = '%s', pEnv = 0x%x\n", name, pEnv);
Task_setHookContext(task, myHookSetId, (Ptr)0xdead);
}
/* ======== myReady ========
* invoked when Task is made ready to run */
Void myReady(Task_Handle task)
{
String name;
Ptr pEnv;
name = Task_Handle_name(task);
pEnv = Task_getHookContext(task, myHookSetId);
printf("myReady: task name = '%s', pEnv = 0x%x\n", name, pEnv);
Task_setHookContext(task, myHookSetId, (Ptr)0xc0de);
}
/* ======== mySwitch ========
* invoked whenever a Task switch occurs/is made ready to run */
Void mySwitch(Task_Handle prev, Task_Handle next)
{
String prevName;
String nextName;
Ptr pPrevEnv;
Ptr pNextEnv;
if (prev == NULL) {
printf("mySwitch: ignoring dummy 1st prev Task\n");
}
else {
prevName = Task_Handle_name(prev);
pPrevEnv = Task_getHookContext(prev, myHookSetId);
printf("mySwitch: prev name = '%s', pPrevEnv = 0x%x\n",
prevName, pPrevEnv);
Task_setHookContext(prev, myHookSetId, (Ptr)0xcafec0de);
}
nextName = Task_Handle_name(next);
pNextEnv = Task_getHookContext(next, myHookSetId);
printf(" next name = '%s', pNextEnv = 0x%x\n",
nextName, pNextEnv);
Task_setHookContext(next, myHookSetId, (Ptr)0xc001c0de);
}
/* ======== myExit ========
* invoked whenever a Task calls Task_exit() or falls through
* the bottom of its task function. */
Void myExit(Task_Handle task)
{
Task_Handle curTask = task;
String name;
Ptr pEnv;
name = Task_Handle_name(curTask);
pEnv = Task_getHookContext(curTask, myHookSetId);
printf("myExit: curTask name = '%s', pEnv = 0x%x\n", name, pEnv);
Task_setHookContext(curTask, myHookSetId, (Ptr)0xdeadbeef);
}
/* ======== myDelete ========
* invoked upon Task deletion */
Void myDelete(Task_Handle task)
{
String name;
Ptr pEnv;
name = Task_Handle_name(task);
pEnv = Task_getHookContext(task, myHookSetId);
printf("myDelete: task name = '%s', pEnv = 0x%x\n", name, pEnv);
}
/**
* @b Description
* @n
* Test Task: This sends out the data on the UART
*
* @retval
* Not Applicable.
*/
void Test_nonLoopbackMode(UArg arg0, UArg arg1)
{
UART_Params params;
UART_Handle uartHandle;
uint32_t baudRate = 115200;
int32_t status;
char messageString[MAX_TEST_BUFFER_SIZE];
uint8_t rxMessageString[MAX_TEST_BUFFER_SIZE];
uint8_t TxMessageString[MAX_TEST_BUFFER_SIZE];
uint8_t *TxMessageAdd = &TxMessageString[0];
// char delimitter[] = " \r\n";
// char* ptrCLICommand;
// int32_t numBytes;
/* Debug Message: */
printf("*************************************************************************\n");
printf("Debug: UART NON-Loopback Mode Tests starting [Baud Rate: %d]\n", baudRate);
printf("Please Ensure that console applications are running on the UART Ports\n");
printf("*************************************************************************\n");
/* Setup the default UART Parameters */
UART_Params_init(¶ms);
params.clockFrequency = gCPUClockFrequency;
params.baudRate = baudRate;
params.isPinMuxDone = 1;
params.readEcho = UART_ECHO_OFF; // 不返回
/* Open the UART Instance */
uartHandle = UART_open(0, ¶ms);
if (uartHandle == NULL)
{
printf("Error: Unable to open the UART Instance 0\n");
// MCPI_setFeatureTestResult ("UART Non Loopback", MCPI_TestResult_FAIL);
return;
}
/****************************************************************************
* Sanity Check: UART-1 is capable of receiving/transmitting the data
* TEST: Blocking Mode
****************************************************************************/
{
while(1){
/* Read the response back: */
memset ((void *)&rxMessageString[0], 0, sizeof(rxMessageString));
// status = UART_read(uartHandle, (uint8_t*)&rxMessageString[0], strlen(messageString)+1);
status = UART_read(uartHandle, (uint8_t*)&rxMessageString[0], sizeof(rxMessageString)-1);
printf ("Debug: Got %d bytes '%s'\n", status, rxMessageString);
TxMessageAdd = &rxMessageString[0];
UART_writePolling(uartHandle, TxMessageAdd, 5);
printf ("Debug: End write ");
}
}
/* Clean up:*/
UART_close(uartHandle);
/* Exit BIOS: All the tests are completed */
BIOS_exit(0);
return;
}
/**
* @b Description
* @n
* System Initialization Task which initializes the various
* components in the system.
*
* @retval
* Not Applicable.
*/
static void Test_initTask(UArg arg0, UArg arg1)
{
Task_Params taskParams;
DMA_Params dmaParams;
int32_t errCode;
/* Initialize the UART */
UART_init();
/* Initialize the DMA */
DMA_init ();
/* Open the DMA Instance */
DMA_Params_init(&dmaParams);
gDMAHandle = DMA_open(0, &dmaParams, &errCode);
if (gDMAHandle == NULL)
{
printf ("Error: Unable to open the DMA Instance [Error code %d]\n", errCode);
return;
}
/* Setup the PINMUX to bring out the MSS UART-1 */
Pinmux_Set_FuncSel(SOC_XWR18XX_PINN5_PADBE, SOC_XWR18XX_PINN5_PADBE_MSS_UARTA_TX);
Pinmux_Set_OverrideCtrl(SOC_XWR18XX_PINN5_PADBE, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);
Pinmux_Set_FuncSel(SOC_XWR18XX_PINN4_PADBD, SOC_XWR18XX_PINN4_PADBD_MSS_UARTA_RX);
Pinmux_Set_OverrideCtrl(SOC_XWR18XX_PINN4_PADBD, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);
/* Setup the PINMUX to bring out the MSS UART-3 */
Pinmux_Set_OverrideCtrl(SOC_XWR18XX_PINF14_PADAJ, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);
Pinmux_Set_FuncSel(SOC_XWR18XX_PINF14_PADAJ, SOC_XWR18XX_PINF14_PADAJ_MSS_UARTB_TX);
/* Launch the NON-Loopback Tests */
Task_Params_init(&taskParams);
taskParams.stackSize = 4*1024;
taskParams.priority = 1;
taskParams.instance->name = "Test_nonLoopbackMode_task";
Task_create(Test_nonLoopbackMode, &taskParams, NULL);
return;
}
/*
* ======== main ========
*/
Int main()
{
Task_Handle task;
Error_Block eb;
Task_Params taskParams;
printf("enter main()\n");
Error_init(&eb);
Task_Params_init(&taskParams);
taskParams.instance->name = "Test_initTask";
task = Task_create(Test_initTask, &taskParams, &eb);
if (task == NULL) {
printf("Test_initTask() failed!\n");
BIOS_exit(0);
}
BIOS_start(); /* does not return */
return(0);
}
以上是写的测试代码,目的是为了测试串口的收发任务,其中串口读函数使用的UART_read,如果按照代码所描述的添加了一系列Hook函数进行Task的监控就会出现下列报错信息:
“ti.sysbios.gates.GateMutex: line 99: assertion failure: A_badContext: bad calling context. See GateMutex API doc for details. xdc.runtime.Error.raise: terminating execution”;
测试发现就是在执行UART_read时出现的这个Bug,如果我将Hook函数给注释掉不再执行,那么整个代码就可以正常运行不报错。
此外还发现如果将UART_read改成UART_readPolling,那么在使用Hook函数的情况下代码也可以正常运行。
那么请问在使用UART_read且应用Hook函数时,那个报错是如何产生的?又该怎么解决这个问题呢?