Не надо делать мне как лучше, оставьте мне как хорошо
-
- 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)