主题中讨论的其他器件:CC2652RB、 Z-stack
使用 SimpleLink CC13XX/CC26XX SDK 版本 7.10.01.24、对于浮点(ZCL_datatype_single_prec) 属性的属性报告因 bdb_REPORTING_c 中第1895行的指针访问未对齐而在硬故障下失败:
float L = *((float*)lastValue); float D = *((float*)delta); float C = *((float*)curValue);
使用-O0时可以正常工作、但使用-Oz 时、加载(未对齐)浮点的 FPU 指令会导致 硬故障。
指针 lastValue、delta 和 curValue 的类型为 uint8_t*, 对于浮点指针,至少 lastValue 和 curValue 未正确对齐(地址可被4整除)。 取消引用未对齐的指针会导致 C 中出现未定义的行为、因此 硬错误 在这里是一个完全有效的结果。
其他_alignof 大于2的属性类型可能会发生同样的情况、但我尚未进行测试。
我 通过对所有三个值使用防御性 memcpy 解决了这一问题:
uint8_t len = zclGetDataTypeLength( datatype ); float L, D, C; OsalPort_memcpy( &L, lastValue, len ); OsalPort_memcpy( &D, delta, len ); OsalPort_memcpy( &C, curValue, len );
这可能应该在 SDK 中加以修复。