Перейти к содержанию
    

Здравствуйте.

 

У меня появилась такая проблема... компилятор полностью пропускает циклы... то есть вот пример...

 

на Си я пишу

 

SetLCDPosition(2, 0);
for(short i = 0; i == 23; i++)
    ucTemp += sCurrentTemp[i];
ucTemp /= 24;
sprintf(sBuffer, "%3d", ucTemp / 2);

 

а в ассемблере получается

 

181:              SetLCDPosition(2, 0);
+000002B3:   2F61        MOV     R22,R17          Copy register
+000002B4:   E082        LDI     R24,0x02         Load immediate
+000002B5:   940E0113    CALL    0x00000113       Call subroutine

185:              sprintf(sBuffer, "%3d", ucTemp / 2);
+000002B7:   921F        PUSH    R1               Push register on stack
+000002B8:   921F        PUSH    R1               Push register on stack
+000002B9:   E682        LDI     R24,0x62         Load immediate
+000002BA:   E090        LDI     R25,0x00         Load immediate
+000002BB:   939F        PUSH    R25              Push register on stack
+000002BC:   938F        PUSH    R24              Push register on stack
+000002BD:   92FF        PUSH    R15              Push register on stack
+000002BE:   92EF        PUSH    R14              Push register on stack
+000002BF:   940E03CE    CALL    0x000003CE       Call subroutine

 

моего цикла for(...) {...} нет совсем... так в нескольких местах программы (везде, где встречаются циклы)

 

пробовал при уровнях компиляции 0, 1, 3, s. При нулевом уровне у меня программа не вылазиит из прерывания по АЦП. То есть сразу после окончания обработки прерывания сбрасывается на начало прерывания... А при остальных - проглатываются циклы... может, кто сталкивался с подобной проблемой... подскажите пожалуйста, что можно сделать... везде в программе писать такое количество операторов это уж слишком загромоздит код (циклов ожидается достаточно большое количество)...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня появилась такая проблема... компилятор полностью пропускает циклы... то есть вот пример...

for(short i = 0; i == 23; i++)

Такой цикл не будет выполнен ни один раз и, поэтому, транслятор код оптимизирует

 

Правильнее будет записать, например, так

for(short i = 0; i < 24; i++)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня появилась такая проблема... компилятор полностью пропускает циклы... то есть вот пример...

Компилятор не пропускает циклы, он их опртимизирует. В вашем случае код

 

...
for(short i = 0; i == 23; i++)
    ucTemp += sCurrentTemp[i];
ucTemp /= 24;
sprintf(sBuffer, "%3d", ucTemp / 2);

 

превратился в:

 

...
sprintf(sBuffer, "%3d", 98);

 

подскажите пожалуйста, что можно сделать... везде в программе писать такое количество операторов это уж слишком загромоздит код (циклов ожидается достаточно большое количество)...

 

Прочитать про модификатор типа переменных volatile или послать ваш код сюда.

 

Анатолий.

 

PS: А про неправильный цикл я не заментил. :05:

Изменено пользователем aesok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте.

 

У меня появилась такая проблема... компилятор полностью пропускает циклы... то есть вот пример...

 

на Си я пишу

 

SetLCDPosition(2, 0);
for(short i = 0; i == 23; i++)
    ucTemp += sCurrentTemp[i];
ucTemp /= 24;
sprintf(sBuffer, "%3d", ucTemp / 2);

 

По правилам языка Си цикл выполняется в том случае когда условие цикла истинно и до тех пор пока это условие не станет ложным а переменная должна объявляется до её использования. В Вашем коде условие продолжения цикла for(short i = 0; i == 23; i++) уже ложно и цикл не будет выполнен ни разу. Переменную i надо объявить до её использования в условии цикла

 

short i; 
for( i = 0; i < 23; i++)
...

 

тогда при достижении переменной i значения 23 условие продолжения цикла станет ложным и цикл прекратится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, спасибо... я заметил обе ошибки... но именно объявление цикла и оператор for были ни при чем... я создал новую функцию и объявил ее volatile и вынес цикл туда... после этого он у меня исполнился...

 

Ошибка в операторе for была уже из-за спешки... сначала я написал его правильно :) ... потом заменил цикл на while... когда это не помогло, переписал опять в виде for... уже с ошибкой...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И еще "short i" - ни к селу ни к городу - для 8bit это работа с чрезмерно большим 16bit значением, а для

32 ARM - с исскуственно ограниченным.

Если пользоватся минимальным набором типов, то для 8bit "unsigned char" , а для 16/32 соответствено "int".

Поскольку на 8bit int обычно "традиционно" :( 16bit, на 16bit - уже обычно логичный соразмерный, ну и на 32bit-овиках вообще все правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если пользоватся минимальным набором типов, то для 8bit "unsigned char" , а для 16/32 соответствено "int".
или uint_least8_t, uint_fast8_t из stdint.h - оптимальное для архитектуры значение подставится "само".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

или uint_least8_t, uint_fast8_t из stdint.h - оптимальное для архитектуры значение подставится "само".

Я говорил о минимальном наборе типов. Я по простоте душевной тоже за такой подход агитировал достаточно долго, пока не наступил на непонятки в IAR ARMc int_least8_t - в сложных выражениях не int :( , int_fast8_t там ведет себя похожим на int. Ну, короче я свой ручкаи завел bint (base int) для такого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я говорил о минимальном наборе типов. Я по простоте душевной тоже за такой подход агитировал достаточно долго, пока не наступил на непонятки в IAR ARMc int_least8_t - в сложных выражениях не int :( , int_fast8_t там ведет себя похожим на int. Ну, короче я свой ручкаи завел bint (base int) для такого.

 

А можно поподробней?

У меня везде юзаются типы вроде byte (как типичная замена int), uint. ulong. Сейчас возникла необходимость один и тотже код исполнять как на компе (VC++), так и на МК. Начал переползать на uint_X, uint_fast_X. Вроде все получается неплохо.

А что у вас с ними за проблемы?

И еще вопросик - для чего нужны типы uint_least_X, если есть uint_fast_X? (Т.е. uint_X - фиксированный размер, uint_fast_X - самый быстрый тип размера не менее чем, а uint_least_X - ?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что у вас с ними за проблемы?

Иногда int_least8_t не получается эквивалентом int на 32bit платформе :(

И еще вопросик - для чего нужны типы uint_least_X, если есть uint_fast_X?

Ну, например, для конкретной платформы fast будет тягототь к размещению в регистрах а указывая все fast получаем профанацию идеи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Иногда int_least8_t не получается эквивалентом int на 32bit платформе :(

А ваше решение? Вы просто создали "свой" int_least8_t, назвав его bint?

Ну, например, для конкретной платформы fast будет тягототь к размещению в регистрах а указывая все fast получаем профанацию идеи.

Не совсем понял. Почему он будет тяготеть к размещению в регистрах? Это ж обычный typedef....

Т.е. вы имеете в виду, что в "стандартных" ситуация типа счетчика цикла и т.д. следует использовать uint_least_X, а в неких исключительных - uint_fast_X?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это ж обычный typedef....

Обычным (в смысле на стандартный тип) typedef он быть не собязан. Вот "мой" bint это действительно тупой uint на 32bit платформе...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пока не наступил на непонятки в IAR ARMc int_least8_t - в сложных выражениях не int :(
Тоже хотелось бы пример. Я быстро обжегся, что он может быть совсем не байтом, и байтовое переполнение в нем использовать нельзя. Других проблем пока не было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Иногда int_least8_t не получается эквивалентом int на 32bit платформе :(
А он и не обязан. Гарантируется только то, что будет минимум 8 бит. "прошу минимум 8 бит, остальных требований не имею, на усмотрение компилятора". Сколько - как выйдет. На каком-нибудь сигнальнике без байтовой адресации будет 16 бит, на арме с вполне приличной работой с байтами - может быть и 8 и 32 - "на усмотрение".

 

Ну, например, для конкретной платформы fast будет тягототь к размещению в регистрах а указывая все fast получаем профанацию идеи.
IMHO, регистры тут ни при чем. "прошу минимум 8 бит, но при этом требование - максимальная скорость работы". И тут уже в процессоре с 32-битными регистрами и без команды загрузки байта с расширением знака для int_fast8_t наиболее вероятно будет использовано 32 бита, чтобы после загрузки байта не тратить время на команды, которыми расширится знак.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На каком-нибудь сигнальнике без байтовой адресации будет 16 бит, на арме с вполне приличной работой с байтами - может быть и 8 и 32 - "на усмотрение".

Проблема не в усмотрении, а в том, что это "усмотрение" не всегда нравится - на том-же ARM нет "вполне приличной работы с байтами". Нет :(, посему когда вдруг он вдруг компилятор иногда начинает дополнительно извращаться с какой-нибудь 24bit маской :( мне это совершенно не нравится.

IMHO, регистры тут ни при чем.

Не могу утверждать что "ни при чем" - вполне логично предположить, что это вполне может служить и заменителем давно почти всеми похереного "register". Если вдруг есть какие-то дополнительные официальные (а не очевидные трактовки fast и least) рекомендации было-бы интересно посмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...