Мультипотоковість в Embedded Linux. Частина 1

В цій статті буде описано що таке потоки, для чого вони потрібні і як ними користуватись. Роглянуто практичне застосування на мові С і в операційній системі Linux на одноплатному компютері BeagleBone Black.

BeagleBone Black

Основні терміни

Embedded Linux – операційна система Linux яка працює на різних пристроях –  роутерах, системах автоматики, смартфонах, планшетах та інш. В цій статті буде розглянуто приклад багатопотокового програмування в Angstrom Linux на одноплатному компютері BeagleBone Black. 

BeagleBone Blackодноплатний комп’ютер який працює на базі операційної системи Linux, має два RPU модулі для роботи з сигналами в реальному часі, графічний процесор для роботи з відео, 2 46-пінових конектора з виведеними сигналами GPIO, I2C, UART, CAN, є можливість підключення монітора, та багато іншого.

Потік ( Thread) – це спосіб розгалуження програми на окремі частини які можуть працювати паралельно і незалежно одна в одної. В багатопроцесорних та багатоядерних системах кожний потік може виконуватись на окремому процесорі або ядрі, в однопроцесорних процесор переключається між потоками, яким видається певний проміжок часу, керує цим процесом планувальник(Scheduler) операційної системи. Оскільки ці переключення відбуваєються дуже швидко із сторони користувача виглядає що потоки працюють паралельно. Аналогією потоків може бути наприклад автомобільний завод (програма) де кожний працівник (потік) займається своєю роботою паралельно в той самий час: хтось втановлює електорообладнання, хтось налаштовує двигун ще інший займається системою гальмування і т.д.

POSIX – це набір стандартів які описують інтерфеси між операційною системою та прикладною програмою, призначений для забезпечення сумісності різних Unix-подібних систем, та переносимості програм з одної операційної системи на інші. Іншими словами програма написана під Linux Ubuntu так само буде працювати на BeagleBone Black де може використовуватись Angstrom чи Debian.

Розглянемо приклад, нам потрібно мигати світлодіодом кожних 500mS, тобто 500mS світлодіод включений, 500mS виключений. Алгоритм роботи дуже простий, включаємо світлодіод, робимо затримку на потрібний нам час (в даному випадку 500mS), виключаємо його, далі знову переходимо на затримку. В цьому прикладі затримка –  це виконання циклу на потрібний нам час.

Такий приклад буде працювати,але є дуже не ефективним з двох причин:

  1. корисна робота, тобто включення/виключення світлодіоду займає дуже малий час (від кількох тактів процесора до мікросекунд) в порівнянні з часом затримки, під час якої не робиться ніякої корисної роботи, процесор повністю завантажений, а корисна робота мінімальна.
  2. В таку програму не можливо добавити ще один світлодіод з іншою частотою мигання, без зміни частоти першого.

Щоб збільшити ефективність, потрібно зменшити час роботи процесора в режимі. Для цього використовується інший підхід, програма розбивається на частини які працюють паралельно і ці частини не мають впливу одна на одну. Для цього використовуються потоки. Огранізація роботи потоків в мікроконтроллерах відбувається засобами FreeRTOS,.Chibi OS,eCos та ін., в комп’ютерах – QNX, VxWorks, Linux, Windows. Для роботи з потоками в Linux використовується бібліотека POSIX Thread. Тому необхідно її підключити #include “pthread.h

Робота з драйвером

В Linux всі драйвери пристроїв являють собою файли, і процес роботи з драйверами полягає в записі в файли та читання із них. Щоб побачити список доступних драйверів переходимо в папку class:

cd /sys/class

для відображення вмісту папки виконаємо команду

ls

linux_devices1

нам потрібний драйвер світлодіодів, тож перейдемо в папку leds та вивидемо її вміст . Всередині є 4 папки –  для кожного світлодіоду відповідно:

linux_devices2

для роботи доступно 7 файлів:

linux_devices3

нам потрібний файл, що відповідає за яскравість світлодіоду – brightnes. Для того щоб включити світлодіод потрібно записати “1”, виключити “0”. Це можна зробити командою echo 1 >> brightness

linux_devices4

Робота з потоками на С

для компіляції потрібно виконати команду:

gcc -pthread led.c -o led

./led – запускаємо програму на виконння, в консолі буде повідомлення що програма запустилась і працює. Зупинити її роботу можна комбінацією клавіш “CTRL” + “C”

Демонстрація роботи: мигання світлодіодів при запущеній програмі. Один мигає з періодом 200mS, інший – 500mS:

В наступній частині я розповім про використання потоків на мові Python.

Корисні лінки:

POSIX Threads Programming

Derek Molloy Electronics

Exploring BeagleBone: Tools and Techniques for Building with Embedded Linux