У чому полягають недоліки бітового вибуху SPI/I2C в вбудованих додатках

Я прийшов, щоб зрозуміти, що трохи стукати це жахлива практика, коли мова йде про SPI/I2C над GPIO. Чому так?

5

5 Відповіді

Біт-стукіт містить накладні витрати , які споживають цикли процесорів, які ви могли б використовувати в інших цілях. Це може мати помітний вплив на реакцію системи на інші події, а в жорсткій системі реального часу , може суттєво вплинути на здатність систем задовольняти терміни в реальному часі.

Якщо вбудований біт інтерфейс не має шкідливого впливу на продуктивність у реальному часі, то йому слід приділяти низький пріоритет, тож сам по собі буде недетермінованим з точки зору пропускної здатності даних і латентності.

Найбільш ефективна передача процесора досягається за допомогою апаратного інтерфейсу і передачі DMA для мінімізації накладних витрат. Біт-стук в протилежному крайніх.

Я б не сказав, що це було жахливо ; якщо у вашому додатку можна досягти швидкості реагування та обмежень у реальному часі, а використання біт-стукання, можливо, знижує вартість необхідної частини або дозволяє використовувати існуюче обладнання, наприклад, тоді це може бути цілком виправданим.

14
додано

Біт-стукіт є портативним, наприклад, див. Код I2C у драйверах ядра Linux. Ви можете отримати його і працює швидко, і це просто працює. Рішення, засновані на апаратному забезпеченні, взагалі не є та потребують часу, щоб встати і працювати і обмежені апаратною реалізацією. Не всі spi і, зокрема i2c, відповідають стандарту, який може бути реалізований в загальному апаратному рішенні. Ви завжди повинні бути в змозі відмовитися від біт.

Біт-стукіт споживає більше ресурсів процесора, що робить його небажаним з цього фронту. Він більш портативний або може бути в залежності від того, як написано, так що бажано на цьому фронті. Апаратне забезпечення SPI/I2C протилежне цим, відбирає частину накладних витрат процесора, не є портативним, не завжди достатньо гнучким для обробки всіх периферійних пристроїв.

Як професіонал, ви повинні бути комфортними з обома, так само, як і будь-який інший вбудований компроміс, який ви робите у своєму дизайні.

3
додано

Я не знаю, що це жахливо , але якщо у вас вже є SPI або I2C периферійні пристрої, то, безумовно, аргумент "не винаходити колесо" повинен бути зроблений проти бітів, особливо якщо ви можливо, у вашому коді є помилка - наприклад, ви можете зробити вибірку на неправильному краю годинника SPI, і в залежності від допусків і тестування пристрою, ви можете не помітити це, поки ви вже не працюєте. У статті wikipedia також зазначається, що ви використовуєте додаткову обчислювальну потужність, і ви, ймовірно, збираєтеся ввести джиттер в будь-які сигнали, які ви виробляєте.

Все, що сказано, біт-стукання є єдиним доступним вибором, якщо ваше обладнання не має вбудованого периферійного пристрою, або якщо він вже використовується іншими пристроями, наприклад, якщо вбудований SPI периферійний пристрій використовується пристроєм з високою пропускною здатністю, з яким ви повинні постійно спілкуватися, можливо, ви б'єте інший пристрій SPI, який не повинен бути таким у реальному часі у вашому додатку.

3
додано

У системі, що не працює в реальному часі, неможливо виконати біт. І якщо ви помістите його всередину ядра, яке не переривається, то вам доведеться переконатися, що перед переплануванням процесів користувача тільки бітбанг певної кількості бітів.

Розглянемо це: у вас є таймер планування, який працює з інтервалом 1/1000s. Коли він запускається, ви перевіряєте, чи хоче якийсь процес надсилати дані через інтерфейс, що має біт, і ви обробляєте цей запит. Запит вимагає біт-байт на байт 9600 бод (як приклад). Тепер у вас виникла проблема: потрібно 0,8 мс до біта байта. Ви не можете собі це дозволити, тому що коли планування переривання запускається, воно повинне виконувати свою роботу і завантажувати наступний процес, який потрібно виконати, а потім вийти. Зазвичай це займає набагато коротший час, ніж 1 мс і що 1 мс в основному витрачається на запуск процесу користувача до наступного переривання. Але якщо ви починаєте бітбанг, то ви в основному витрачаєте, що мс нічого не роблять.

Одним з рішень для цього може бути використання периферійного пристрою таймера тільки для цілей, що використовуються для бітування. Це дасть досить автономний і керований перериванням бітбанг-код, який зовсім не повинен сидіти бездіяльно - але це тільки за рахунок використання виділеного таймера. Якщо ви можете присвоїти спеціальний апаратний таймер, то бітбанг може, мабуть, працювати чудово. Але в цілому дуже важко зробити надійне бітбанг на високих швидкостях у багатозадачному середовищі.

0
додано

Це не було б названо жахливим. Але так, коли ми реалізуємо протокол, використовуючи біт-стукіт, дуже ймовірно, що контролер пропуститиме виконання іншого, більш важливого завдання, оскільки протокол може споживати більше процесорного часу, ніж те, що було б витрачено виділеним апаратним забезпеченням. ТО, слід уникати в середовищі реального часу або, скажімо, в критичному для часу середовищі Поряд з цим, є ще одна проблема з біт-стукати, як правило, під час читання від і/або писати на контакт, сигнал, що виробляється, як правило, більше тремтіння або збої, особливо якщо контролер також виконує інші завдання під час спілкування .. \ t все це неминуче використовувати для біт-стукання, то, принаймні, намагайтеся використовувати їх з перериваннями замість опитування.

0
додано