elmot писал(а):а если оптимизацию включить?
Все, меньше чем привел выше - нельзя, это из-за того что арм не умеет работать с битами...
elmot писал(а):В то же время - рассматриваемый код - это все-таки Std Periph Lib.
Да, некорректно сослался
elmot писал(а):а если оптимизацию включить?
elmot писал(а):В то же время - рассматриваемый код - это все-таки Std Periph Lib.
dccharacter писал(а):А тут (я не понимаю):
;Cortex-M3/M4F Instruction Set
CMP R0, #9 ; Convert R0 hex value (0 to 15) into ASCII
; ('0'-'9', 'A'-'F').
ITE GT ; Next 2 instructions are conditional.
ADDGT R1, R0, #55 ; Convert 0xA -> 'A'.
ADDLE R1, R0, #48 ; Convert 0x0 -> '0'.
dccharacter писал(а):Ты объясни, нафига ты |= делаешь? BSRR и ODR - спец регистры.
GPIOB->BSRR = 0x00000001;
0x80001e6: 0x4827 LDR.N R0, ??DataTable3_3 ; GPIOB_BSRR.BR0
0x80001e8: 0x2101 MOVS R1, #1
0x80001ea: 0x6001 STR R1, [R0]
??DataTable3_3:
DC32 0x48000418
elmot писал(а):есть у меня легкое подозрение, что битбанг - это деятельность stm поверх ядра арм. Поэтому компилер этого напрочь не умеет.
dccharacter писал(а): BSRR и ODR - спец регистры. Один битбангит, второй тогглит. Не нужно там |=
elmot писал(а):при правильно заданных опциях ассерт превращается в ничто.
/* Read Compass data */
Demo_CompassReadMag(MagBuffer);
Demo_CompassReadAcc(AccBuffer);
for(i=0;i<3;i++)
AccBuffer[i] /= 100.0f;
fNormAcc = sqrt((AccBuffer[0]*AccBuffer[0])+(AccBuffer[1]*AccBuffer[1])+(AccBuffer[2]*AccBuffer[2]));
fSinRoll = -AccBuffer[1]/fNormAcc;
fCosRoll = sqrt(1.0-(fSinRoll * fSinRoll));
fSinPitch = AccBuffer[0]/fNormAcc;
fCosPitch = sqrt(1.0-(fSinPitch * fSinPitch));
if ( fSinRoll >0)
{
if (fCosRoll>0)
{
RollAng = acos(fCosRoll)*180/PI;
}
else
{
RollAng = acos(fCosRoll)*180/PI + 180;
}
}
else
{
if (fCosRoll>0)
{
RollAng = acos(fCosRoll)*180/PI + 360;
}
else
{
RollAng = acos(fCosRoll)*180/PI + 180;
}
}
if ( fSinPitch >0)
{
if (fCosPitch>0)
{
PitchAng = acos(fCosPitch)*180/PI;
}
else
{
PitchAng = acos(fCosPitch)*180/PI + 180;
}
}
else
{
if (fCosPitch>0)
{
PitchAng = acos(fCosPitch)*180/PI + 360;
}
else
{
PitchAng = acos(fCosPitch)*180/PI + 180;
}
}
if (RollAng >=360)
{
RollAng = RollAng - 360;
}
if (PitchAng >=360)
{
PitchAng = PitchAng - 360;
}
fTiltedX = MagBuffer[0]*fCosPitch+MagBuffer[2]*fSinPitch;
fTiltedY = MagBuffer[0]*fSinRoll*fSinPitch+MagBuffer[1]*fCosRoll-MagBuffer[1]*fSinRoll*fCosPitch;
HeadingValue = (float) ((atan2f((float)fTiltedY,(float)fTiltedX))*180)/PI;
if (HeadingValue < 0)
{
HeadingValue = HeadingValue + 360;
}
if ((RollAng <= 40.0f) && (PitchAng <= 40.0f))
{
if (((HeadingValue < 25.0f)&&(HeadingValue >= 0.0f))||((HeadingValue >=340.0f)&&(HeadingValue <= 360.0f)))
{
STM_EVAL_LEDOn(LED10);
STM_EVAL_LEDOff(LED3);
STM_EVAL_LEDOff(LED6);
STM_EVAL_LEDOff(LED7);
STM_EVAL_LEDOff(LED4);
STM_EVAL_LEDOff(LED8);
STM_EVAL_LEDOff(LED9);
STM_EVAL_LEDOff(LED5);
}
else if ((HeadingValue <70.0f)&&(HeadingValue >= 25.0f))
{
STM_EVAL_LEDOn(LED9);
STM_EVAL_LEDOff(LED6);
STM_EVAL_LEDOff(LED10);
STM_EVAL_LEDOff(LED3);
STM_EVAL_LEDOff(LED8);
STM_EVAL_LEDOff(LED5);
STM_EVAL_LEDOff(LED4);
STM_EVAL_LEDOff(LED7);
}
else if ((HeadingValue < 115.0f)&&(HeadingValue >= 70.0f))
{
STM_EVAL_LEDOn(LED7);
STM_EVAL_LEDOff(LED3);
STM_EVAL_LEDOff(LED4);
STM_EVAL_LEDOff(LED9);
STM_EVAL_LEDOff(LED10);
STM_EVAL_LEDOff(LED8);
STM_EVAL_LEDOff(LED6);
STM_EVAL_LEDOff(LED5);
}
else if ((HeadingValue <160.0f)&&(HeadingValue >= 115.0f))
{
STM_EVAL_LEDOn(LED5);
STM_EVAL_LEDOff(LED6);
STM_EVAL_LEDOff(LED10);
STM_EVAL_LEDOff(LED8);
STM_EVAL_LEDOff(LED9);
STM_EVAL_LEDOff(LED7);
STM_EVAL_LEDOff(LED4);
STM_EVAL_LEDOff(LED3);
}
else if ((HeadingValue <205.0f)&&(HeadingValue >= 160.0f))
{
STM_EVAL_LEDOn(LED3);
STM_EVAL_LEDOff(LED6);
STM_EVAL_LEDOff(LED4);
STM_EVAL_LEDOff(LED8);
STM_EVAL_LEDOff(LED9);
STM_EVAL_LEDOff(LED5);
STM_EVAL_LEDOff(LED10);
STM_EVAL_LEDOff(LED7);
}
else if ((HeadingValue <250.0f)&&(HeadingValue >= 205.0f))
{
STM_EVAL_LEDOn(LED4);
STM_EVAL_LEDOff(LED6);
STM_EVAL_LEDOff(LED10);
STM_EVAL_LEDOff(LED8);
STM_EVAL_LEDOff(LED9);
STM_EVAL_LEDOff(LED5);
STM_EVAL_LEDOff(LED3);
STM_EVAL_LEDOff(LED7);
}
else if ((HeadingValue < 295.0f)&&(HeadingValue >= 250.0f))
{
STM_EVAL_LEDOn(LED6);
STM_EVAL_LEDOff(LED9);
STM_EVAL_LEDOff(LED10);
STM_EVAL_LEDOff(LED8);
STM_EVAL_LEDOff(LED3);
STM_EVAL_LEDOff(LED5);
STM_EVAL_LEDOff(LED4);
STM_EVAL_LEDOff(LED7);
}
else if ((HeadingValue < 340.0f)&&(HeadingValue >= 295.0f))
{
STM_EVAL_LEDOn(LED8);
STM_EVAL_LEDOff(LED6);
STM_EVAL_LEDOff(LED10);
STM_EVAL_LEDOff(LED7);
STM_EVAL_LEDOff(LED9);
STM_EVAL_LEDOff(LED3);
STM_EVAL_LEDOff(LED4);
STM_EVAL_LEDOff(LED5);
}
}
else
{
/* Toggle All LEDs */
STM_EVAL_LEDToggle(LED7);
STM_EVAL_LEDToggle(LED6);
STM_EVAL_LEDToggle(LED10);
STM_EVAL_LEDToggle(LED8);
STM_EVAL_LEDToggle(LED9);
STM_EVAL_LEDToggle(LED3);
STM_EVAL_LEDToggle(LED4);
STM_EVAL_LEDToggle(LED5);
/* Delay 50ms */
Delay(5);
}
Сейчас этот форум просматривают: Bing [Bot] и гости: 10