问:
我知道最新 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;
}