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.

[参考译文] CCS/MSP432-RTOS:TI-RTOS 内的 UART 回波未按预期工作

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/936876/ccs-msp432-rtos-uart-echo-within-ti-rtos-not-behaving-as-expected

器件型号:MSP432-RTOS

工具/软件:Code Composer Studio

您好!  

我构建了一个程序、尝试在 TI-RTOS 内开发读取 UART 数据和发送 UART 数据的程序。  

我已经运行了 uartecho.c 演示、它运行良好、但是当我尝试将此代码放入当前的 TI-ROTS 程序时、我发送的每个字符都会返回 FF 或 FE。 某些字符返回 FF FF FE。 我不能找出这种行为的原因。  

下面是主线程的代码、uarty 初始化和回波所在的空闲函数。 (我在一项任务中尝试执行此操作、但我以前无法使其正常工作)。

//***** 首页文件
// XDC 模块头文件
#include // XDC“基本类型”-必须先包括
#include // xdc.runtime pkg
#include 中使用的 XDC 常量/类型 //对于在 RTOS .cfg 文件
#include 中静态创建的所有 BIOS 实例 //用于错误处理(例如错误块)
#include // XDC 系统函数(例如 System_abort()、System_printf())
#include 

// TI-RTOS 内核头文件
#include // BIOS 模块 API
#include //任务 API
#include //信号量 API
#include //时钟 API
#include 
#include 

//标准 C 头文件
#include //标准整数类型
#include //标准变量类型和宏

//外设驱动程序头文件
#include "ti_drivers_config.h" // SYSCFG 板/驱动程序头文件
#include // TI GPIO 驱动程序头文件
#include "myGpio.h" // myGpio.c 的头文件
#include "myTimers.h"
#include "myADC.h"
#include "myUART.h"

//
*=== main ====
*//*****

原型


//***** 全局变量
Task_handle sensorRead、motorActuationDecirion、buttonPressed、uartRx;
Task_Params 任务参数;
Error_Block EB;
UART_Handle UART;
UART_Params uartParams;

//***** 主循环
int main (void)
{
Board_init();
myGpio_init();
myTimers_init();
myADC_init();
myUart_init();

Task_Params_init (&taskParams);
taskParams.priority=2;
taskParams.STACKSIZE=512;


// uartRx = Task_create (uartRxFxn、&taskParams、Error_IGNORE);
// S_UartRX = Semaphore_create (0、NULL、Error_IGNORE);

BIOS_start();
}

上面是我的主代码。 请注意、myUart_init 如下所示。  

// XDC 模块头文件
#include // XDC“基本类型”-必须先包括
#include // xdc.runtime pkg
#include 中使用的 XDC 常量/类型 //对于在 RTOS .cfg 文件
#include 中静态创建的所有 BIOS 实例 //用于错误处理(例如错误块)
#include // XDC 系统函数(例如 System_abort()、System_printf())
#include 

#include 
#include 

/*驱动程序头文件*/
#include 
#include 

/*驱动程序配置*/
#include "ti_drivers_config.h"


//***变量********* //
extern UART_Handle UART;
extern UART_Params uartParams;
extern const char echoPrompt[];
unsigned char rxBuffer;

void myUart_init (){
UART_INIT();

UART_PARAMS_INIT (uartParams);
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_return_full;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudrate = 115200;

UART = UART_OPEN (CONFIG_UART_0、uartParams);
//uart_write (UART、echoPrompt、sizeof (echoPrompt));//注意如果我取消注释,整个程序将中断。

}

最后、我的空闲函数代码位于 UART 读取和写入的位置下面。  

// XDC 模块头文件
#include // XDC“基本类型”-必须先包括
#include // xdc.runtime pkg
#include 中使用的 XDC 常量/类型 //对于在 RTOS .cfg 文件
#include 中静态创建的所有 BIOS 实例 //用于错误处理(例如错误块)
#include // XDC 系统函数(例如 System_abort()、System_printf())
#include 

// TI-RTOS 内核头文件
#include // BIOS 模块 API
#include 

//标准 C 头文件
#include //标准整数类型
#include //标准变量类型和宏

//外设驱动程序头文件
#include 
#include "ti_drivers_config.h" // SYSCFG 板/驱动程序头文件
#include // TI GPIO 驱动程序头文件
#include "myGpio.h"
#include 

char rxUART;
extern UART_Handle UART;
extern UART_Params uartParams;
const char echoPrompt[]="回显字符:\r\n";

void myIdleFxn (void)
{
UART_WRITE (UART、echoPrompt、sizeof (echoPrompt));//这不起作用! UART 上没有显示任何数据。

while (1){
UART_READ (UART、&rxUART、1);//rxUART 的 Loginfo 此处显示127。
UART_WRITE (UART、&rxUART、1);
}
}

请提供任何帮助。  

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

    尊敬的 Adam:

    我不建议使用空闲函数在 UART 上进行传输。 呼叫可以被阻止、这意味着空闲任务被阻止。 您能否尝试改用较低优先级的任务。

    Todd

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

    谢谢 Todd、  

    我已经尝试过这种方法、但遇到了相同的问题。 当我运行示例时、代码工作正常、但是当我创建一个线程时、代码不起作用。 这是我的主题:

    void * uartrx (void * arg0)
    {
    特性 输入;
    const char echoPrompt[]="回显字符:\r\n";
    UART_Handle UART;
    UART_Params uartParams;
    
    UART_INIT();
    
    /*创建一个数据处理关闭的 UART。 *
    UART_PARAMS_INIT (uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.readReturnMode = UART_return_full;
    uartParams.readEcho = UART_ECHO_OFF;
    uartParams.baudrate = 115200;
    
    UART = UART_OPEN (CONFIG_UART_0、uartParams);
    
    if (UART == NULL){
    /* UART_open()失败*/
    while (1);
    }
    
    UART_WRITE (UART、echoPrompt、sizeof (echoPrompt));
    
    /*循环永久回显*/
    while (1){
    UART_READ (UART、INPUT、1);
    UART_WRITE (UART、INPUT、1);
    }
    }
    

    我调用此线程、其优先级高于任何其他值、并且它不返回输入的值。 它也无法正确写入回声波、它会给我一个完全错误的值。  

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

    您是否在多个任务中使用相同的 UART?

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

    你好、Todd、  

    UART 仅用于此任务。  

    下面是我发送数据时的输入和输出图像。  

    下面是执行图的捕获、我认为可能会在其中产生错误。 看起来好像在阻止 UART 任务的过程中半路阻断了它。 这是正常的吗?

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

    你好、Todd、  

    UART 仅用于此任务。  

    下面是我发送数据时的输入和输出图像。  

    下面是执行图的捕获、我认为可能会在其中产生错误。 看起来好像在阻止 UART 任务的过程中半路阻断了它。 这是正常的吗?

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

    另一次尝试创建与其他线程更内联的线程的尝试使情况更糟。  

    //Main.c
    
    uartRx = Task_create (uartRxFxn、&taskParams、Error_IGNORE);
    
    //myUart.c
    
    void uartRxFxn (UArg a0、UArg A1)
    {
    
    UART_INIT();
    
    /*创建一个数据处理关闭的 UART。 *
    UART_PARAMS_INIT (uartParams);
    uartParams.writeDataMode = UART_DATA_TEXT;
    uartParams.readDataMode = UART_DATA_TEXT;
    uartParams.readReturnMode = UART_return_full;
    uartParams.readEcho = UART_ECHO_OFF;
    uartParams.baudrate = 115200;
    
    UART = UART_OPEN (CONFIG_UART_0、uartParams);
    
    if (UART == NULL){
    /* UART_open()失败*/
    
    while (1);
    }
    
    
    UART_WRITE (UART、&echoPrompt、sizeof (echoPrompt));
    
    /*循环永久回显*/
    while (1){
    UART_READ (UART、INPUT、sizeof (INPUT));
    UART_WRITE (UART、INPUT、sizeof (INPUT));
    }
    }
    

    下面是 uartRx fucntion 如何捕获 RTOS 的屏幕截图。 我不确定为什么会发生这种情况。 整个过程都会冻结。

    Edit (编辑):通过增大堆栈大小来解决此问题,但最初指出的问题仍然存在。  

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

    由于线程堆栈大小不同、第二次尝试出现了不同的问题、当我将堆栈大小设置为1024时、问题是相同的。  

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

    解决方案、将波特率降至9600、并在 SYSCFG 中将时钟切换到 ACLK。  

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

    Adam、

    这里是一个后续行动。 当大量数据被回显到此线程时,它将经常被唤醒,以便在 UART_READ()和 UART_write()之间切换。

    降低波特率使您可以降低发生这种情况的频率、因为您以低速率接收字节、因此该线程不会经常被阻止。


    此致、
    Derrick