|
Разное поведение в отладчике и без него. |
|
|
|
Apr 28 2012, 14:29
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 8-02-11
Пользователь №: 62 795

|
Дано: KEIL, плата на stm32f103rb, ULINK2. Задача: поморгать диодами. Код: Код int main(void) { InitHardware(); for (;;) { GPIO_ResetBits(Led_1); Wait(25000); GPIO_ResetBits(Led_2); Wait(25000); GPIO_SetBits(Led_1); Wait(25000); GPIO_SetBits(Led_2); Wait(25000); } } Код void Wait(int Count) { for(; Count !=0; Count--); } Когда расставляю брэйкпоинты по телу фона и хожу в отладчике по шагам, то все моргает в нужной последовательности. Когда отключаю дебаггер, делаю ресет и запускаю, то оба диода просто горят. Что я делаю не так? И почему так происходит?
|
|
|
|
|
Apr 30 2012, 02:09
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 8-02-11
Пользователь №: 62 795

|
Цитата(mdmitry @ Apr 28 2012, 17:53)  Как Вы думаете, сколько времени выполняется эта функция? У Вас 25000 циклов выполняется при тактовой в МГц. Сделайте задержки большими и лучше штатными средствами типа delay. Посмотрите библиотеку к вашему компилятору. Скопировал 1в1 функцию из примера моргалки к своей плате. Компилятор проверю, потому как пересаживаюсь из Eclipse и arm-none-eabi-gcc на Keil и его компилятор, там такие фокусы работали. Общую идею понял, спасибо.
|
|
|
|
|
May 1 2012, 18:29
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (ViKo @ May 1 2012, 09:25)  Просто Кайл знает, чего хотят люди, когда пишут такие циклы. Телепатически узнает? QUOTE (ViKo @ May 1 2012, 09:25)  __nop, кстати, тоже никогда не выбрасывается. Потому что он либо intrinsic-функция, о которой компилятор знает, что она с побочными эффектами, либо это asm volatile вставка.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 2 2012, 08:19
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Результаты экспериментов с Keil 4.50 следующие. Цикл вида #define DELAY(TIME) for (uint32_t i = (24000000 / 4 * TIME); i-- ; ) выбрасывается в Keil в единственном случае - когда выбрана Optimization Level 3 и Optimize for Time. При остальных настройках - остается. Размер кода для цикла вида #define DELAY(TIME) for (volatile uint32_t i = (24000000 / 4 * TIME); i-- ; ) при Optimization Level 1, 2, 3 больше, чем без volatile. Но экономить на 4-х байтах смысла нет, поэтому лучше использовать volatile. Ну, и, естественно, такой цикл не выбрасывается. Так что, Keil - оправдан.
|
|
|
|
|
May 3 2012, 04:40
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Продолжение экспериментов. Исходный код: Код #define DELAY(TIME) for (volatile uint32_t i = (24000000 / 4 * TIME); i--; ) uint32_t cnt; int32_t main(void) { __nop; while (1) { cnt++; __nop; __nop; __nop; DELAY(0.001); } } Компилируется в следующий, при -O1 (при -O0 появляется одна команда NOP) Код ;;;94 int32_t main(void) 000000 4a16 LDR r2,|L1.92| ;;;95 { ;;;96 __nop; ;;;97 while (1) { ;;;98 cnt++; ;;;99 __nop; __nop; __nop; ;;;100 DELAY(0.001); 000002 f2417370 MOV r3,#0x1770 |L1.6| 000006 6810 LDR r0,[r2,#0] ;98 ; cnt 000008 1c40 ADDS r0,r0,#1 ;98 00000a 6010 STR r0,[r2,#0] ;98 ; cnt 00000c 4619 MOV r1,r3 |L1.14| 00000e 0008 MOVS r0,r1 000010 f1a10101 SUB r1,r1,#1 000014 d1fb BNE |L1.14| 000016 e7f6 B |L1.6| ;;;101 } ;;;102 } Как!? Как это согласуется с цитатой из помощи: Цитата __nop This intrinsic inserts a NOP instruction or an equivalent code sequence into the instruction stream generated by the compiler. One NOP instruction is generated for each __nop intrinsic in the source.
The compiler does not optimize away the NOP instructions, except for normal unreachable code elimination. The __nop intrinsic also acts as a barrier for instruction scheduling in the compiler. That is, instructions are not moved from one side of the NOP to the other as a result of optimization.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|