標題: 使用cubeide時浮點函數返回值傳遞錯誤 [打印本頁] 作者: 風雨逍遙 時間: 2024-10-15 11:21 標題: 使用cubeide時浮點函數返回值傳遞錯誤 我在某個.c文件中定義了一個float函數,在函數內設置斷點查看return運算結果是正確的,但我在另一個.c文件中引用這個函數給某個變量賦值時,變量的值就錯誤了。感覺像是cubeide的浮點運算設置問題,已經開啟了cubeide的支持浮點運算和sprintf的選項。
這個是浮點函數的運行結果,我在函數內設置斷點查看,計算運行是正確的 Name : value Details:4.37491322 Default:4.37491322 Decimal:1082916682 Hex:0x408bff4a Binary:1000000100010111111111101001010 Octal:010042777512 這個是引用函數賦值后得到的錯誤結果,通過引用函數賦值之后得到的變量直接飛了,引用函數后得到的結果是錯誤的 Name : mid_angle Details:1.08291674e+009 Default:1.08291674e+009 Decimal:1317083135 Hex:0x4e8117ff Binary:1001110100000010001011111111111 Octal:011640213777 我確保函數類型和賦值的類型一致,都是float,且代碼在keil中編譯運行沒問題,在cubeide中未改動代碼,但函數傳遞值時就錯了,不知道咋解決 floatgetAngle11(void)
{
float angle_data,d_angle,value;angle_data = I2C_getRawCount();// tracking the number of rotations // in order to expand angle range form [0,2PI] to basically infinityd_angle = angle_data - angle_data_prev;// if overflow happened track it as full rotationif(fabs(d_angle) > (0.8*cpr) ) full_rotation_offset += d_angle > 0 ? -_2PI : _2PI; // save the current angle value for the next steps// in order to know if overflow happenedangle_data_prev = angle_data;// return the full angle // (number of full rotations)*2PI + current sensor angle value=(full_rotation_offset + ( angle_data / (float)cpr) * _2PI);return value ;
} 引用時是這樣的 volatilefloat mid_angle,end_angle; mid_angle=getAngle11(); 感覺是cubeide的浮點設置問題,我之前開啟了支持浮點數編譯和打印的設置,不知道還有啥浮點數問題 作者: 飛云居士 時間: 2024-10-15 14:16
可能是變量對齊問題:在ARM架構中,變量的對齊方式可能會影響到浮點數的傳遞。可以嘗試調整變量的對齊方式,使其符合ARM的要求。例如,可以定義變量為4字節對齊,以避免在函數調用時出現對齊錯誤。