从指向双数据并分配给变量的指针获取值导致系统在 ARM32 平台上挂起
getting value from a pointer which point to double data and assign to a variable led system hang on ARM32 platform
奇怪的问题发生在ARM32平台上。我需要 运行 一个时间序列数据库来存储和处理边缘设备上的传感器数据。我没有太多选择,因为一些流行的数据库不能 运行 在存储容量非常小的设备上。经过几个周期的评估,我发现一个开源的时间序列数据库TDengie似乎非常符合我的要求,因为它足够强大并且足够小。但是当我在我的 ARM32 板上编译并 运行 它时,它会挂起整个系统。我已经在我的 X86 Linux 机器甚至 Raspberry Pi 4 上试过了,它没有这样的问题。我怀疑这是一个只存在于 ARM32 上的特殊错误。我花了一些时间调试。我在 src\query\src\qExecutor.c
.
中找到了一段代码
*(double *)pCtx->pOutput = *(double *)pCtx->pOutput + pInput->dsum;
它在 X86 和 Raspberry Pi 上运行良好,但在 ARM32 上总是失败。我对生成的 ARM 平台特定指令 C 程序没有足够的了解。
如果有人可以提供帮助,我们将不胜感激?
我想这一定是内存对齐问题。您可以检查 pCtx->pOutput 的内存地址。如果它不是一个 4 字节的值,它将导致总线错误,因为 ARM 汇编指令 vstr 需要。
一个快速的解决方案是使用临时变量来存储要存储的值,然后将临时变量的值分配给目标地址。
您可能想尝试轻量级 TSDB TickTock (https://github.com/ytyou/ticktock)。我们已经在 RPi 零无线(32 位)中对其进行了测试。
免责声明:我是 TickTock 的合著者。目前还在压力测试中,还没有投入生产。
奇怪的问题发生在ARM32平台上。我需要 运行 一个时间序列数据库来存储和处理边缘设备上的传感器数据。我没有太多选择,因为一些流行的数据库不能 运行 在存储容量非常小的设备上。经过几个周期的评估,我发现一个开源的时间序列数据库TDengie似乎非常符合我的要求,因为它足够强大并且足够小。但是当我在我的 ARM32 板上编译并 运行 它时,它会挂起整个系统。我已经在我的 X86 Linux 机器甚至 Raspberry Pi 4 上试过了,它没有这样的问题。我怀疑这是一个只存在于 ARM32 上的特殊错误。我花了一些时间调试。我在 src\query\src\qExecutor.c
.
*(double *)pCtx->pOutput = *(double *)pCtx->pOutput + pInput->dsum;
它在 X86 和 Raspberry Pi 上运行良好,但在 ARM32 上总是失败。我对生成的 ARM 平台特定指令 C 程序没有足够的了解。
如果有人可以提供帮助,我们将不胜感激?
我想这一定是内存对齐问题。您可以检查 pCtx->pOutput 的内存地址。如果它不是一个 4 字节的值,它将导致总线错误,因为 ARM 汇编指令 vstr 需要。
一个快速的解决方案是使用临时变量来存储要存储的值,然后将临时变量的值分配给目标地址。
您可能想尝试轻量级 TSDB TickTock (https://github.com/ytyou/ticktock)。我们已经在 RPi 零无线(32 位)中对其进行了测试。
免责声明:我是 TickTock 的合著者。目前还在压力测试中,还没有投入生产。