- 
	- А если так? Исправил, спасибо fk0  Бoмж(134 знак., 16.04.2020 21:21 - 21:53)
			- RTFM LMD! - fk0(16.04.2020 21:45, ссылка)
					- LMD - это оно? - Evgeny_CD(17.04.2020 14:07, ссылка)
							- ААА!!! - SciFi(17.04.2020 14:29, ссылка)
									- Да, видимо это уже склероз. Или маразм. - Evgeny_CD(17.04.2020 14:38)
											- Склеразм :)) - MBedder(17.04.2020 20:13)
 
 
- Да, видимо это уже склероз. Или маразм. - Evgeny_CD(17.04.2020 14:38)
											
 
- ААА!!! - SciFi(17.04.2020 14:29, ссылка)
									
 
- LMD - это оно? - Evgeny_CD(17.04.2020 14:07, ссылка)
							
 
- RTFM LMD! - fk0(16.04.2020 21:45, ссылка)
					
- Довольно типичный случай, когда переменной Mode выше по тексту присвоение конкретное значение. Тогда компилятор видит, что это значение не менялось до входа в функцию Display(), вот и не ставит проверки, полагая ее излишней. Ищите баг там, где у вас формируется Mode. Вычисляемая она у вас или ей присвоено константное выражение. Во втором случае компилятор поступил верно - константные выражения перевариваются на стадии компиляции. - Kceния(16.04.2020 11:21)
- Ещё один факт. Установил оптимизацию Medium, компилироваться стало
правильно  Bill(560 знак., 16.04.2020 10:11)
			- Позанудничаю. Не "компилироваться стало правильно", а скрыло косяки
в коде. - SciFi(16.04.2020 10:15)
					- Ещё немного покопался, поставил оптимизацию High и выключил Function inlining - транслируется правильно. - Bill(16.04.2020 10:38)
- В том-то и проблема, что косяков я не могу найти. А код-то самый примитивный - всего 4 строчки. - Bill(16.04.2020 10:24)
 
 
- Позанудничаю. Не "компилироваться стало правильно", а скрыло косяки
в коде. - SciFi(16.04.2020 10:15)
					
- Самое интересное, что в более ранней версии компилятора это всё
работало. Ошибка обнаружилась на днях, когда пришлось несколько
модифицировать программу. Причём модификация с данным участком кода
никак не связана. - Bill(16.04.2020 09:53)
			- А о каких версиях идет речь? - У меня были большие проекты на STM8, подобное бы вылезло. - VLLV(16.04.2020 10:27)
 
- Ассемблерный листинг в студию для обоих случаев - Ale3000(16.04.2020 08:56)
			- Нет проблем Bill(735 знак., 16.04.2020 09:23)
 
- Display(...) что такое? Не #define случайно? Если макрос, то какой? - AlexBi(16.04.2020 08:39)
			- Display() - обычная подпрограмма, mode - переменная. - Bill(16.04.2020 09:39)
- Этот кусок закомментирован. - my504(16.04.2020 08:57)
 
- Бригада телепатов просит разъяснить значение термина "компилятор
игнорирует" :-) А то сейчас окажется, что имеется в виду
невозможность поставить красный кружок в режиме отладки. Ну и тут
уже все будет ясно :-) - il-2(16.04.2020 08:26)
			- Тов. Bill известен своим пристрастием к ассемблеру. Листинг
просматривал, конечно. Вообще он компиляторы запускает только для
того, чтобы обвинить их в неправильном ассемблерном выхлопе :-) - SciFi(16.04.2020 09:12)
					- А куда было деваться? Программа не работает и непонятно почему
именно. Пришлось смотреть листинг. Оптимизация - по умолчанию. - Bill(16.04.2020 09:37)
							- Опыт подсказывает, что гораздо продуктивнее анализировать исходник,
так как свои косяки встречаются приблизительно в 1000 раз чаще, чем
косяки компилятора. Листинг ассемблера может помочь сузить поиск,
но полный исходник всё равно нужен. Код - в студию! - SciFi(16.04.2020 09:39)
									- Ещё раз. Нерабочий вариант, рабочий закомментирован.  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)
											
 
- Опыт подсказывает, что гораздо продуктивнее анализировать исходник,
так как свои косяки встречаются приблизительно в 1000 раз чаще, чем
косяки компилятора. Листинг ассемблера может помочь сузить поиск,
но полный исходник всё равно нужен. Код - в студию! - SciFi(16.04.2020 09:39)
									
 
- А куда было деваться? Программа не работает и непонятно почему
именно. Пришлось смотреть листинг. Оптимизация - по умолчанию. - Bill(16.04.2020 09:37)
							
- Коллеги, чего Вы привязались к человеку? В вопросе все очевидно -
условие всегда выполняется. Поскольку речь идет о выборе дисплея,
то понятно, что код дисплея должен быть выбран один из множества. А
это xor, а не and. - my504(16.04.2020 08:37)
					- Не верю. Моя версия: компилятор вычислил, что одна из альтернатив
никогда не реализуется, и выкинул else. Ну а в случае "?:" не
вычислил - тоже бывает. - SciFi(16.04.2020 08:40)
							- +1 - fk0(16.04.2020 21:50)
- Такое могло быть только в случае, если Mode определен как enum и НЕВЕРНОЕ ПО СУТИ условие было исключено из кода. Но даже это компилятор имел право делать только при включенной оптимизации. При всем этом нет никакого смысла тыкать человека носом в совершенно непринципиальные вопросы. Стоит просто указать на правильное решение. Хотя бы из уважения к возрасту... - my504(16.04.2020 08:52)
 
 
- Не верю. Моя версия: компилятор вычислил, что одна из альтернатив
никогда не реализуется, и выкинул else. Ну а в случае "?:" не
вычислил - тоже бывает. - SciFi(16.04.2020 08:40)
							
 
- Тов. Bill известен своим пристрастием к ассемблеру. Листинг
просматривал, конечно. Вообще он компиляторы запускает только для
того, чтобы обвинить их в неправильном ассемблерном выхлопе :-) - SciFi(16.04.2020 09:12)
					
- Значение CH1_DSPLY? - lloyd(16.04.2020 08:15)
- Может стоит вместо and употребить xor? Или нет? ))) - my504(16.04.2020 08:11)
 
- А если так? Исправил, спасибо fk0  Бoмж(134 знак., 16.04.2020 21:21 - 21:53)