This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/LAUNCHXL-CC2650:TI-RTOS UART 驱动程序和回调

Guru**** 2589245 points
Other Parts Discussed in Thread: LAUNCHXL-CC2650

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/601115/rtos-launchxl-cc2650-ti-rtos-uart-drivers-and-callbacks

器件型号:LAUNCHXL-CC2650

工具/软件:TI-RTOS

您好!

我将 LAUNCHXL-CC2650 v1.1与 CCS v6.2搭配使用。

我打开了 uartecho.c 示例并尝试操作 UART 驱动程序、但我有一个问题、我不知道何时在回调模式下使用它。 我在文档中看到调用 UART_READ 函数时,就像这样:  

UART_READ (UART、TAB、1); 

我应该在收到的每个 char 上都有回调、但我没有回调、在收到了大量 char (几个 dizaines)后我有回调、在回调后我必须重置、应用程序崩溃。 在这里,我的代码是简单地根据 UART echo 示例进行调整的:

/*
=== uartecho.c ====
//

//* XDCtools 头文件*/
#include 
#include 


/* BIOS 头文件*/
#include 
#include 

/* TI-RTOS 头文件*/
#include 
#include 

/*示例/板头文件*/
#include "Board.h"

#include 

#define TASKSTACKSIZE 768

Task_Structt task0Struct;
Char task0Stack[TASKSTACKSIZE];

// PIN_Config 表的全局存储器存储*/
static PIN_STATE ledPinState;

//
*应用 LED 引脚配置表:
*-所有 LED 板 LED 均关闭。
*/
PIN_Config ledPinTable[]={
BOARD_LED1 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、
BOARD_LED2 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、
PIN_Terminate
};

char tab[5];

UART_Handle UART;
UART_Params uartParams;


静态空 UART_ReadCallback (UART_Handle handle、void * rxBuf、size_t size)
{

UART_write (UART、"callback\n"r、10);

}


/*
== 回声 Fxn =====
*此函数的任务是静态创建的。 请参阅工程的.cfg 文件。
//
void echoFxn (UArg0、UArg0 arg1)
{
// char 输入;

const char echoPrompt[]="\fEchoing Characters:\r\n";

/*创建一个数据处理关闭的 UART。 *
UART_PARAMS_INIT (uartParams);
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readMode = UART_MODE_CALLACK;
uartParams.readReturnMode = UART_return_full;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudrate = 115200;
uartParams.readCallback=UART_ReadCallback;
UART = UART_OPEN (Board_UART0、uartParams);


if (UART == NULL){
System_abort ("打开 UART 时出错");
}

UART_WRITE (UART、echoPrompt、sizeof (echoPrompt));

/*循环永久回显*/
while (1){
// UART_Read (UART、INPUT、1);
UART_READ (UART、TAB、1);


// UART_WRITE (UART、INPUT、1);
}
}

/*
=== main ====
*/
int main (void)
{
pin_handle ledPinHandle;
Task_Params taskParams;

/*呼叫板初始化函数*/
Board_initGeneral();
Board_initUART();

/*构造 BIOS 对象*/
Task_Params_init (&taskParams);
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =_task0Stack;
Task_construct(&task0Struct,(Task_FuncPtr) echoFxn、&taskParams、NULL);

/*打开 LED 引脚*/
ledPinHandle = PIN_OPEN (&ledPinState、ledPinTable);
if (!ledPinHandle){
System_abort ("初始化板 LED 引脚时出错");
}

PIN_setOutputValue (ledPinHandle、Board_LED1、1);

/*此示例启用了日志记录和许多其他调试功能*/
system_printf ("此示例不会尝试将代码或数据最小化"
"封装\n");
system_flush();

System_printf ("启动 UART 回显示例\n 系统提供程序设置为"
"SysMin。 停止目标以查看"
"ROV.\n");
/* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/
system_flush();

/*启动 BIOS */
BIOS_start();

返回(0);
} 

我的回调函数错过了什么?

此致、

John

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 John:

    我有几个问题要问您:

    您能否提供 UART 线的逻辑跟踪?
    2.当您说设备崩溃时,您的意思是什么? 您能否使用 RTOS 对象视图来检查堆栈大小、以确保它们不会溢出?
    您使用了哪些 UART 文档作为指南? 有2个 UART API 指南:UART.h 和 UARTCC26xx.h 它们都可以在以下位置找到: software-dl.ti.com/.../index.html

    由于任务/堆栈大小问题、UART.h API 指南建议您不要在回调函数中使用 UART_READ 和 UART_WRITE。 如果 RTOS 对象视图显示堆栈溢出会导致器件崩溃、我建议使用 GPIO 切换来检查回调何时发生。 调试回调 fxn 后、您可以通过检查回调 fxn 设置的标志在回显 fxn 中执行 UART_WRITE。

    UARTCC26xx.h API 指南提供了一个示例 UART 回调函数。 但是、该示例在回调函数中使用 UART_READ 和 UART_WRITE。 如果您的器件未因任务/系统堆栈问题而崩溃、此示例可能有助于您的实现。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、RachelP、

    感谢您的回答允许我解决问题、但如果可以帮助他人、我将回答所有问题。

    UART 线路上的逻辑跟踪是对的、我没有看到任何错误、我可以看到其中的字符、因此逻辑工作正常。

    2.我是说任务在 RTOS 视图对象上变为"被阻止"。 我检查了溢出、峰值大约为300、我甚至尝试将堆栈大小增加到1024、但结果相同。

    3.我使用了 TI-RTOS2.2 USER_guide (起始页79),但您链接到我的文档更好。  

    即使堆栈大小似乎没有达到最大值,我们也无法在回调中使用 UART_write(),在第一次回调时任务也会被阻止。 我在回调中使用了二进制信号量来使 UART_write()。

    这是一个有用的东西、当我有 UART_READ (UART、rxBuff、1)时、只有当 UART 缓冲区已满(16位)时才有16个回调启动器、因此如果您发送15个字符、您没有回调、如果您启动16个字符、则有16个回调。  

    为了确保这一点、我使用 的是 UART_READ (UART、rxBuff、16)。 我只有一个回调/16个字符。

    祝你度过美好的一天!

    John