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.

[FAQ] AM335x/AM437x Processor SDK RTOS 的已知问题有哪些

问:

我知道最新 RTOS SDK 中的已知问题,如版本说明中所述。在最新版本发布后是否发现了任何其他已知问题?

  • 答:

    版本说明中描述了截至最新 RTOS SDK 版本 (6.3) 所发现的已知问题。

    下面列出了 6.3 版本之后所发现的已知问题以及相应的解决方案/权变措施。

    1.      CSL API CSL_rtcSetCompensationVal() 不工作

    问题:

    CSL_rtcSetCompensationVal() 应该加载以下 RTC 补偿寄存器:RTCSS_COMP_LSB_REG 和 RTCSS_COMP_MSB_REG。但是,它使用与 RTCSS_COMP_LSB_REG 中相同的值加载 RTCSS_COMP_MSB_REG。 

    此问题是由于 csl\src\ip\rtc\V0\cslr_rtc.h 中的宏 CSL_RTC_COMP_MSB_RTC_COMP_MSB_SHIFT 定义错误导致的:

    #define CSL_RTC_COMP_MSB_RTC_COMP_MSB_SHIFT ((uint32_t)(0U))

     

    解决方案

    将宏 CSL_RTC_COMP_MSB_RTC_COMP_MSB_SHIFT 重新定义为

    #define CSL_RTC_COMP_MSB_RTC_COMP_MSB_SHIFT ((uint32_t)(8U))

     

    2.      PDK 示例工程未针对裸机用例进行构建

    问题:

    PDK 中的 CCS 示例工程应该针对 TI-RTOS 用例或裸机用例进行构建。但是,这些工程并未针对裸机用例进行构建。 

    例如,需要执行以下步骤来为裸机重新编译 GPIO_LedBlink_iceAMIC110_armTestProject 工程:

    • 从工程设置的编译器符号中删除 USE_BIOS
    • 在 XDC 配置文件cfg 中注释掉任务创建代码

    /* Program.global.echo = Task.create("&gpio_test", task0Params); */

     

    • 在同一 XDC 配置文件中将osType 更改为 "nonos"

    Osal.osType = "nonos"

     

    由于这些更改,重新编译项目时会出现以下错误:

    js: "C:/ti/pdk_am335x_1_0_17/packages/ti/osal/package.xs", line 70: Error: Soc is not defined

     

    解决方案

    按照此常见问题解答从头开始创建基于 PDK 的裸机应用工程。

    3.       针对 Windows 10 PDK 顶级构建脚本损坏

    在 Windows 10 中,从顶级 makefile 重新编译 PDK 失败。请参阅此 E2E 主题 ,了解详细信息和权变措施。

    4.       当传输数据较小时,可能会出现 UART LLD 竞态条件

    问题:

    当传输数据非常小时,UART LLD 中可能会出现竞态条件,如下所述:

    1. Tx 传输由函数 UART_write2_v1() 中的以下行启动:

    object->writeSize = (size_t)UART_writeData_v1(handle, (int32_t)(transaction->count));

     

    由于传输数据很小,只有 1 个字节,传输瞬间就已完成,并发出 UART ISR2 中的标志 TXFIFO_EMPTY_STS(这是一个状态位,而不是一个中断位)。

    1. 由于传输已完成,该代码还尝试在同一函数内启用中断 EN_TXFIFO_EM PTY:

     

    object->txDataSent = TRUE;

    UARTInt2Enable(hwAttrs->baseAddr, UART_INT2_TX_EMPTY);  // set bit EN_TXFIFO_EMPTY in UART IER2 register

     

    1. 在上述两行之间发生了一个 Rx HWI,并且输入了 HWI ISR 来为 Rx HWI 提供服务。由于 ISR 中的以下两个条件都为 true,因此 ISR 禁用了中断 EN_TXFIFO_EMPTY 并将 txDataSent 设置为 FALSE:

        if (object->txDataSent == TRUE)

        {

            intType = UARTInt2StatusGet(hwAttrs->baseAddr);  // read bit TXFIFO_EMPTY_STS in UART ISR2

            if ((intType & UART_INT2_TX_EMPTY) != 0U)

            {

                UARTInt2Disable(hwAttrs->baseAddr, UART_INT2_TX_EMPTY);   // reset bit EN_TXFIFO_EMPTY in UART IER2

                UART_v1_callback(handle, (bool)false);

                object->writeTrans = NULL;

                object->txDataSent = FALSE;

            }

        }

    1. HWI ISR 返回到函数 UART_write2_v1(),该函数随后调用 UARTInt2Enable()(代码片段 2 中的第二行)。
    2. HWI ISR 立即输入,因为 Tx FIFO 仍然为空,中断行输出由 #4 中的 UARTInt2Enable() 启用。但是,由于在 #3 中为 Rx HWI 提供服务时,ISR 已将 txDataSent 设置为 FALSE,因此 ISR 未调用 UARTInt2Disable() 并将 txDataSent 设置为 FALSE。
    3. HWI ISR 返回后,由于中断 EN_TXFIFO_EMPTY 未被清除,因此它立即重新进入。然后 #5 和 #6 无限重复。

     

    解决方案:

    在 ISR 中添加一个额外检查,确保只有在启用了 TX_EMPTY 中断时才将 txDataSent 设置为 FALSE:

    if (  ((intType & UART_INT2_TX_EMPTY) != 0U)

                &&(HW_RD_REG32(baseAddr + UART_IER2) & UART_IER2_EN_TXFIFO_EMPTY_MASK) )

            {

                UARTInt2Disable(hwAttrs->baseAddr, UART_INT2_TX_EMPTY);            /* Call back to application if in callback mode */

                UART_v1_callback(handle, (bool)false);

                object->writeTrans = NULL;

                object->txDataSent = FALSE;

            }