LINUX.ORG.RU

История изменений

Исправление 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.