Чет в первый раз слышу чтобы отладчик прошелся по той функции которая не выполняется. Знаю и видел что по коду он может прыгнуть в неожиданные места из-за высокой оптимизации.
Да и к тому же при средней оптимизации если я останавливаю программу, то я вижу что отладчик встал на инструкции WFI, при высокой оптимизации он уже встает именно на WFE. Да и нигде в коде я не передаю
функции использование WFE, по хорошему компилятор должен был вообще выкинуть ее из функции как неиспользуемую.
Вот код при средней оптимизации:
CODE
080011fe: 0x4770 BX LR
685 tmpreg = PWR->CR;
PWR_EnterSTOPMode:
08001200: PWR_EnterSTOPMode:
0x4a0b LDR.N R2, ??DataTable12_1 ; 0x40007000 (1073770496)
08001202: 0x6813 LDR R3, [R2]
693 PWR->CR = tmpreg;
08001204: 0x089b LSRS R3, R3, #2
08001206: 0xea50 0x0083 ORRS.W R0, R0, R3, LSL #2
0800120a: 0x6010 STR R0, [R2]
696 SCB->SCR |= SCB_SCR_SLEEPDEEP;
0800120c: 0x4809 LDR.N R0, ??DataTable12_6 ; SCR
0800120e: 0x6802 LDR R2, [R0]
08001210: 0xf042 0x0204 ORR.W R2, R2, #4
08001214: 0x6002 STR R2, [R0]
699 if(PWR_STOPEntry == PWR_SLEEPEntry_WFI)
08001216: 0x2901 CMP R1, #1
08001218: 0xd101 BNE.N ??PWR_EnterSTOPMode_0 ; 0x800121e
702 __WFI();
0800121a: 0xbf30 WFI
0800121c: 0xe000 B.N ??PWR_EnterSTOPMode_1 ; 0x8001220
707 __WFE();
0800121e: ??PWR_EnterSTOPMode_0:
0xbf20 WFE
710 SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP);
08001220: ??PWR_EnterSTOPMode_1:
0x6801 LDR R1, [R0]
08001222: 0xf021 0x0104 BIC.W R1, R1, #4
08001226: 0x6001 STR R1, [R0]
711 }
Сообщение отредактировал IgorKossak - May 29 2014, 15:16
Причина редактирования: используйте тэги