对于以下代码,我在执行" fCapacity / =(float)100.0f; "
时获得SIGBUS HRESULT getBatteryCapacity(OUT OUT float& fCapacity) {
FILE* fp = fopen("/sys/class/power_supply/battery/capacity", "rt");
if (0 == fp)
return HRESULT_FROM_ERRNO(errno);
char pText[16] = { 0 };
char* pRet = fgets(pText, sizeof(pText), fp);
int iLastErr = errno;
fclose(fp);
if (0 == pRet)
return HRESULT_FROM_ERRNO(iLastErr);
pRet = 0;
fCapacity = strtof(pText, &pRet);
if (pRet == pText)
return HRESULT_FROM_ERRNO(iLastErr);
fCapacity /= (float)100.0f; // Causing SIGBUS
return S_OK;
}
通过汇编我可以看到执行" vldr s15,[r3] " (将存储器地址加载到32位浮点寄存器)
...
return HRESULT_FROM_ERRNO(iLastErr);
0xb6ef7ba0 ldr r3, [r11, # - 36]; 0x24
0xb6ef7ba4 orr r3, r3, # - 2147483648; 0x80000000
0xb6ef7ba8 orr r3, r3, #49152; 0xc000
0xb6ef7bac b 0xb6ef7bcc <Mobile::Android::Device::Utility::getBatteryCapacity(float&) + 344>
fCapacity /= (float)100.0f;
0xb6ef7bb0 ldr r3, [r11, # - 48]; 0x30
0xb6ef7bb4 vldr s15, [r3] // <== Breaks here
0xb6ef7bb8 vldr s14, [pc, #52]; 0xb6ef7bf4 <Mobile::Android::Device::Utility::getBatteryCapacity(float&) + 384>
0xb6ef7bbc vdiv.f32 s15, s15, s14
0xb6ef7bc0 ldr r3, [r11, # - 48]; 0x30
0xb6ef7bc4 vstr s15, [r3]
return S_OK;
0xb6ef7bc8 mov r3, #0
}
加载到32位浮点寄存器中的数据必须有任何内存地址对齐吗?
更新
以下(memcpy)解决了问题,但为什么????
float fCap = strtof(pText, &pRet);
if (pRet == pText)
return HRESULT_FROM_ERRNO(iLastErr);
fCap /= (float)100.0f;
memcpy(&fCapacity, &fCap, sizeof(fCap));