ส็็็็็็็็็็็็็็็็็็็็็็็็็༼ ຈل͜ຈ༽ส้้้้้้้้้้้้้้้้้้้้้้้
- 
	
- Имеет. Прямое. - Nikolay_Po(04.05.2019 21:33)
 - Имеет. Искать место в коде и писать программатором часть команды - плохой дзен. - Скрипач(04.05.2019 21:29)
			
- Это да. Для этого нужен volatile. Но это не объясняет подмену адреса переменной её значением.  SciFi(37 знак., 04.05.2019 21:59)
					
- Компилятор - в своем праве. Если адрес константы и ее значение одного размера, то схера писать адрес. - Скрипач(04.05.2019 22:02)
							
- +1. В этом и корень проблемы. Когда компилятор точно знает, что определённое на этапе компиляции значение неизменно (константа), зачем ему использовать косвенную адресацию, которая требует больше времени и кода? Он будет использовать значение,  Nikolay_Po(532 знак., 04.05.2019 22:11)
									
- Это фантазии. Не надо фантазировать, когда есть нормативные документы. Советую в них заглядывать, кстати. Там есть ещё один соскок: "undefined behavior". В этом случае возможно всё. Но вряд ли это тот случай. - SciFi(04.05.2019 22:16)
											
- Не фантазии, а реальность. И документы тут не при чём. Никакая оптимизация, дающая тот же результат, что и не оптимизированный вариант, стандартом не запрещена. Постоянно вижу такое, работая с Microchip XC16 и GNU Arm Embedded. Nikolay_Po(1579 знак., 04.05.2019 22:39 - 22:46)
 - Вполне возможно что это отклонение от стандарта. 
При желании, можно забиться в угол и поплакать.Скрипач(86 знак., 04.05.2019 22:19)- Вы, главное, свой волшебный volatile-бубен не потеряйте. А то еще действительно расплачетесь ;) - s_h_e(04.05.2019 23:10)
															
- Искрометный юмор. Скрипач(233 знак., 05.05.2019 08:37)
 
 
 - Вы, главное, свой волшебный volatile-бубен не потеряйте. А то еще действительно расплачетесь ;) - s_h_e(04.05.2019 23:10)
															
 
 
 - Это фантазии. Не надо фантазировать, когда есть нормативные документы. Советую в них заглядывать, кстати. Там есть ещё один соскок: "undefined behavior". В этом случае возможно всё. Но вряд ли это тот случай. - SciFi(04.05.2019 22:16)
											
 - Без цитаты текста стандарта языка Си нещитово. И вообще бред. - SciFi(04.05.2019 22:09)
									
- Стандарт не накладывает ограничений на оптимизацию за исключением объектов, объявленных volatile. Возражения без цитаты текста стандарта языка Си нещитво. - Nikolay_Po(04.05.2019 22:47)
											
- Не буду разубеждать, да и зачем? Можете верить во что угодно, только не сгубите иной неокрепший ум. Но тут я спокоен, VLLV тёртый калач :-) - SciFi(05.05.2019 06:45)
													
- Мой посыл "неокрепшим умам" - прост.  Скрипач(309 знак., 05.05.2019 08:30 - 08:39)
															
- Вы же понимаете, что этот аргумент можно довести до неприличного абсурда. Адурина будет казаться вершиной знания :-) - SciFi(05.05.2019 08:45)
																	
- Любой аргумент можно довести до абсурда. Этот - не исключение.  Скрипач(193 знак., 05.05.2019 08:46 - 08:50)
																			
- А я не отстану. Конкретно этот вопрос решается достаточно легко. Просто соотнести со стандартом и прийти к выводу, что имеет место баг. Юриспруденция, так сказать. Рассуждать о логике работы бага довольно тупо. - SciFi(05.05.2019 08:53)
																					
- И? Дальше что? Что делать в одном случае (баг) и в другом (фича)?  Скрипач(95 знак., 05.05.2019 09:00)
																							
- а вообще можно написать "volatile const"?  Можно написать все, кроме сочетаний, разрушающих разум) - VLLV(05.05.2019 11:54)
																									
- SciFi был прав, насчет неподготовленных умов :) - Скрипач(05.05.2019 12:02)
 - Можно, но имеет смысл только для регистров, изменяемых аппаратно в процессе работы программы. - s_h_e(05.05.2019 12:00, ссылка)
																											
- Не только. Как раз константы (например настройки), лежащие во флеше и изменяемые путем специальных процедур - хорошие кандидаты на volatile const. - LightElf(05.05.2019 14:29)
																													
- Каких специальных процедур, можно уточнить? М.б. есть пример, когда просто const во флеше может не работать?  s_h_e(230 знак., 05.05.2019 15:37)
																															
- Во флеше, в специально выделенной области, хранятся настройки. Эти настройки могут быть изменены средствами самой прошивки. Стирание/Запись данных во флеше обычно представляет из себя набор неочевидных для компилятора манипуляций с регистрами. В LightElf(186 знак., 05.05.2019 16:44 - 16:54)
 - Специальная процедура - модификация hex. Когда компилятор не может учесть изменения константы, так как это изменение происходит уже после сборки. - Nikolay_Po(05.05.2019 15:51)
																																	
- Т.е. вы даете компоновщику положить константу во флешь по неизвестному заранее адресу (и не указывая явно секцию), потом как-то ищете и модифицируете? Это интересно, никогда так не делал. - s_h_e(05.05.2019 16:00 - 16:02)
																																			
- Человек пишет, что место определяет средствами линкера, поэтому знает, где. - Nikolay_Po(05.05.2019 16:03)
																																					
- Ну хорошо, что же все-таки может случиться с константой, которая есть в hex, но при этом без volatile? - s_h_e(05.05.2019 16:18)
																																							
- Компилятор может оптимизировать обращение к ней, заменив обращение литералом в инструкции. Линкер ведь не сообщил компилятору, что константу программист специально положил по особому адресу и она программисту зачем-то очень нужна.  Nikolay_Po(321 знак., 05.05.2019 17:14)
																																									
- Адрес/куда положить обычно явно указывается модификаторами при определении объекта, других вариантов не припомню. Так что компилятор всегда в курсе. Замена таких констант литералами не попадалась.  s_h_e(92 знак., 05.05.2019 17:53)
																																											
- Не, не. Компилятор положит константу в ту секцию, куда надо. Но в исполняемом коде подставит значение константы вместо ссылки на секцию. Разумеете? - Хитрый Китаец(08.05.2019 03:13)
																																													
- Да понятно, что именно это подразумевается. Но как бы не очень логично занимать память под неиспользуемые константы. Прецеденты были?  s_h_e(139 знак., 08.05.2019 08:32 - 08:35)
																																															
- Она может быть линкером выкинута как неиспользуемая, сплошь и рядом. - Хитрый Китаец(10.05.2019 01:08)
																																																	
- Вот у меня константы с явно заданным размещением линкер никогда не выкидывал. Если такое делает купленный компилятор - это повод, как минимум, для ругани с техподдержкой. Поэтому и просил примеры. - s_h_e(10.05.2019 09:34)
																																																			
- ПМСМ, кроме того, чтобы явно задать размещение константы, нужно объяснить компилятору, что она нужна тебе зачем-то ещё, чего компилятор не видит. Я за агрессивную оптимизацию. Пусть выкидывает.  Nikolay_Po(959 знак., 10.05.2019 12:06 - 12:09)
																																																					
- Не расстраивайте меня. 1)ну не дает компилятор создать переменную volatile const!  2)hardfault - это последствия неправильного выполнения операции взятия адреса, мы же не последствия разбираем, а причину. - VLLV(10.05.2019 12:56)
																																																							
- 1) Из инструкции к Microchip XC16 v1.36b:  Nikolay_Po(2053 знак., 10.05.2019 13:56 - 14:01)
																																																									
- А что, компиляторы к контроллерам профессионального уровня тоже переходят в разряд профессиональных и устанавливают планку для всех остальных? Объясните это скандинавам, у тех один ответ на все претензии - "У нас ANSI C компилятор" - VLLV(10.05.2019 14:00 - 14:08)
																																																											
- Если так, то это означает, что компилятор не обеспечивает поддержку аппаратного обеспечения. Си - сями, но для полного использования железа, копиляторостроители вынуждены (и должны, ПМСМ) добавлять нужные костыли в виде дополнительных атрибутов,  Nikolay_Po(176 знак., 10.05.2019 14:22)
																																																													
- Бывают бесплатные:) Скрипач(392 знак., 10.05.2019 15:28 - 16:11)
 - Ну придумал же fkO мем "контроллеры профессионального уровня" :) - VLLV(10.05.2019 16:06)
 
 
 - Если так, то это означает, что компилятор не обеспечивает поддержку аппаратного обеспечения. Си - сями, но для полного использования железа, копиляторостроители вынуждены (и должны, ПМСМ) добавлять нужные костыли в виде дополнительных атрибутов,  Nikolay_Po(176 знак., 10.05.2019 14:22)
																																																													
 
 - А что, компиляторы к контроллерам профессионального уровня тоже переходят в разряд профессиональных и устанавливают планку для всех остальных? Объясните это скандинавам, у тех один ответ на все претензии - "У нас ANSI C компилятор" - VLLV(10.05.2019 14:00 - 14:08)
																																																											
 
 - 1) Из инструкции к Microchip XC16 v1.36b:  Nikolay_Po(2053 знак., 10.05.2019 13:56 - 14:01)
																																																									
 
 - Не расстраивайте меня. 1)ну не дает компилятор создать переменную volatile const!  2)hardfault - это последствия неправильного выполнения операции взятия адреса, мы же не последствия разбираем, а причину. - VLLV(10.05.2019 12:56)
																																																							
 
 - ПМСМ, кроме того, чтобы явно задать размещение константы, нужно объяснить компилятору, что она нужна тебе зачем-то ещё, чего компилятор не видит. Я за агрессивную оптимизацию. Пусть выкидывает.  Nikolay_Po(959 знак., 10.05.2019 12:06 - 12:09)
																																																					
 
 - Вот у меня константы с явно заданным размещением линкер никогда не выкидывал. Если такое делает купленный компилятор - это повод, как минимум, для ругани с техподдержкой. Поэтому и просил примеры. - s_h_e(10.05.2019 09:34)
																																																			
 
 - Она может быть линкером выкинута как неиспользуемая, сплошь и рядом. - Хитрый Китаец(10.05.2019 01:08)
																																																	
 
 - Да понятно, что именно это подразумевается. Но как бы не очень логично занимать память под неиспользуемые константы. Прецеденты были?  s_h_e(139 знак., 08.05.2019 08:32 - 08:35)
																																															
 
 - Не, не. Компилятор положит константу в ту секцию, куда надо. Но в исполняемом коде подставит значение константы вместо ссылки на секцию. Разумеете? - Хитрый Китаец(08.05.2019 03:13)
																																													
 
 - Адрес/куда положить обычно явно указывается модификаторами при определении объекта, других вариантов не припомню. Так что компилятор всегда в курсе. Замена таких констант литералами не попадалась.  s_h_e(92 знак., 05.05.2019 17:53)
																																											
 
 - Компилятор может оптимизировать обращение к ней, заменив обращение литералом в инструкции. Линкер ведь не сообщил компилятору, что константу программист специально положил по особому адресу и она программисту зачем-то очень нужна.  Nikolay_Po(321 знак., 05.05.2019 17:14)
																																									
 
 - Ну хорошо, что же все-таки может случиться с константой, которая есть в hex, но при этом без volatile? - s_h_e(05.05.2019 16:18)
																																							
 
 - Человек пишет, что место определяет средствами линкера, поэтому знает, где. - Nikolay_Po(05.05.2019 16:03)
																																					
 
 - Т.е. вы даете компоновщику положить константу во флешь по неизвестному заранее адресу (и не указывая явно секцию), потом как-то ищете и модифицируете? Это интересно, никогда так не делал. - s_h_e(05.05.2019 16:00 - 16:02)
																																			
 
 
 - Каких специальных процедур, можно уточнить? М.б. есть пример, когда просто const во флеше может не работать?  s_h_e(230 знак., 05.05.2019 15:37)
																															
 
 - Не только. Как раз константы (например настройки), лежащие во флеше и изменяемые путем специальных процедур - хорошие кандидаты на volatile const. - LightElf(05.05.2019 14:29)
																													
 
 - volatile - говно (пардон за мой французский). Бывает множество способов обойти баг, и смена компилятора, порой, возможна. Ответственные товарищи пишут в 
спортлотоСкандинавию, но если это не самая свежая версия, то и говорить не о чем - а SciFi(25 знак., 05.05.2019 09:30)- На счёт говна не согласен. Применение volatile для решения задачи ТС - корректно и оптимально. Не вижу никаких противопоказаний и доказательств вины компилятора. Правда, я фантазёр ещё тот! - Nikolay_Po(05.05.2019 17:17)
 - В параллель - да. Тупо сидеть и ждать ответа от этнического турка студента "из Скандинавии" - нет. - Скрипач(05.05.2019 09:37)
 
 
 - а вообще можно написать "volatile const"?  Можно написать все, кроме сочетаний, разрушающих разум) - VLLV(05.05.2019 11:54)
																									
 
 - И? Дальше что? Что делать в одном случае (баг) и в другом (фича)?  Скрипач(95 знак., 05.05.2019 09:00)
																							
 
 - А я не отстану. Конкретно этот вопрос решается достаточно легко. Просто соотнести со стандартом и прийти к выводу, что имеет место баг. Юриспруденция, так сказать. Рассуждать о логике работы бага довольно тупо. - SciFi(05.05.2019 08:53)
																					
 
 - Любой аргумент можно довести до абсурда. Этот - не исключение.  Скрипач(193 знак., 05.05.2019 08:46 - 08:50)
																			
 
 - Вы же понимаете, что этот аргумент можно довести до неприличного абсурда. Адурина будет казаться вершиной знания :-) - SciFi(05.05.2019 08:45)
																	
 
 - Мой посыл "неокрепшим умам" - прост.  Скрипач(309 знак., 05.05.2019 08:30 - 08:39)
															
 
 - Не буду разубеждать, да и зачем? Можете верить во что угодно, только не сгубите иной неокрепший ум. Но тут я спокоен, VLLV тёртый калач :-) - SciFi(05.05.2019 06:45)
													
 
 - Стандарт не накладывает ограничений на оптимизацию за исключением объектов, объявленных volatile. Возражения без цитаты текста стандарта языка Си нещитво. - Nikolay_Po(04.05.2019 22:47)
											
 
 - +1. В этом и корень проблемы. Когда компилятор точно знает, что определённое на этапе компиляции значение неизменно (константа), зачем ему использовать косвенную адресацию, которая требует больше времени и кода? Он будет использовать значение,  Nikolay_Po(532 знак., 04.05.2019 22:11)
									
 
 - Компилятор - в своем праве. Если адрес константы и ее значение одного размера, то схера писать адрес. - Скрипач(04.05.2019 22:02)
							
 - нормальный дзен, патчится хекс перед прошивкой каждого устройства - VLLV(04.05.2019 21:40)
					
- Нюансы. У меня отдельный "люк" поверх Modbus. Беру из map адрес и пишу.   Скрипач(53 знак., 04.05.2019 22:01)
							
- ваша практика не совпадает с моей - у меня десятки тысяч устройств разных версий, не вижу смысла заниматься ненужной поддержкой версионности, если все решается фиксированным расположением, которое предусмотрено штатными средствами линкера. - VLLV(05.05.2019 10:46)
									
- Тогда непонятно какая вам разница как компилятор передал в функцию константу. - Скрипач(05.05.2019 11:09)
											
- Потому что функция, работающая в других местах, в этом не работает - она ожидает адрес, начинает считывает байт по несуществующему адресу и ядро улетает в hardfault.  Да можно написать другую функцию, но речь идет о том, как в серьезном  VLLV(155 знак., 05.05.2019 12:00)
													
- Тогда (volatile const)* ptr. Или void func(const char* const param, ...), чтобы передавало константу вместо указателя везде. - Скрипач(05.05.2019 12:03 - 12:10)
															
- Вы таки будете смеяться, но эта конструкция не передаёт константу вместо указателя. Она передаёт именно что указатель. Константный указатель на константу, но не саму константу. - йцукен(05.05.2019 13:20)
 - Только в этом месте извращение в части длины 4 байта, в остальных нормальный буфер в ОЗУ. Собственно решение я нашел, решение получше предложил il-2, volatile компилятор исключает : incompatible declarations. Вопрос остается простой: подмена VLLV(377 знак., 05.05.2019 12:47)
 
 
 - Тогда (volatile const)* ptr. Или void func(const char* const param, ...), чтобы передавало константу вместо указателя везде. - Скрипач(05.05.2019 12:03 - 12:10)
															
 
 - Потому что функция, работающая в других местах, в этом не работает - она ожидает адрес, начинает считывает байт по несуществующему адресу и ядро улетает в hardfault.  Да можно написать другую функцию, но речь идет о том, как в серьезном  VLLV(155 знак., 05.05.2019 12:00)
													
 
 - Тогда непонятно какая вам разница как компилятор передал в функцию константу. - Скрипач(05.05.2019 11:09)
											
 
 - ваша практика не совпадает с моей - у меня десятки тысяч устройств разных версий, не вижу смысла заниматься ненужной поддержкой версионности, если все решается фиксированным расположением, которое предусмотрено штатными средствами линкера. - VLLV(05.05.2019 10:46)
									
 
 - Нюансы. У меня отдельный "люк" поверх Modbus. Беру из map адрес и пишу.   Скрипач(53 знак., 04.05.2019 22:01)
							
 
 - Это да. Для этого нужен volatile. Но это не объясняет подмену адреса переменной её значением.  SciFi(37 знак., 04.05.2019 21:59)