-
- Поправка. 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)