-
- Ещё раз. Нерабочий вариант, рабочий закомментирован. Bill(357 знак., 16.04.2020 09:46)
- Все, что ты привел здесь и ниже не отвечает на вопрос: где и как
меняется переменная Mode. Это главный вопрос. il-2(254 знак., 16.04.2020 13:13)
- По пунктам: Bill(185 знак., 17.04.2020 13:49)
- Учитывая большой интерес коллег, было бы здорово изолировать
проблему в небольшом файле, который все могли бы проверить у себя. AlexBi(72 знак., 17.04.2020 15:33)
- Так причина вроде определилась. При максимальной оптимизации
компилятор оператор if ... else сводит к оператору if. Если убрать галочку Function inlining, то всё транслируется
правильно. Я думаю, полезно иногда просматривать сгенерированный
код. Как говориться - доверяй но проверяй. Или нет? - Bill(17.04.2020 18:46)
- Нет. При любой оптимизации и используя любые действительные
выражения языка, оно обязано работать и не ломаться. Разумеется,
если код написан верно. Nikolay_Po(49 знак., 17.04.2020 20:23)
- Смотрите GetButtons(). И вообще, я на IAR 20 лет сижу. Неужели за это время я не научился разбираться во всех этих нюансах? Для меня это первый непонятный случай работы компилятора. Был, правда, ещё один случай , но это относилось не компилятору. К тому же, я там разобрался. - Bill(18.04.2020 07:43)
- Нет. При любой оптимизации и используя любые действительные
выражения языка, оно обязано работать и не ломаться. Разумеется,
если код написан верно. Nikolay_Po(49 знак., 17.04.2020 20:23)
- Так причина вроде определилась. При максимальной оптимизации
компилятор оператор if ... else сводит к оператору if. Если убрать галочку Function inlining, то всё транслируется
правильно. Я думаю, полезно иногда просматривать сгенерированный
код. Как говориться - доверяй но проверяй. Или нет? - Bill(17.04.2020 18:46)
- чему равен Mode при инициализации и чему равен CH1_DSPLY - abivan(17.04.2020 15:24)
- Ещё раз Bill(240 знак., 17.04.2020 18:37)
- Не еби мозги, покажи код полностью, все функции где используется
Mode и декларации переменных, типов, констант. Стопудова у тебя
где-то цикл, в котором компилятор, считает, Mode меняться не может,
и делает оптимизацию. А меняешь где-то из прерывания и т.п. - fk0(17.04.2020 18:55)
- Задолбали! Вот вся функция Bill(2187 знак., 17.04.2020 19:37)
- Определен ли макрос CO2_C2 ? (вставь #ifndef CO2_C2 #error "not
defined" и проверь!) Может ли компилятор понимать, что GetButtons()
возвращает не константу? Если там где-то читается переменная
изменяемая в прерываниях, например. Чему равен PROG_BTN? - fk0(17.04.2020 20:53)
- Единственная переменная, которая изменяется в прерываниях,
определена как volatile. Bill(2009 знак., 18.04.2020 07:29)
- Ооо. Пошла информация :-) Пойдем простым логическим путем: il-2(317 знак., 19.04.2020 08:46)
- Это порт, к которому подключены кнопки. :) - Bill(19.04.2020 14:49)
- Если порт объявлен как регистр специального назначения и volatile (обычно так и делается в заголовочных файлах контроллера), то вроде всё перекопали. С автоповтором в вашем коде не разобрался, но по сути выбора режима - всё нормально, должно было работать. Nikolay_Po(92 знак., 19.04.2020 15:24)
- Больше вопросов не имею :-) - il-2(19.04.2020 15:10)
- Это порт, к которому подключены кнопки. :) - Bill(19.04.2020 14:49)
- Ооо. Пошла информация :-) Пойдем простым логическим путем: il-2(317 знак., 19.04.2020 08:46)
- Единственная переменная, которая изменяется в прерываниях,
определена как volatile. Bill(2009 знак., 18.04.2020 07:29)
- чему равна Mode к этому моменту Mode |= CH1_DSPLY; // Display channel 1 Почему тут ИЛИ а не присвоение? - abivan(17.04.2020 20:22)
- Определен ли макрос CO2_C2 ? (вставь #ifndef CO2_C2 #error "not
defined" и проверь!) Может ли компилятор понимать, что GetButtons()
возвращает не константу? Если там где-то читается переменная
изменяемая в прерываниях, например. Чему равен PROG_BTN? - fk0(17.04.2020 20:53)
- Задолбали! Вот вся функция Bill(2187 знак., 17.04.2020 19:37)
- Не еби мозги, покажи код полностью, все функции где используется
Mode и декларации переменных, типов, констант. Стопудова у тебя
где-то цикл, в котором компилятор, считает, Mode меняться не может,
и делает оптимизацию. А меняешь где-то из прерывания и т.п. - fk0(17.04.2020 18:55)
- Ещё раз Bill(240 знак., 17.04.2020 18:37)
- Учитывая большой интерес коллег, было бы здорово изолировать
проблему в небольшом файле, который все могли бы проверить у себя. AlexBi(72 знак., 17.04.2020 15:33)
- По пунктам: Bill(185 знак., 17.04.2020 13:49)
- Маленькие кусочки, вырванные из контекста, не оч. интересны. - SciFi(16.04.2020 09:52)
- Более полный код, по сути это функция main, за исключением
инициализации (до цикла for). Bill(1215 знак., 16.04.2020 10:02)
- Покажите весь ассемблер - VLLV(16.04.2020 10:11)
- Вот почему все как партизаны на допросе? По-прежнему неясно, что
такое Mode, CH1_DSPLY, DisplayCO2. - SciFi(16.04.2020 10:08)
- Хм... Так пойдёт? Bill(527 знак., 16.04.2020 10:21)
- GetButtons() тоже не видно. Например, если сигнал из обработчика
прерывания передаётся через переменную, которая не volatile,
начинаются всякие чудеса. - SciFi(16.04.2020 10:29)
- В общем-то, все эти вещи с volatile я ещё 20 лет назад выяснил. С тех пор я за этим слежу. - Bill(16.04.2020 10:47)
- А переменная Mode изменяется где-нибудь из прерывания? Если та, то
почему она до сих пор не volatile? - lloyd(16.04.2020 10:27)
- Нет, не меняется :) - Bill(16.04.2020 10:40)
- GetButtons() тоже не видно. Например, если сигнал из обработчика
прерывания передаётся через переменную, которая не volatile,
начинаются всякие чудеса. - SciFi(16.04.2020 10:29)
- Хм... Так пойдёт? Bill(527 знак., 16.04.2020 10:21)
- Более полный код, по сути это функция main, за исключением
инициализации (до цикла for). Bill(1215 знак., 16.04.2020 10:02)
- Все, что ты привел здесь и ниже не отвечает на вопрос: где и как
меняется переменная Mode. Это главный вопрос. il-2(254 знак., 16.04.2020 13:13)
- Ещё раз. Нерабочий вариант, рабочий закомментирован. Bill(357 знак., 16.04.2020 09:46)