А какая разница? Если я коммерсанту не предоставлю данную информацию, он не предоставит мне доступ в Интернет. В соответствии с действующим законодательством.
Кстати, Богатов попадает под «предоставление услуг связи без соответствующей лицензии». Его узел — телематические услуги связи чистейшей воды. И не важно, что они предоставлялись на безвоздмездной основе.
Итого, минимум два нарушения я уже вижу. Хотя конечно «призывы к беспорядкам» (или что там ему шьют?) это явный бред.
А разве по правилам, действующим в РФ на данный момент, для доступа к сети Интернет не требуется идентификация личности? SMS-ки для бесплатного WiFi просто так рассылают? А в курсе, что организации обязаны предоставлять операторам связи информацию о сотрудниках, использующих корпоративный Интернет? А разве продажа SIM-карт без предъявления документа, удостоверяющего личность, у нас официально разрешена?
Допустим у меня есть ружье. Официально зарегистрированное и т.д. и т.п. Но я исповедую принцип свободной стрельбы по мишеням. Не дают кому-нибудь справку для владения оружием, ну и что? По мишеням пострелять может каждый, это не запрещено!
И я выкладываю свое ружье около дома. Бери, стреляй, мне не жалко! Только почистить потом не забудь.
И вот какой-то нехороший человек взял мое ружье и пристрелил из него тещу/жену/любовницу/любовника.
Внимание, вопрос:
— что мне будет за то, что при помощи моего оружия было совершено преступление?
— чем принципиально данная ситуация отличается от ситуации с Богатовым?
N.B.
Я программист, а не юрист. Рассматриваю ситуацию с точки зрения общей логики.
А сам бит как будем принимать/передавать? С запрещенными прерываниями на время от 10 до 120 мкс при тактовой в 16Mhz? На какое время затормозим остальные фоновые задачи при выполнении, например, bus search с подключенным десятком датчиков? А если остальные задачи являются реалтайм-управлением сторонним устройством?
Коммент — ярчайший пример кодера-ардуинщика, никогда не писавшего серьезных проектов). Смотрим по пунктам:
1. Высокоуровневые функции (например bus search) на основе pthreads — в списке литературы под п. 4.
2. w1 3V3 (т.е. ссылку на п. 3 в списке литературы пропустили. Где там трехвольтовая 1-wire?)
3. PWM. bitbang исключаем сразу. Ибо это работа с запрещенными прерываниями в интервалах от 10 мкс (единица или чтение) до 120 мкс (передача нуля. С разрешенными прерываниями она может плавно перейти в передачу RESET). Если мк выполняет одну задачу (уровень ардуинщика) — это нормально. Для профессионала это уровень даже не junior.
4. DMA. Реализация по IRQ требует по 2 IRQ/бит (одно загрузка PWM, одно на запись результата, 16 IRQ на байт). Но экономит RAM. Выбирается по условиям компиляции. Если RAM не критична, но критично CPU — выбираем DMA (приблизительно 3 IRQ на байт).
5. Вменяемые люди на одну шину вешают не отключаемые датчики (напр. температуры), а на вторую отключаемые (напр. таблетки для кода доступа). Таймеров на камне дофига, по одному на каждую шину вполне можно выделить. А можно коммутировать сигнал одним полевиком.
И причем тут гальваническая развязка, если статья о программировании? Схему аппаратного драйвера (3) давно разобрали умные люди, и их советы давно учтены в production.
Предлагаю попробовать впихнуть алгоритм поиска подключенных к шине 1-wire устройств без использования protothreads. Сравнить время, затраченное на реализацию, и получившуюся читабельность кода.
Была проблема с проверкой на высокоуровневых функциях, грешил на ошибку в алгоритме. Оказалась ошибка в значениях тайминга. Исправил, публикацию снова открыл)
Статья была скрыта на сутки из-за обнаружения проблемы функционирования процедур высокого уровня с реальными устройствами. В результате выяснилось, что проблема не в алгоритме, а в значениях тайминга при декодировании принятых битов. Исходники на гитхабе исправлены, статья снова доступна для чтения.
Ну вот, у меня тоже вышло продолжение для STM8. Там два основных варианта реализации: только по прерыванием с экономией памяти и с использованием DMA для экономии времени CPU.
По второму. Во многих ОС РВ используется концепция отложенного прерывания. Да и вообще, живой пример: внутри прерывания нужно выполнить атомарную последовательность инструкций (захват разделяемого ресурса?) — делаем с приоритетом I1 == I0 == 1, затем выполнить работу с конкретным оборудованием (ex. «записали данные в порт» — делаем с приоритетом оборудования), затем выполняем обработку в режиме «отложенного прерывания» (ex. «проверяем условие на завершение блочной операции, устанавливаем параметры пробуждения основного процесса и т.п.» — приоритет основного кода или любой другой, в котором все прочие прерывания являются разрешенными). Чем меньше мы сидим в режиме, когда хоть какие-нибудь прерывания запрещены, тем лучше будет реакция системы на события.
По третьему. Для своей задачи со своим конкретным камнем я нашел конкретные workarounds. Но этого нет в errata/reference/datasheet. Что стоило мне 2 недели рабочего времени. Это не нормально. Статья для того, чтобы другие не наступали на те же самые грабли. Плюс просьба проверить описанное поведение на других кристаллах семейства.
А что такое «несанкционированное изменение статусных битов»? Где в reference есть прямой запрет на изменение I1/I0 внутри ISR? Может быть мне еще запретят завершать ISR любым другим способом, кроме как по команде IRET?
Ну так я сейчас его и использую. Вот только обидно за убитые 2 недели по отлову этой ситуации.
P.S. olartamonov, а ты еще не любишь «arduino» в коммерческих проектах ;). Для atmel (имеется ввиду именно работа с голым железом, а не C++ обертка для чайников) пишешь, заглядывая одним глазком в datasheet, и все работает с первого раза. Когда у них крайний раз было обнаружено несоответствие описания функционированию реального железа? А STM-железо все-таки очень сырое. Несмотря на большое количество аппаратных плюшек.
Аналогичная ситуация происходит и в случае понижения приоритета кода в ISR EEPROM до любого другого значения, отличного от I1 == I0 == 1.
Про безусловное засыпание при IRET с учетом только приоритета кода и без учета PC я уж вообще молчу. Просыпаться-то как будем? Восстановим регистры из стека и с таким набором продолжим обработку прерванной ISR?
(1) Задача не позволяет использовать active-halt.
(2) Да фиг с этим исполнением основного кода. Просто обнаруженное поведение не описано ни в reference, ни в errata. Вот я и спросил, «это у одного меня такие глюки, или сие есть баг/фича камня?».
По пункту (1): такое поведение наблюдается при понижении до любого приоритета, отличного от I1 == I0 == 1. Таким образом при выходе из вложенного прерывания приоритет кода может отличаться от приоритета, на который мы попали при выполнении WFI. Однако зависание имеет место быть.
2. После окончания записи байта/слова возможно нам понадобится записать следующий байт/слово. Это надо определить и инициировать следующую операцию. Несколько команд.
Для уменьшения времени пребывания в режиме запрещения прерываний вполне законно изменить текущий приоритет. И в этот момент произошло вложенное прерывание. Что тут не стандартного?
3. Проверяется, допустим, изменением состояния внешнего пина с просмотром результата на осциллографе. Либо изменением какой-либо ячейки памяти. Да, я уверен: вложенное прерывание остается.
Но это не нормально, т.к. WFI находится не в обработчике ISR EEPROM, а в основной программе (см. workaround #2 и #1). И почему тогда работает workaround #3? По-моему либо баг, либо слабо документированная фича ;'(.
Произошло прерывание от EEPROM, началась обработка, она была прервана таймером, и после выхода из таймерной ISR продолжения обработки _прерывания_ EEPROM не происходит. Это нормально!?
Прошел почти год с момента написания автором этой статьи и, похоже, ситуация изменилась в лучшую сторону.
Сегодня продлил ОСАГО на мотоцикл в «ИНГОССТРАХ» в течении пяти минут. Из них минуты три ушло на дополнительные расчеты стоимости при страховании на 9 мес и на год (все-таки мото — это сезонная эксплуатация). Разница оказалась ~150 руб, так что полис взял годовой.
Сразу после оплаты по карте полис доступен для скачивания в личном кабинете. И, наверное, уже пришел мылом (не смотрел).
А нолик как передавать будем? С разрешенными прерываниями? А если в этот момент идет активный обмен по SPI, I2C и UART? Передача нолика может превратится в передачу RESET ;).
0.75с относилось к protothreads. Т.е. высокоуровневые задачи должны выполняться в фоне, а не «приняли запрос с SPI, выдали команду на 1wire, ждем 0.75с, прочитали ответ с 1wire, ответили на запрос по SPI». И высокоуровневая задача не одна, а несколько.
Кстати, Богатов попадает под «предоставление услуг связи без соответствующей лицензии». Его узел — телематические услуги связи чистейшей воды. И не важно, что они предоставлялись на безвоздмездной основе.
Итого, минимум два нарушения я уже вижу. Хотя конечно «призывы к беспорядкам» (или что там ему шьют?) это явный бред.
(блин, ответил не тому автору :)
И я выкладываю свое ружье около дома. Бери, стреляй, мне не жалко! Только почистить потом не забудь.
И вот какой-то нехороший человек взял мое ружье и пристрелил из него тещу/жену/любовницу/любовника.
Внимание, вопрос:
— что мне будет за то, что при помощи моего оружия было совершено преступление?
— чем принципиально данная ситуация отличается от ситуации с Богатовым?
N.B.
Я программист, а не юрист. Рассматриваю ситуацию с точки зрения общей логики.
1. Высокоуровневые функции (например bus search) на основе pthreads — в списке литературы под п. 4.
2. w1 3V3 (т.е. ссылку на п. 3 в списке литературы пропустили. Где там трехвольтовая 1-wire?)
3. PWM. bitbang исключаем сразу. Ибо это работа с запрещенными прерываниями в интервалах от 10 мкс (единица или чтение) до 120 мкс (передача нуля. С разрешенными прерываниями она может плавно перейти в передачу RESET). Если мк выполняет одну задачу (уровень ардуинщика) — это нормально. Для профессионала это уровень даже не junior.
4. DMA. Реализация по IRQ требует по 2 IRQ/бит (одно загрузка PWM, одно на запись результата, 16 IRQ на байт). Но экономит RAM. Выбирается по условиям компиляции. Если RAM не критична, но критично CPU — выбираем DMA (приблизительно 3 IRQ на байт).
5. Вменяемые люди на одну шину вешают не отключаемые датчики (напр. температуры), а на вторую отключаемые (напр. таблетки для кода доступа). Таймеров на камне дофига, по одному на каждую шину вполне можно выделить. А можно коммутировать сигнал одним полевиком.
И причем тут гальваническая развязка, если статья о программировании? Схему аппаратного драйвера (3) давно разобрали умные люди, и их советы давно учтены в production.
По третьему. Для своей задачи со своим конкретным камнем я нашел конкретные workarounds. Но этого нет в errata/reference/datasheet. Что стоило мне 2 недели рабочего времени. Это не нормально. Статья для того, чтобы другие не наступали на те же самые грабли. Плюс просьба проверить описанное поведение на других кристаллах семейства.
А что такое «несанкционированное изменение статусных битов»? Где в reference есть прямой запрет на изменение I1/I0 внутри ISR? Может быть мне еще запретят завершать ISR любым другим способом, кроме как по команде IRET?
P.S. olartamonov, а ты еще не любишь «arduino» в коммерческих проектах ;). Для atmel (имеется ввиду именно работа с голым железом, а не C++ обертка для чайников) пишешь, заглядывая одним глазком в datasheet, и все работает с первого раза. Когда у них крайний раз было обнаружено несоответствие описания функционированию реального железа? А STM-железо все-таки очень сырое. Несмотря на большое количество аппаратных плюшек.
Про безусловное засыпание при IRET с учетом только приоритета кода и без учета PC я уж вообще молчу. Просыпаться-то как будем? Восстановим регистры из стека и с таким набором продолжим обработку прерванной ISR?
(2) Да фиг с этим исполнением основного кода. Просто обнаруженное поведение не описано ни в reference, ни в errata. Вот я и спросил, «это у одного меня такие глюки, или сие есть баг/фича камня?».
2. После окончания записи байта/слова возможно нам понадобится записать следующий байт/слово. Это надо определить и инициировать следующую операцию. Несколько команд.
Для уменьшения времени пребывания в режиме запрещения прерываний вполне законно изменить текущий приоритет. И в этот момент произошло вложенное прерывание. Что тут не стандартного?
3. Проверяется, допустим, изменением состояния внешнего пина с просмотром результата на осциллографе. Либо изменением какой-либо ячейки памяти. Да, я уверен: вложенное прерывание остается.
Сегодня продлил ОСАГО на мотоцикл в «ИНГОССТРАХ» в течении пяти минут. Из них минуты три ушло на дополнительные расчеты стоимости при страховании на 9 мес и на год (все-таки мото — это сезонная эксплуатация). Разница оказалась ~150 руб, так что полис взял годовой.
Сразу после оплаты по карте полис доступен для скачивания в личном кабинете. И, наверное, уже пришел мылом (не смотрел).
0.75с относилось к protothreads. Т.е. высокоуровневые задачи должны выполняться в фоне, а не «приняли запрос с SPI, выдали команду на 1wire, ждем 0.75с, прочитали ответ с 1wire, ответили на запрос по SPI». И высокоуровневая задача не одна, а несколько.