История изменений
Исправление KivApple, (текущая версия) :
Было так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
Сделал так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
И всё стало хорошо. Теперь скорость работы вполне сравнима с AVR.
На AVR у меня в принципе не работал double. Если описать double переменную, то она всё равно занимала 4 байта. А на MSP430 похоже double таки реализован. А gcc хочет использовать его по умолчанию.
Код похудел на пару килобайт, умножение теперь выглядит так:
MOV.W 8(R7), R13
MOV.W R13, R12
rpt #8 { rlax.w R12
rrum.w #4, R13 { rrum.w #4, R13
BIS.W R13, R12
MOV.W #__mspabi_fltlif, R9
BIT.W #0x8000, R12 { SUBC.W R13, R13 { INV.W R13, R13
CALL R9
MOV.W #__mspabi_mpyf, R10
MOV.W #-24488, R14
MOV.W #14859, R15
CALL R10
MOV.W R12, &gyro_x
MOV.W R13, &gyro_x+2
Проблема решена, всем спасибо за подсказки.
Исправление KivApple, :
Было так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
Сделал так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
И всё стало хорошо. Теперь скорость работы вполне сравнима с AVR.
На AVR у меня в принципе не работал double. Если описать double переменную, то она всё равно занимала 4 байта. А на MSP430 похоже double таки реализован. А gcc хочет использовать его по умолчанию.
Код похудел на пару килобайт, умножение теперь выглядит так:
MOV.W 8(R7), R13
MOV.W R13, R12
rpt #8 { rlax.w R12
rrum.w #4, R13 { rrum.w #4, R13
BIS.W R13, R12
MOV.W #__mspabi_fltlif, R9
BIT.W #0x8000, R12 { SUBC.W R13, R13 { INV.W R13, R13
CALL R9
MOV.W #__mspabi_mpyf, R10
MOV.W #-24488, R14
MOV.W #14859, R15
CALL R10
MOV.W R12, &gyro_x
MOV.W R13, &gyro_x+2
Проблема решена, всем спасибо за подсказки.
Исправление KivApple, :
Было так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
Сделал так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
И всё стало хорошо. Теперь скорость работы вполне сравнима с AVR.
На AVR у меня в принципе не работал double. Если описать double переменную, то она всё равно занимала 4 байта. А на MSP430 похоже double таки реализован. А gcc хочет использовать его по умолчанию.
Проблема решена, всем спасибо за подсказки.
Исправление KivApple, :
Было так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
Сделал так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
И всё стало хорошо. Теперь скорость работы вполне сравнима с AVR.
На AVR у меня в принципе не работал double. Если описать double переменную, то она всё равно занимала 4 байта. А на MSP430 похоже double таки реализован. А gcc хочет использовать его по умолчанию.
Исправление KivApple, :
Было так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
Сделал так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
И всё стало хорошо. Теперь скорость работы вполне сравнима с AVR.
На AVR у меня в принципе не работал double. Если описать double переменную, то она всё равно занимала 4 байта. А на MSP430 похоже double таки реализован.
Исправление KivApple, :
Было так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
Сделал так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
И всё стало хорошо. Теперь скорость работы вполне сравнима с AVR.
Исходная версия KivApple, :
Было так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * 0.000532632218016; // / 32.768 * M_PI / 180.0;
Стало так:
gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) * (float)0.000532632218016; // / 32.768 * M_PI / 180.0;
И всё стало хорошо. Теперь скорость работы вполне сравнима с AVR.