TI中文支持网
TI专业的中文技术问题搜集分享网站

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

问:

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

Cherry Zhou:

答:

版本说明中描述了截至最新 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 中可能会出现竞态条件,如下所述:

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

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

 

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

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

 

object->txDataSent = TRUE;

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

 

在上述两行之间发生了一个 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;

        }

    }

HWI ISR 返回到函数 UART_write2_v1(),该函数随后调用 UARTInt2Enable()(代码片段 2 中的第二行)。
HWI ISR 立即输入,因为 Tx FIFO 仍然为空,中断行输出由 #4 中的 UARTInt2Enable() 启用。但是,由于在 #3 中为 Rx HWI 提供服务时,ISR 已将 txDataSent 设置为 FALSE,因此 ISR 未调用 UARTInt2Disable() 并将 txDataSent 设置为 FALSE。
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;

        }

赞(0)
未经允许不得转载:TI中文支持网 » [FAQ] AM335x/AM437x Processor SDK RTOS 的已知问题有哪些
分享到: 更多 (0)