- Како РТОС ради?
- Термини који се често користе у РТОС-у
- Инсталирање Ардуино ФрееРТОС библиотеке
- Кружни дијаграм
- Пример Ардуино ФрееРТОС - Креирање задатака ФрееРТОС у Ардуино ИДЕ
- Имплементација задатка ФрееРТОС у Ардуино ИДЕ
ОС који се налази унутар уграђених уређаја назива се РТОС (оперативни систем у реалном времену). У уграђеним уређајима задаци у реалном времену су пресудни тамо где време игра веома важну улогу. Задаци у стварном времену су временски детерминистички значи да је време одзива на било који догађај увек константно, тако да се може гарантовати да ће се било који одређени догађај догодити у одређено време. РТОС је дизајниран за покретање апликација са врло прецизним временом и високим степеном поузданости. РТОС такође помаже у обављању више задатака са једним језгром.
Већ смо обрадили туториал о томе како се користи РТОС у уграђеним системима где можете знати више о РТОС-у, о разлици између ОС-а и РТОС-а за општу намену, различитим врстама РТОС-а итд.
У овом упутству ћемо почети са ФрееРТОС-ом. ФрееРТОС је класа РТОС-а за уграђене уређаје која је довољно мала да се може покретати на 8/16-битним микроконтролерима, иако његова употреба није ограничена на ове микроконтролере. Потпуно је отворен извор и његов код је доступан на гитхуб-у. Ако знамо неке основне концепте РТОС-а, онда је врло лако користити ФрееРТОС јер има добро документоване АПИ-је који се могу директно користити у коду без познавања позадинског дела кодирања. Комплетну ФрееРТОС документацију можете пронаћи овде.
Као што ФрееРТОС може радити на 8-битном МЦУ-у, тако се може покретати и на Ардуино Уно плочи. Морамо само да преузмемо ФрееРТОС библиотеку, а затим започнемо са применом кода помоћу АПИ-ја. Овај водич је намењен потпуном почетнику, испод су теме које ћемо обрадити у овом упутству за Ардуино ФрееРТОС:
- Како РТОС ради
- Неки често коришћени изрази у РТОС-у
- Инсталирање ФрееРТОС-а у Ардуино ИДЕ
- Како на примеру креирати ФрееРТОС задатке
Како РТОС ради?
Пре почетка рада са РТОС-ом, погледајмо шта је задатак. Задатак је део кода који се може извршити на ЦПУ. Дакле, ако желите да извршите неки задатак, онда га треба заказати коришћењем кашњења језгра или коришћењем прекида. Овај посао обавља Планер присутан у језгру. У једнојезгарном процесору, планер помаже извршавању задатака у одређеном временском одсеку, али чини се да се различити задаци извршавају истовремено. Сваки задатак се извршава према приоритету који му је дат.
Сада да видимо шта ће се догодити у РТОС језгру ако желимо да креирамо задатак за ЛЕД који трепће са интервалом од једне секунде и ставимо овај задатак на највећи приоритет.
Поред ЛЕД задатка, постојаће још један задатак који креира језгро, познат је као неактивни задатак. Неактивни задатак се креира када ниједан задатак није доступан за извршење. Овај задатак се увек изводи са најнижим приоритетом, тј. 0 приоритетом. Ако анализирамо горе дати графикон времена, може се видети да извршавање започиње ЛЕД задатком и ради одређено време, а затим преостало време, док се неактивни задатак извршава све док се не догоди прекид крпеља. Тада језгро одлучује који задатак треба извршити у складу са приоритетом задатка и укупним протеклим временом ЛЕД задатка. Када се заврши 1 секунда, језгро поново бира водећи задатак за извршење јер има већи приоритет од неактивног задатка, такође можемо рећи да ЛЕД задатак преузима неактивни задатак. Ако постоји више од два задатка са истим приоритетом, тада ће се они извршавати у кругу одређено време.
Испод дијаграма стања, јер приказује пребацивање неискоришћеног задатка у активно стање.
Сваки новостворени задатак прелази у стање приправности (део неактивног стања). Ако створени задатак (Задатак1) има највећи приоритет од осталих задатака, тада ће се пребацити у стање рада. Ако овај извршени задатак преузме други задатак, онда ће се поново вратити у стање приправности. Иначе ако је таск1 блокиран употребом АПИ-ја за блокирање, тада се ЦПУ неће укључити у овај задатак док не истекне временско ограничење које је дефинисао корисник.
Ако је Таск1 суспендован у активном стању помоћу суспендованих АПИ-ја, тада ће Таск1 прећи у суспендовано стање и није поново доступан планеру. Ако Таск1 наставите у суспендованом стању, он ће се вратити у стање приправности као што видите на блок дијаграму.
Ово је основна идеја како се задаци покрећу и мењају своја стања. У овом упутству ћемо имплементирати два задатка у Ардуино Уно користећи ФрееРТОС АПИ.
Термини који се често користе у РТОС-у
1. Задатак: То је део кода који се може извршити на ЦПУ.
2. Планер: Он је одговоран за одабир задатка са листе спремних стања у текуће стање. Планери се често примењују тако да заузимају све рачунарске ресурсе (као у балансирању оптерећења).
3. Превенција: То је чин привременог прекида већ извршеног задатка са намером да се уклони из активног стања без његове сарадње.
4. Пребацивање контекста: У превенцији заснованој на приоритетима, планер упоређује приоритет извршених задатака са приоритетом спремне листе задатака на сваком прекиду систиц-а . Ако на листи постоји било који задатак чији је приоритет већи од покретања задатка, долази до пребацивања контекста. У основи, у овом процесу се садржај различитих задатака чува у њиховој меморији стека.
5. Врсте политика заказивања:
- Превентивно заказивање: У овој врсти заказивања задаци се изводе са једнаким временским одсеком без узимања у обзир приоритета.
- Превентивно засновано на приоритету: Прво ће се покренути задатак са високим приоритетом.
- Заказивање кооперације: Пребацивање контекста ће се догодити само уз сарадњу извршених задатака. Задатак ће се изводити непрекидно док се не позове принос задатка.
6. Објекти језгра: За сигнализирање задатка да обави неки посао користи се процес синхронизације. За извођење овог процеса користе се Кернел објекти. Неки објекти језгра су догађаји, семафори, редови, мутек, поштански сандучићи итд. Видећемо како да користимо ове објекте у предстојећим водичима.
Из горње дискусије добили смо неке основне идеје о концепту РТОС-а и сада можемо да имплементирамо пројекат ФрееРТОС у Ардуину. Дакле, кренимо инсталирањем ФрееРТОС библиотека у Ардуино ИДЕ.
Инсталирање Ардуино ФрееРТОС библиотеке
1. Отворите Ардуино ИДЕ и идите на Скица -> Укључи библиотеку -> Управљање библиотекама . Потражите ФрееРТОС и инсталирајте библиотеку као што је приказано доле.
Можете преузети библиотеку са гитхуб-а и додати.зип датотеку у Скетцх-> Инцлуде Либрари -> Адд.зип датотеку.
Сада поново покрените Ардуино ИДЕ. Ова библиотека пружа неки пример кода, који се такође може наћи у Датотека -> Примери -> ФрееРТОС, као што је приказано доле.
Овде ћемо написати код испочетка да бисмо разумели рад, касније можете проверити примере кодова и користити их.
Кружни дијаграм
Испод је дијаграм кола за креирање трепћућег ЛЕД задатка помоћу ФрееРТОС-а на Ардуину:
Пример Ардуино ФрееРТОС - Креирање задатака ФрееРТОС у Ардуино ИДЕ
Погледајмо основну структуру за писање ФрееРТОС пројекта.
1. Прво, укључите датотеку заглавља Ардуино ФрееРТОС као
#инцлуде
2. Дајте прототип функције свих функција које пишете за извршење, а који су написани као
воид Таск1 (воид * пвПараметерс); воид Таск2 (воид * пвПараметерс); .. ….
3. Сада, у функцији воид сетуп () , креирајте задатке и покрените планер задатака.
За креирање задатка позива се кТаскЦреате () АПИ у функцији подешавања са одређеним параметрима / аргументима.
кТаскЦреате (ТаскФунцтион_т пвТаскЦоде, цонст цхар * цонст пцНаме, уинт16_т усСтацкДептх, воид * пвПараметерс, УБасеТипе_т укПриорити, ТаскХандле_т * пкЦреатедТаск);
Постоји 6 аргумената које треба проследити приликом креирања било ког задатка. Да видимо који су то аргументи
- пвТаскЦоде: То је једноставно показивач на функцију која имплементира задатак (у ствари, само име функције).
- пцНаме: Описни назив задатка. ФрееРТОС ово не користи. Укључен је искључиво у сврхе отклањања грешака.
- усСтацкДептх: Сваки задатак има свој јединствени стек који га језгро додељује задатку када се задатак креира. Вредност одређује број речи које стек може да садржи, а не број бајтова. На пример, ако је стек широк 32 бита и усСтацкДептх се преда као 100, тада ће у РАМ-у бити додељено 400 бајтова простора стека (100 * 4 бајта). Користите ово паметно, јер Ардуино Уно има само 2Кбајта РАМ-а.
- пвПараметерс: Улазни параметар задатка (може бити НУЛЛ).
- укПриорити: Приоритет задатка (0 је најнижи приоритет).
- пкЦреатедТаск: Може се користити за прослеђивање ручице задатку који се креира. Ова ручица се тада може користити за референцирање задатка у АПИ позивима који, на пример, мењају приоритет задатка или бришу задатак (може бити НУЛЛ).
Пример израде задатка
кТаскЦреате (задатак1, "задатак1", 128, НУЛЛ, 1, НУЛЛ); кТаскЦреате (задатак2, "задатак2", 128, НУЛЛ, 2, НУЛЛ);
Овде Таск2 има већи приоритет и стога се прво извршава.
4. Након креирања задатка, покрените планер у воид поставци помоћу вТаскСтартСцхедулер (); АПИ.
5. Воид лооп () функција остаће празна јер не желимо да било који задатак покрећемо ручно и бесконачно. Јер извршењем задатака сада се бави Планер.
6. Сада морамо имплементирати функције задатака и написати логику коју желите извршити унутар ових функција. Име функције требало би да буде исто као први аргумент АПИ-ја кТаскЦреате () .
воид таск1 (воид * пвПараметерс) { вхиле (1) { .. ..//ваша логика } }
7. Већини кода је потребна функција одлагања да би се зауставио извршени задатак, али у РТОС-у се не препоручује употреба функције Делаи () јер зауставља ЦПУ, а самим тим и РТОС престаје да ради. Дакле, ФрееРТОС има АПИ за језгро који блокира задатак на одређено време.
вТаскДелаи (цонст ТицкТипе_т кТицксТоДелаи);
Овај АПИ се може користити за одлагање. Овај АПИ одлаже задатак за задати број крпеља. Стварно време за које задатак остаје блокиран зависи од стопе крпеља. Константни портТИЦК_ПЕРИОД_МС може се користити за израчунавање реалног времена из стопе крпеља.
То значи да ако желите кашњење од 200мс, само напишите овај ред
вТаскДелаи (200 / портТИЦК_ПЕРИОД_МС);
Дакле, за ово упутство, ми ћемо користити ове ФрееРТОС АПИ-је за реализацију три задатка.
АПИ-ји који ће се користити:
- кТаскЦреате ();
- вТаскСтартСцхедулер ();
- вТаскДелаи ();
Задатак који треба створити за овај водич:
- ЛЕД трепће на дигиталном пину 8 са фреквенцијом 200мс
- ЛЕД трепће на дигиталном пину 7 са фреквенцијом 300мс
- Штампање бројева на серијском монитору са фреквенцијом од 500 мс.
Имплементација задатка ФрееРТОС у Ардуино ИДЕ
1. Из горњег објашњења основне структуре, додајте датотеку заглавља Ардуино ФрееРТОС. Затим направите прототипове функција. Како имамо три задатка, тако направите три функције и то су прототипови.
#инцлуде воид ТаскБлинк1 (воид * пвПараметерс); воид ТаскБлинк2 (воид * пвПараметерс); воид Таскпринт (воид * пвПараметерс);
2. У функцији воид сетуп () , иницијализујте серијску комуникацију брзином од 9600 бита у секунди и креирајте сва три задатка помоћу кТаскЦреате () АПИ. У почетку поставите приоритете свих задатака као „1“ и покрените роковник.
воид сетуп () { Сериал.бегин (9600); кТаскЦреате (ТаскБлинк1, "Таск1", 128, НУЛЛ, 1, НУЛЛ); кТаскЦреате (ТаскБлинк2, "Таск2", 128, НУЛЛ, 1, НУЛЛ); кТаскЦреате (Таскпринт, "Таск3", 128, НУЛЛ, 1, НУЛЛ); вТаскСтартСцхедулер (); }
3. Сада имплементирајте све три функције као што је приказано доле за ЛЕД лампицу таск1.
воид ТаскБлинк1 (воид * пвПараметерс) { пинМоде (8, ОУТПУТ); вхиле (1) { дигиталВрите (8, ХИГХ); вТаскДелаи (200 / портТИЦК_ПЕРИОД_МС); дигиталВрите (8, ЛОВ); вТаскДелаи (200 / портТИЦК_ПЕРИОД_МС); } }
Слично томе, примените функцију ТаскБлинк2. Функција Таск3 ће бити записана као
воид Таскпринт (воид * пвПараметерс) { инт бројач = 0; вхиле (1) { бројач ++; Сериал.принтлн (бројач); вТаскДелаи (500 / портТИЦК_ПЕРИОД_МС); } }
То је то. Успешно смо завршили ФрееРТОС Ардуино пројекат за Ардуино Уно. Пуни код можете пронаћи заједно са видео записом на крају овог водича.
На крају, повежите две ЛЕД диоде на дигитални пин 7 и 8 и отпремите код на своју Ардуино плочу и отворите серијски монитор. Видећете да бројач ради једном у 500 мс са називом задатка као што је приказано доле.
Такође, посматрајте ЛЕД диоде, које трепере у различитим временским интервалима. Покушајте да се играте са аргументом приоритета у функцији кТаскЦреате . Промените број и посматрајте понашање серијског монитора и ЛЕД диода.
Сада можете да разумете прва два примера кодова у којима се креирају задаци аналогног читања и дигиталног читања. На овај начин можете да направите више пројеката унапред користећи само Ардуино Уно и ФрееРТОС АПИ-је.