Не надо делать мне как лучше, оставьте мне как хорошо
- 
	
- sizeof() - не работает в директивах условной компиляции. Поэтому правильнее использовать stdint.h и константы типа UINT_MAX... а если не хочешь C99, то тогда только проверять константы, заданные на уровне проекта (вполне себе нормальный метод,  il-2(24 знак., 20.11.2015 12:07)
			
- Поправка. stdint.h очень даже помогает, но только совместно с signal.h Через сравнение SIG_ATOMIC_MAX/SIG_ATOMIC_MIN с всякими INT_MAX/INT_MIN/INTPTR_MAX/INTPTR_MIN можно определить, атомарно ли обращение к инту или указателю. Для C89 похоже  LightElf(101 знак., 20.11.2015 13:15 - 21.11.2015 02:06)
					
- Я бы сначала заморочился вопросом а можно в принципе ли обойтись без критических секций даже в 32-разрядниках. Есть же и у кортекса инструкции пересылки цепочек регистров, могущиие прерываться посреди дороги. Не делает ли это саму идею обойтись  Олдфаг(36 знак., 20.11.2015 23:50, 
)
							- Ты странные вещи говоришь. У 32-разрядников современных есть специнструкции для реализации lockless алгоритмов (без мьютексов и крит. секций). И там сложные структуры данных (связанные списки, кольцевой буфер) через это делать можно. Базой многих  fk0(974 знак., 21.11.2015 00:30)
									
- Вы говорите банальные вещи. Да, есть механизмы, в конце концов есть ldrex/strex, с помощью которых Вы добьтесь некой атомарности. Но сомневаюсь, что автор и пользователи будут применять этих крокодилов для всех переменных, используемых и в  Олдфаг(216 знак., 21.11.2015 01:06, 
)
											- Что значит "забить на атомарность"? Я как раз на нее не забиваю, а наоборот учитываю. Суть в том, что если обработчик прерывания только пишет в ячейку, а задача только читает - то им не нужны критические секции вообще. Но если вдобавок мы знаем,  LightElf(179 знак., 21.11.2015 01:50)
													
- Гм. А я-то, по простоте своей, думал что правило атомарности негабаритных переменных кардинально другое: "если обработчик читает переменную - делай в фоне критическую секцию лишь при ее записи; а если обработчик пишет переменную - делай  Олдфаг(290 знак., 21.11.2015 08:16, 
)
															- Если на каждый чих городить критическую секцию - то мегагерцы слипнутся. С такими формулировками "негабаритные переменные" и "любое мероприятие по принуждению к атомарности" вообще непонятно что обсуждать. Есть устоявшиеся определения для  LightElf(514 знак., 21.11.2015 12:21)
																	
- Как AVR и его GCC вспомню, так страшно. Там оптимизатор такие фокусы выделывает. Для AVR вот что fk0(747 знак., 21.11.2015 12:46, ссылка)
 - Прекрасно. Давайте и рассмотрим Ваше кредо: не защищать только пишущуюся в прерывании и только читаемую в задаче переменную int16. Назначаем служебное расследование. Позиция1: AVR, мы в задаче считали первый байт от int16 из памяти в регистр и...  Олдфаг(371 знак., 21.11.2015 12:35, 
)
																			- Я ждал!!!! :)  LightElf(486 знак., 21.11.2015 12:43 - 12:55)
																					
- Вы издеваетесь? Я же специально говорил для особо хитрых, что неважно какие мероприятия проводятся по принуждению к атомарности и как их назвать, лишь бы они были и работали. Ваше мероприятие известно со времён 8051 как многократное считывание  Олдфаг(157 знак., 21.11.2015 12:55, 
)
																							- Определение атомарности я дал выше. Если вы с ним не согласны, то с этого и надо начинать. Приведенная функция, что характерно, не атомарна и обходится без критической секции. У нее множество недостатков, но в C89 "маемо що маемо". - LightElf(21.11.2015 13:02)
																									
- Ещё раз: почитайте по ссылкам Буденновца. Способов достижения атомарности немало. - Олдфаг(21.11.2015 13:12, 
)
																											
																										 
 - Ещё раз: почитайте по ссылкам Буденновца. Способов достижения атомарности немало. - Олдфаг(21.11.2015 13:12, 
 - Что-то я не догоняю. А где гарантия, что два раза считается правильно?  fk0(471 знак., 21.11.2015 13:00)
																									
- Нет, там для таймеров порядок считывания был H1,L1, потом повторно H2 и проверка H1==H2, после чего либо годно либо начать чтение сначала. - Олдфаг(21.11.2015 13:10, 
)
																											- Ну это только для таймеров годится. - fk0(21.11.2015 13:20)
																													
- Ну дык я сразу и сказал. Для таймеров и программных многобайтных счетчиков, которые инкрементираются в прерывании. - Олдфаг(21.11.2015 13:26, 
) 
 - Ну дык я сразу и сказал. Для таймеров и программных многобайтных счетчиков, которые инкрементираются в прерывании. - Олдфаг(21.11.2015 13:26, 
 
 - Ну это только для таймеров годится. - fk0(21.11.2015 13:20)
																													
 - Уел :) Ессно есть некоторые допущения по частоте следования этих прерываний. Иначе функа может поломаться несколькими способами, как вариант она может никогда не завершиться. Я с ее помощью читаю счетчик таймаута, который из прерывания LightElf(18 знак., 21.11.2015 13:08)
 
 - Нет, там для таймеров порядок считывания был H1,L1, потом повторно H2 и проверка H1==H2, после чего либо годно либо начать чтение сначала. - Олдфаг(21.11.2015 13:10, 
 
 - Определение атомарности я дал выше. Если вы с ним не согласны, то с этого и надо начинать. Приведенная функция, что характерно, не атомарна и обходится без критической секции. У нее множество недостатков, но в C89 "маемо що маемо". - LightElf(21.11.2015 13:02)
																									
 - Вот любят размазать на 20 строк, что можно написать в одну:   fk0(48 знак., 21.11.2015 12:55)
																							
- Тоже при частом toggle значения в памяти можно попасться) - Олдфаг(21.11.2015 13:17, 
) - Можно и так :) PS. А вообще: хороший, годный срач получился. - LightElf(21.11.2015 13:11 - 13:15)
 
 - Тоже при частом toggle значения в памяти можно попасться) - Олдфаг(21.11.2015 13:17, 
 
 - Вы издеваетесь? Я же специально говорил для особо хитрых, что неважно какие мероприятия проводятся по принуждению к атомарности и как их назвать, лишь бы они были и работали. Ваше мероприятие известно со времён 8051 как многократное считывание  Олдфаг(157 знак., 21.11.2015 12:55, 
 
 - Я ждал!!!! :)  LightElf(486 знак., 21.11.2015 12:43 - 12:55)
																					
 
 
 - Если на каждый чих городить критическую секцию - то мегагерцы слипнутся. С такими формулировками "негабаритные переменные" и "любое мероприятие по принуждению к атомарности" вообще непонятно что обсуждать. Есть устоявшиеся определения для  LightElf(514 знак., 21.11.2015 12:21)
																	
 
 - Гм. А я-то, по простоте своей, думал что правило атомарности негабаритных переменных кардинально другое: "если обработчик читает переменную - делай в фоне критическую секцию лишь при ее записи; а если обработчик пишет переменную - делай  Олдфаг(290 знак., 21.11.2015 08:16, 
 
 - Что значит "забить на атомарность"? Я как раз на нее не забиваю, а наоборот учитываю. Суть в том, что если обработчик прерывания только пишет в ячейку, а задача только читает - то им не нужны критические секции вообще. Но если вдобавок мы знаем,  LightElf(179 знак., 21.11.2015 01:50)
													
 
 - Вы говорите банальные вещи. Да, есть механизмы, в конце концов есть ldrex/strex, с помощью которых Вы добьтесь некой атомарности. Но сомневаюсь, что автор и пользователи будут применять этих крокодилов для всех переменных, используемых и в  Олдфаг(216 знак., 21.11.2015 01:06, 
 - Сферический конь в вакууме не терпит компромиссов. - SciFi(20.11.2015 23:57)
									
- Конечно нет, иначе он перестанет быть сферическим. - LightElf(21.11.2015 01:51)
 
 
 - Ты странные вещи говоришь. У 32-разрядников современных есть специнструкции для реализации lockless алгоритмов (без мьютексов и крит. секций). И там сложные структуры данных (связанные списки, кольцевой буфер) через это делать можно. Базой многих  fk0(974 знак., 21.11.2015 00:30)
									
 
 - Я бы сначала заморочился вопросом а можно в принципе ли обойтись без критических секций даже в 32-разрядниках. Есть же и у кортекса инструкции пересылки цепочек регистров, могущиие прерываться посреди дороги. Не делает ли это саму идею обойтись  Олдфаг(36 знак., 20.11.2015 23:50, 
 
 - Поправка. stdint.h очень даже помогает, но только совместно с signal.h Через сравнение SIG_ATOMIC_MAX/SIG_ATOMIC_MIN с всякими INT_MAX/INT_MIN/INTPTR_MAX/INTPTR_MIN можно определить, атомарно ли обращение к инту или указателю. Для C89 похоже  LightElf(101 знак., 20.11.2015 13:15 - 21.11.2015 02:06)
					
 - Разрядность процессора -- расплывчатое понятие. Разрядность чего именно? Шины данных?  АЛУ?  А вообще #include <signal.h> и используй sig_atomic_t. Между прочим -- C89. - fk0(19.11.2015 00:16)
			
- Слона-то я и не заметил! Огромное человеческое спасибо! Сеньку, бери мяч! - LightElf(19.11.2015 01:59)
 
 - Вот-вот, стремление к "красоте" без критической секции порождает жуткий говнокод. А ведь я предлагал вовремя остановиться... - =AlexD=(18.11.2015 18:38)
			
- Красота требует жертв! А отсутствие критических секций и есть красота. - LightElf(18.11.2015 18:43)
					
- У нас разные представления о красоте. Условные переменные, умеющие работать с критическими секциями, в качестве универсального средства синхронизации ОС - это красота, а то что ты пытаешься сделать - это, как бы помягче сказать,   =AlexD=(27 знак., 18.11.2015 18:47)
							
- Художника всякий норовит обидеть! :) - LightElf(18.11.2015 18:51)
 
 
 - У нас разные представления о красоте. Условные переменные, умеющие работать с критическими секциями, в качестве универсального средства синхронизации ОС - это красота, а то что ты пытаешься сделать - это, как бы помягче сказать,   =AlexD=(27 знак., 18.11.2015 18:47)
							
 
 - Красота требует жертв! А отсутствие критических секций и есть красота. - LightElf(18.11.2015 18:43)
					
 - А это мне только повезло, что sizeof(int) = sizeof(long) = sizeof(bool) = 1 ?  sav6622(55 знак., 18.11.2015 17:34)
			
- Уууу блин, как все запущено. - LightElf(18.11.2015 17:37)
 
 - И вообще, "а пачиму ви спгашиваете?" ©  SciFi(34 знак., 18.11.2015 17:31)
			
- Какбэ сказать... Хочется понять, атомарна ли конструкция x=0, если x имеет тип unsigned short. - LightElf(18.11.2015 17:35)
					
- А если не атомарна, то чем проверка поможет? Просто скажет "шеф, всё пропало!" :-) - SciFi(18.11.2015 17:43)
							
- Если чтение/запись переменной атомарны, то можно сильно упростить жизнь и сберечь кучу ценных тактов проца :) Например функа:  LightElf(288 знак., 18.11.2015 17:46 - 17:50)
									
- Ну и вынести в макрос SHORT_STORE_IS_ATOMIC. Кто захочет что-то там сберечь, сам влезет и определит этот макрос на свой страх и риск. "Кто не спрятался - я не виноват" ©. Йуристы ликуют. - SciFi(18.11.2015 17:49)
											
- Корявенько как-то, не гламурно. Но видать придется. - LightElf(18.11.2015 17:53)
													
- sizeof(sig_atomic_t)*CHAR_BIT >= 16 - fk0(19.11.2015 00:59)
 
 
 - Корявенько как-то, не гламурно. Но видать придется. - LightElf(18.11.2015 17:53)
													
 
 - Ну и вынести в макрос SHORT_STORE_IS_ATOMIC. Кто захочет что-то там сберечь, сам влезет и определит этот макрос на свой страх и риск. "Кто не спрятался - я не виноват" ©. Йуристы ликуют. - SciFi(18.11.2015 17:49)
											
 
 - Если чтение/запись переменной атомарны, то можно сильно упростить жизнь и сберечь кучу ценных тактов проца :) Например функа:  LightElf(288 знак., 18.11.2015 17:46 - 17:50)
									
 
 - А если не атомарна, то чем проверка поможет? Просто скажет "шеф, всё пропало!" :-) - SciFi(18.11.2015 17:43)
							
 
 - Какбэ сказать... Хочется понять, атомарна ли конструкция x=0, если x имеет тип unsigned short. - LightElf(18.11.2015 17:35)
					
 - Встречный вопрос: а на этапе исполнения это можно как-то вычислить? - SciFi(18.11.2015 17:26)
			
- Лехко! Просто прорчитать cpuid :) - Красный Свин(18.11.2015 17:34, 
) 
 - Лехко! Просто прорчитать cpuid :) - Красный Свин(18.11.2015 17:34, 
 - я таки извиняюсь, что мне мешает иметь на 8-битной платформе 32-битный int ? и 16-битный char ?  Красный Свин(117 знак., 18.11.2015 17:24, 
)
			- Автор понимает, что атомарность операции записи в память критически зависит от разрядности процессора. - LightElf(18.11.2015 17:40)
					
- Вообще-то такие вопросы решаются на уровне препроцессора, там целевая платформа и все ее кунштюки точно известны. - Красный Свин(18.11.2015 17:49, 
)
							- Заморочка в том, что я не знаю заранее целевую платформу. Хочется написать так, чтобы оно само везде правильно компилилось :) - LightElf(18.11.2015 17:55)
									
- Ну так напишите макросов каких надо, а потом поразрешайте либо одни, либо другие когда целевая платформа прояснится.  Красный Свин(290 знак., 18.11.2015 18:00, 
) 
 - Ну так напишите макросов каких надо, а потом поразрешайте либо одни, либо другие когда целевая платформа прояснится.  Красный Свин(290 знак., 18.11.2015 18:00, 
 
 - Заморочка в том, что я не знаю заранее целевую платформу. Хочется написать так, чтобы оно само везде правильно компилилось :) - LightElf(18.11.2015 17:55)
									
 - Процессоры разные бывают. Тот же STM8 хоть и назвается восьмибитником, но вполне бодро работает с 16 битами (атомарно). - SciFi(18.11.2015 17:47)
							
- Кстати, а чему на STM8 равны ptrdiff_t и size_t? - LightElf(18.11.2015 18:30)
									
- 2 и 2. - SciFi(19.11.2015 10:51)
											
- Странно. У него ж адрес 24-битный, как же ptrdiff_t может быть 2 байта? - LightElf(19.11.2015 13:48)
													
- Стандарт говорит, что можно. Правда, неясно, зачем тогда нужен этот тип.  SciFi(269 знак., 19.11.2015 14:06)
															
- Как-то непонятно. ptrdiff_t, по определению, есть тип, в который вмещается разность между любыми двумя указателями - LightElf(19.11.2015 14:51)
																	
- Я ж привёл определение. Там нерусским по белому написано, что фигвам, может и не влазить. - SciFi(19.11.2015 15:01)
 
 
 - Как-то непонятно. ptrdiff_t, по определению, есть тип, в который вмещается разность между любыми двумя указателями - LightElf(19.11.2015 14:51)
																	
 
 - Стандарт говорит, что можно. Правда, неясно, зачем тогда нужен этот тип.  SciFi(269 знак., 19.11.2015 14:06)
															
 
 - Странно. У него ж адрес 24-битный, как же ptrdiff_t может быть 2 байта? - LightElf(19.11.2015 13:48)
													
 
 - 2 и 2. - SciFi(19.11.2015 10:51)
											
 - Поскольку это сильно зависит от того, какие инструкции выберет компилятор - полагаться нельзя и надо исходить из его 8-битности. - LightElf(18.11.2015 18:18)
 
 - Кстати, а чему на STM8 равны ptrdiff_t и size_t? - LightElf(18.11.2015 18:30)
									
 
 - Вообще-то такие вопросы решаются на уровне препроцессора, там целевая платформа и все ее кунштюки точно известны. - Красный Свин(18.11.2015 17:49, 
 
 - Автор понимает, что атомарность операции записи в память критически зависит от разрядности процессора. - LightElf(18.11.2015 17:40)
					
 - sizeof(BYTE) == sizeof(char)? - ASDFS(18.11.2015 17:18)
			
- А кто такой BYTE? - LightElf(18.11.2015 17:21)
					
- Вот он, наверное (->) - Скрипач(18.11.2015 17:34, ссылка)
 
 
 - А кто такой BYTE? - LightElf(18.11.2015 17:21)
					
 - Могу подсказать как это сделать на ассемблере. - Скрипач(18.11.2015 17:12)
			
- Мсье изволит тонко шутить? На ассемблере решается организационно, без написание кода: "Для какого процессора будем кодить?" :-) - SciFi(18.11.2015 17:13)
					
- :) - Скрипач(18.11.2015 17:19)
 
 
 - Мсье изволит тонко шутить? На ассемблере решается организационно, без написание кода: "Для какого процессора будем кодить?" :-) - SciFi(18.11.2015 17:13)
					
 - А как с использованием C99? Я заинтригован...  SciFi(146 знак., 18.11.2015 17:07 - 17:09)
			
- ну в C99 можно включить stdint.h и поиграться с проверками uint_fast8_t uint_least8_t и тыды - LightElf(18.11.2015 17:20)
					
- А если через __INT_MAX__, INTMAX_C и подобные? Там же вполне себе конкретные значения. - Dingo(18.11.2015 17:29)
 - А, ну да. Только вот я не уверен, что если sizeof(uint_fast8_t)==1, то это обязательно восьмибитник. - SciFi(18.11.2015 17:22)
							
- Вначале дай определение 8-битника. Что это вообще такое? - fk0(19.11.2015 00:19)
									
- Не дождёшься. Впрочем, аффтар уже понял, что это бесполезно. - SciFi(19.11.2015 00:22, ссылка)
											
- Аффтар понял, что условие sizeof(sig_atomic_t) == sizeof(unsigned int) решает вопрос. - LightElf(19.11.2015 10:30)
													
- Фигвам. В иаре для 8051 и stm8 : "typedef int sig_atomic_t;" - Andreas(19.11.2015 10:42)
															
- Там оно все обложено ifdef, надо посмотреть как именно компилится.  LightElf(275 знак., 19.11.2015 13:47)
																	
- Угу, а потом крыжик переставишь где-то и по другому скомпилится. SciFi ниже правильно сказал. - Andreas(19.11.2015 13:55)
 
 - А это не важно. Если что (фобос в грунт и т.п.) - "это яр виноват!" :-) - SciFi(19.11.2015 10:49)
																	
- Дерьмо случается. И тогда важно не быть крайним. - Lightelf(20.11.2015 23:32)
 
 
 - Там оно все обложено ifdef, надо посмотреть как именно компилится.  LightElf(275 знак., 19.11.2015 13:47)
																	
 
 - Фигвам. В иаре для 8051 и stm8 : "typedef int sig_atomic_t;" - Andreas(19.11.2015 10:42)
															
 
 - Аффтар понял, что условие sizeof(sig_atomic_t) == sizeof(unsigned int) решает вопрос. - LightElf(19.11.2015 10:30)
													
 
 - Не дождёшься. Впрочем, аффтар уже понял, что это бесполезно. - SciFi(19.11.2015 00:22, ссылка)
											
 - Не обязательно. И эта усложняет дело. - LightElf(18.11.2015 17:32)
 
 - Вначале дай определение 8-битника. Что это вообще такое? - fk0(19.11.2015 00:19)
									
 
 
 - ну в C99 можно включить stdint.h и поиграться с проверками uint_fast8_t uint_least8_t и тыды - LightElf(18.11.2015 17:20)
					
 
 - sizeof() - не работает в директивах условной компиляции. Поэтому правильнее использовать stdint.h и константы типа UINT_MAX... а если не хочешь C99, то тогда только проверять константы, заданные на уровне проекта (вполне себе нормальный метод,  il-2(24 знак., 20.11.2015 12:07)