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-CC1310:UART_READ 低性能

Guru**** 2605015 points
Other Parts Discussed in Thread: CC1310

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/580788/rtos-launchxl-cc1310-uart_read-low-performance

器件型号:LAUNCHXL-CC1310
主题中讨论的其他器件:CC1310

工具/软件:TI-RTOS

您好!

工具/软件: TI-RTOS 2.13.00.06

我正在 CC1310硬件上实施 Modbus RTU 从站。 Modbus 协议要求一次接收1个字节的请求、测量子字节时序以检测帧结束(和帧错误)。

我在一次接收1个字节时遇到了低 UART 性能(在阻塞模式和回调模式下都是如此)。 我有以下简单代码来测量接收时序:

void initialize_uart()
{
UART_Params uartParams;

/*创建一个数据处理关闭的 UART。 *
UART_PARAMS_INIT (uartParams);
uartParams.readMode = UART_MODE_BLOCKING;
uartParams.writeMode = UART_MODE_CALLBACK;
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_return_full;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudrate = MODBUS_UART_BAUDRATE;
uartParams.readTimeout = UART_WAIT_FOREVER;
uartParams.writeCallback = UartWriteCallback;

UART = UART_OPEN (Board_UART0、uartParams);

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

}

void initial_Modbus()
{
calculate_timeouts();
construct_timers();

resetRxBuffer();
Initialize_UART();

对于(;)
{
T1 = Clock_getTicks();
int size = UART_read (UART、rxBuffer、UART_RX_buffer_size);// 1字节

memcpy (modbusRxBuffer + rxBufferLength、rxBuffer、size);
rxBufferLength +=大小;

T2 = Clock_getTicks();
system_printf ("接收采用[%lu]us\n"、(T2 - T1)* Clock_tick);
}
} 

使用上面的代码、我得到大约每字节3.3ms (稳定)。 在9600波特率下、大约需要1ms 来传输1个字节、并且每字节3.3ms 的传输时间很长。

我的测试应用程序包含另一个使 LED 闪烁的任务、因此不会占用 CPU。

我已经取消了 UART 中断优先级、但很不幸。 目前我有:

/* UART 硬件参数结构、也用于分配 UART 引脚*/
const UARTCC26XX_HWAttrsV2 uartCC26XXHWAttrs[CC1310_LAUNCHXL_UARTCOUNT]={
{
baseAddr = UART0_BASE、
powerMngrId = PowerCC26XX_Periph_UART0、
.intNum = INT_UART0_COMB、
.intPriority =(2 << 5)、
.wiPriority = 10、
txPin = Board_UART_TX、
.rxPin = Board_UART_RX、
ctsPin = PIN_Unassigned、
rtsPin = PIN_Unassigned、
.ringBufPtr = uartCC26XXRingBuffer[0]、
.ringBufSize = sizeof (uartCC26XXRingBuffer[0])
}
}; 

有人能解释一下我在 UART 设置方面做了什么错吗? 是否可以缩短处理时间?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Aliaksei、
    我正在尝试重现您的问题,但对于以9600波特率进行的 UART_READ()调用,我的速度大约为1毫秒。 您是否在代码中的 UART_READ()调用之间的某个位置调用 UART_write()? 此外、代码中还有"Clock_tick"。 我假设您是 Clock_tickPeriod?
    此致、
    Janet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Janet。 感谢您的回复

    1) 1)在读取所有请求字节并触发超时之前、我不会调用 UART_WRITE

    2)是的、我是说 Clock_tickPeriod (我在原始源代码中硬编码了"10"、只是在这里将其替换为间隙、但更糟糕、抱歉)

    我使用 QModbus 来启动 UART 请求。 下面是我的样片申请设置

    观察逻辑分析仪请求是否正常发出、而不会停止;

    我将附加我的 CCS 项目、以便您更方便地进行诊断  

    e2e.ti.com/.../5635.CC1310_5F00_uart_5F00_perfomance.zip

    使用代码、我可以获得以下日志记录:

    
    
    
    
    
    
    
    
    
    ,构造型计时器 T15=1710us,t35=3990us (在波特率=9600时),接收器采用[3576500]us,接收器采用[3380]us,接收器采用[3350]us,接收器采用[3360]us,接收器采用[3360]UART[3360]UART,3615]Us 帧[发送超时],接收器响应超时[3360]UART561]UART[3360]UART[3360]UART,360] 1 3 0 0 0 62 196 26 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    只是稍微更新了一下。

    我将通过通用 UART_echo (uartecho_CC1310_LAUNCHXL_TI)项目获得相同的行为。

    (CCS 7.1、xdctools_3_32)

    我修改了如下主任务:

    void echoFxn (UARg arg0、UARg arg1)
    {
    
    //上述原始 UART_echo 代码没有更改
    
    Ulong t1、t2;
    /*循环永久回显*/
    while (1)
    {
    T1 = Clock_getTicks();
    
    UART_READ (UART、INPUT、1);
    //UART_WRITE (UART、INPUT、1);
    T2 = Clock_getTicks();
    system_printf ("接收采用[%lu]us\n"、(T2 - T1)* Clock_tickPeriod);
    }
    } 

    我将获得相同的时序~每字节3、3ms

    收款人收了[3360]us
    ,收款人收了[3350]us
    ,收款人收了[3350]us
    ,收款人收了[3360]us
    ,收款人收了[3360]us
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Aliakei、
    我复制了一些测试代码、我看到一个字节的 UART_READ()在9600波特(大约3毫秒)下出现类似的时间。 我不确定这里会发生什么情况。 我需要在驱动程序代码内进行一些测量、以查看花费的时间。 我在 CC3220上尝试了类似的测试、我看到 UART_READ()时间在大约7us 到1800us 之间振荡。 当数据位于 UART 的环形缓冲区中时、会发生短暂的时间、而读取时只需将其复制出去。
    我会随时向您发布我发现的内容。
    此致、
    Janet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的帮助、Janet。
    我也尝试调试驱动程序、但没有找到导致此问题的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ,很抱歉打扰了你。 您是否已成功获取有关该问题的任何其他信息/想法?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Alaksei、
    没问题。 这仍然在我的雷达上、我应该有更多的时间在下周早些时候进行研究。
    此致、
    Janet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Alaksei、

    我对该驱动程序进行了更多的测试、我发现如果我的测试仅调用 UART_READ()、则读取时间大约为1毫秒。  我修改后的代码将执行以下操作:

       /*循环永久回显*/
       while (1){
           对于(I = 0;I < BUFLEN;I++){   // BUFLEN = 20
               T1 = Clock_getTicks();
               UART_READ (UART、缓冲器+ I、1);
               T2 = Clock_getTicks();

               readTimes[i]= t2 - t1;
               count++;
           }
    #if 0
           对于(i = 0;i < BUFLEN;i++){
               UART_WRITE (UART、缓冲器+ I、1);
           }
    #endif
       }

    我添加了 UIA 指令插入、您可以看到 UART Hwi 大约每1毫秒运行一次:

    如果我添加调用 UART_write()的代码,我会看到前几次读取大约需要1毫秒,之后大约需要3毫秒。  执行图如下所示:

    不过、我不知道为什么会发生这种情况。

    此致、

    Janet

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

    嗨、Janet

    我确认我看到 的是 Hwi 调用之间不同周期的相同奇怪行为。

    但在我的情况下、不管 UART_Write()调用、它的行为完全相同

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

    您好、Aliaksei、

    通过查看 UARTCC26XX 驱动程序、我可以看到、当 FIFO 为半满(16字节)或发生读取超时时时时、会触发中断。  如果您一次向 CC1310发送非常少量的字节、则可能会发生读取超时、这会导致您以3毫秒的间隔而不是1毫秒的间隔获取数据。  根据数据表、读取超时为 SSIn_CLK 的32个周期。  在9600波特时、超时大约为3ms。  不过、我想知道 UART 驱动程序 ISR 为什么不将 FIFO 中的所有数据复制到环形缓冲区中、以便后续读取将从环形缓冲区中提取数据、而不是等待读取超时。  我将进一步研究这一点、以了解这是否是有意的。

    此致、

    Janet