Sunteți pe pagina 1din 9

Capitolul 16

SISTEMUL DE OPERARE N TIMP REAL


UCOS-II
16.1. Introducere
n urmtoarele patru capitole va fi prezentat o categorie special de
aplicaii cu microcontroler i anume aceea a sistemelor de timp real. Dintre
caracteristicile principale ale acestor sisteme amintim procesare concurent,
interaciunea cu mediul nconjurtor i reacie la evenimente ntr-un timp stabilit la
care putem aduga nivel de ncredere ridicat, posibilitatea de reconfigurare,
uurina n utilizare, conformitatea cu anumite certificri, respectarea unor
constrngeri i capacitatea de evoluie.
Pentru implementarea unor astfel de aplicaii este de multe ori util
folosirea unui nucleu sau sistem de operare de timp real (RTOS). Un sistem de
operare de timp real care ofer unui dezvoltator de aplicaii de timp real o
planificare a execuiei programului bazat pe constrngeri stricte de timp,
gestionarea resurselor sistemului i un suport important pentru dezvoltarea acestui
tip de aplicaii.
Din multitudinea de sisteme de operare de timp real existente pe piaa
dezvoltatorilor de aplicaii cu microcontrolere am ales sistemul de operare uCOS-II
din urmtoarele motive:
- este un sistem de operare gratuit pentru scrierea de aplicaii n scop
necomercial;
- este scris n limbajul C ceea ce a fcut s fie adaptat pentru o ntreag
gam de procesoare i microcontrolere i care permite dezvoltarea cu
uurin a aplicaiilor de timp real. De asemeni, programele scrise pentru
un procesor sau microcontroler pot fi transferate cu efort minim pe sisteme
cu alte tipuri de microprocesor sau microcontroler;
- dimensiunea codului executabil rezultat este mic ceea ce permite
utilizarea lui i pe sisteme cu microcontrolere avnd resurse reduse de
memorie cum este cazul celor utilizate de ctre autori n ultimii ani n
cadrul orelor de aplicaii (PIC18 i MC9S12C32);
- este bine documentat n cri publicate de principalul dezvoltator al
sistemului de operare.
n aceast parte a crii va fi prezentat o scurt introducere n dezvoltarea
aplicaiilor cu microcontrolere din familia HC12 folosind sistemul de operare
uCOS-II. La fiecare capitol se vor prezenta cteva noiuni generale privind
elementele sistemelor de operare de timp real dup care se va arta modul n care
acestea au fost definite i pot fi folosite n cadrul sistemului uCOS-II. Pentru
aceasta se indic funciile ce pot fi apelate n legtur cu aceste structuri dndu-se
198

16.2. Adaptarea sistemului uCOS-II la un anumit tip de microcontroler

i structuri ale codului ce trebuie inclus n aplicaia general. La sfritul fiecrui


capitol sunt date unul sau mai multe exemple care prezint aplicaii simple ce
demonstreaz unele din utilizrile acestor structuri i de la care se poate porni n
dezvoltarea aplicaiilor de complexitate ridicat.

16.2. Adaptarea sistemului uCOS-II la un anumit tip de


microcontroler
Sistemul de operare uCOS-II este un sistem de operare pentru aplicaii de
timp real. El a fost conceput astfel nct s poat fi adaptat pentru diverse
microprocesoare sau microcontrolere existente pe pia. Pentru ca aceast adaptare
s fie ct mai simpl, cea mai mare parte a sistemului de operare este scris n
limbajul C. Avnd n vedere c fiecare microprocesor sau microcontroler are o
arhitectur particular, cteva din funciile sistemului de operare trebuie s in
cont de aceste particulariti i ca atare, trebuiesc scrise n limbajul de asamblare
specific microprocesorului sau microcontrolerului folosit n cadrul aplicaiei.
Procesul de adaptare a sistemului de operare pentru un anumit microprocesor sau
microcontroler are n vedere tocmai scrierea acestor funcii. Trebuie menionat
faptul c pe pagina web a firmei Micrium exist adaptrile sistemului de operare
uCOS-II pentru o gam larg de procesoare i microcontrolere utilizate n cele mai
diverse aplicaii.
Funcionarea sistemului de operare uCOS-II pe un microprocesor sau
microcontroler necesit un minim de resurse de memorie. Ca urmare exist, n
special n cazul microcontrolerelor, familii de componente care nu pot executa
sistemul de operare uCOS-II.
Pentru a adapta i utiliza sistemul uCOS-II, microprocesorul sau
microcontrolerul trebuie s satisfac urmtoarele condiii:
- avnd n vedere c uCOS-II este scris n limbajul C, trebuie s avem la
dispoziie un compilator C pentru procesorul utilizat. n plus, codul generat
trebuie aib proprietatea de revenire;
- ntreruperile trebuie s poat fi activate i dezactivate din C;
- procesorul trebuie s aib ntreruperi i poate furniza o ntrerupere care s
apar la intervale regulate (n mod normal cu o frecven de 10 pn la
100 Hz);
- procesorul suport o stiv hardware de dimensiuni relativ mari (mai muli
kilooctei).
- procesorul are instruciuni care s realizeze ncrcarea i stocarea
pointerului de stiv i a celorlalte registre ale procesorului fie ntr-o stiv,
fie n memorie.
n figura 16.1 sunt prezentate componentele sistemului de operare i modul
n care interacioneaz acestea cu partea hardware i cu programele de aplicaie.
Dup cum vedem la sistemul de operare uCOS-II pot fi identificate trei
componente. O prim component este cea care face legtura dintre celelalte dou
pri i structura hardware a procesorului sau microcontrolerului. Aceasta este
199

SISTEMUL DE OPERARE N TIMP REAL uCOS-II

partea care trebuie adaptat i n care vom ntlni linii de cod scrise i n limbajul
de asamblare al procesorului sau microcontrolerului pentru care se face adaptarea.
Partea independent de procesor este partea unde sunt definite structurile,
obiectele i serviciile sistemului de operare de timp real i care se regsesc ntr-un
numr de fiiere care vor fi identice pentru aplicaiile scrise, indiferent de
procesorul utilizat.
O a treia parte este cea care permite adaptarea sistemului de operare la
aplicaia n care acesta este utilizat. Aceasta va fi specific fiecrei aplicaii
preciznd structura selectat pentru sistemul de operare.
n tabelul 16.1 sunt date fiierele aferente sistemului uCOS-II.

Programul de aplicaie

uCOS-II
partea independent de
procesor

uCOS-II
partea specific aplicaiei

uCOS-II
partea specific procesorului

Hardware

Figura 16.1. Componentele uCOS-II i interaciunea dintre acestea, hardware


i programele de aplicaie.
Tabelul 16.1. Lista fiierelor surs a sistemului de operare.
Nume
Coninut
Fiierul de referin pentru configurarea sistemului de operare
os_cfg_r.h
Funcii ale nucleului SO
os_core.c
Constante i funcii necesare depanrii programelor
os_dbg_r.c
Funcii ce implementeaz indicatorii de eveniment
os_flag.c
Funcii ce implementeaz structurile de tip cutie de scrisori
os_mbox.c
Funcii pentru gestionarea memoriei
os_mem.c
Funcii ce implementeaz semafoarele cu excludere mutual (mutex)
os_mutex.c
Funcii ce implementeaz structurile de tip coad
os_q.c
Funcii ce implementeaz structurile de tip semafor
os_sem.c
Funcii asociate proceselor
os_task.c
Funcii asociate timpului
os_time.c
Funcii ce implementeaz temporizatoarele
os_tmr.c
Folosete directive #include pentru a include fiierele anterioare
ucos_ii.c
Fiierul ce conine constantele i prototipurile de funcii ale SO
ucos_ii.h

200

16.2. Adaptarea sistemului uCOS-II la un anumit tip de microcontroler

Pentru realizarea adaptrii sistemului de operare uCOS-II la un anumit


procesor sau microcontroler trebuiesc create i/sau modificate fiierele date n
tabelul 16.2:
Tabelul 16.2. Lista fiierelor ce trebuiesc adugate sau modificate n vederea adaptrii
pentru un anumit procesor.
Nume
Coninut/Modificare
Tip
Fiier de definiii (header) care este inclus n toate fiierele Nou
includes.h
.c. Va include celelalte fiiere de definiii ale sistemului i
fiiere de definiii ale utilizatorului
Fiierul de configurare a sistemului de operare. Se obine
Modificat
os_cfg.h
prin copierea os_cfg_r.h sub noul nume i modificarea
valorilor elementelor configurabile
Funcii ale nucleului SO. Modificri specifice
Modificat
os_core.c
microcontrolerului legate de memoria acestuia
Fiier de definiii specific microcontrolerului
Nou
os_cpu.h
Fiier care conine codul surs pentru funciile specifice
Nou
os_cpu_c.c
microcontrolerului
Fiierul ucos_ii.c modificat ca s includ versiunile
Modificat
ucos_ii.c
modificate ale lui os_core.c i fiierul includes.h
Fiierul de definiii al sistemului de operare. Modificri ce Modificat
ucos_ii.h
in de limitrile existente la nivel de capacitate de
memorie

Modificrile care trebuiesc fcute sunt urmtoarele


stabilirea valorii constantei ce indic modul de cretere a stivei
(OS_CPU.H): OS_STK_GROWTH.
declararea a 10 tipuri de date (OS_CPU.H)
introducerea a 3 definiii macro (OS_CPU.H):
OS_ENTER_CRITICAL(), OS_EXIT_CRITICAL(), OS_TASK_SW().
scrierea a ase funcii simple n limbaj C (OS_CPU.C): OSTaskStInit(),
OSTaskCreateHook(), OSTaskDelHook(), OSTaskSwHook(),
OSTaskStatHook(), OSTimeTickHook().
scrierea a 4 funcii n limbaj de asamblare (OS_CPU_A.ASM) sau n
limbaj C n cazul n care compilatorul C permite introducerea de cod n
limbaj de asamblare: OSStartHighRdy(), OSCtxSw(), OSIntCtxSw(),
OSTickISR().
Pentru demonstraiile din aceast carte vom folosi adaptarea realizat de
ctre Abderrahmane Assal pentru microcontrolerele din familia M68HC12 i
compilatorul Metrowerks CodeWarrior disponibil pe pagina web a companiei
Micrium (http://micrium.com/download/M68HC12-V42-CODEWARRIOR.zip).
Compilatorul de la Metrowerks permite introducerea de cod scris n limbaj
de asamblare prin utilizarea cuvntului rezervat asm sau __asm. Cea de a doua
variant este folosit n cazul n care se dorete ca programul scris s fie conform
standardului ANSI (cazul n care se utilizeaz opiunea compilator ANSI).

201

SISTEMUL DE OPERARE N TIMP REAL uCOS-II

Compilatorul include un asamblorul de nivel nalt pentru instruciunile


scrise n limbaj de asamblare incluse n codul n limbaj C. Acest asamblor permite
combinarea codului n limbaj C cu cel scris n limbaj de asamblare fr a mai fi
nevoie de separarea celor dou tipuri de coduri n fiiere separate i legarea
acestuia de restul codului scris n limbaj C. Asamblorul de nivel nalt poate accesa
variabilele locale i globale declarate n partea de cod scris n limbaj C permind
scrierea cu uurin a unor funcii care s beneficieze de viteza mare de execuie i
dimensiunea redus a codului scris n limbaj de asamblare.
n figura 16.2 este prezentat codul funciei OSCtxSw care este apelat
atunci cnd devine gata de execuie un proces cu o prioritate mai mare dect cel
care este n execuie.
void OSCtxSw(void)
{
__asm{
ldx OSTCBCur
;
sts 0,x
;
}
#if OS_CPU_HOOKS_EN > 0
OSTaskSwHook();
/*
#endif
__asm{
ldx OSTCBHighRdy
;
stx OSTCBCur
;
ldab OSPrioHighRdy
;
stab OSPrioCur
;
lds 0,x
;
}
} void OSCtxSw(void)
{
__asm{
ldx OSTCBCur
;
sts 0,x
;
}
#if OS_CPU_HOOKS_EN > 0
OSTaskSwHook();
/*
#endif
__asm{
ldx OSTCBHighRdy
stx OSTCBCur
ldab OSPrioHighRdy
stab OSPrioCur
lds 0,x
}
}

;
;
;
;
;

3~, OSTCBCur->OSTCBStkPtr = Stack Pointer


3~

4~, Invoke user defined context switch hook */

3~, OSTCBCur = OSTCBHighRdy


3~
3~, OSPrioCur = OSPrioHighRdy
3~
3~, Load SP into 68HC12

3~, OSTCBCur->OSTCBStkPtr = Stack Pointer


3~

4~, Invoke user defined context switch hook */

3~, OSTCBCur = OSTCBHighRdy


3~
3~, OSPrioCur = OSPrioHighRdy
3~
3~, Load SP into 68HC12

Figura 16.2. Codul funciei OSCtxSw.

16.3. Instalarea i configurarea sistemului de operare


uCOS-II
Pentru a uura scrierea codului aplicaiilor folosind sistemul de operare
uCOS-II este bine ca fiierele coninnd codul sistemului i ale aplicaiei s fie
202

16.3. Instalarea i configurarea sistemului de operare uCOS-II

organizate n directoare separate. Fiierele C independente de microcontroler vor fi


puse ntr-un director pe care noi l-am denumit ucosSource. Acestea fiiere nu vor fi
modificate i vor fi compilate o singur dat.
Fiierele de adaptare, fiierul de configurare a sistemului de operare i
fiierul coninnd codul aplicaiei se vor pune ntr-un director separat pe care noi lam denumit Sources (vezi figura 16.3). n cazul unei aplicaii de complexitate mai
mare, fiierele aplicaiei pot fi organizate la rndul lor n mai multe directoare. Se
va avea grij ca aceste fiiere s fie adugate proiectului astfel nct s fie luate n
considerare la compilare n mod automat.

Figura 16.3. Structura proiectului utiliznd sistemul de operare uCOS-II.

Se va avea grij ca directorul ucosSource i celelalte directoare care se vor


crea pentru fiierele aplicaiei s fie adugat n lista directoarelor pentru cutarea
fiierelor surs aa cum se vede n figura 16.4.
Sistemul de operare uCOS-II a fost scris astfel nct el s poat fi
configurat conform aplicaiei n care este folosit. Analiznd coninutul fiierului de
configurare al sistemului de operare uCOS-II dat n figura 16.5 putem vedea c n
cazul unei aplicaii configurarea are n vedere urmtoarele aspecte:
- configurri generale ale sistemului de operare cum ar fi nivelul minim de
prioritate ce poate fi atribuit unui proces (OS_LOWEST_PRIO), numrul
de tacte generate (OS_TICKS_PER_SE);
203

SISTEMUL DE OPERARE N TIMP REAL uCOS-II

validarea utilizrii unui anumit tip de obiect de timp real, de exemplu


OS_MBOX_EN pentru cutii potale i OS_SEM_EN pentru semafoare);
stabilirea numrului maxim dintr-un anumit tip de obiecte (de exemplu
OS_MAX_MEM_PART pentru numrul maxim de partiii de memorie i
OS_MAX_TASKS pentru numrul maxim de procese ce pot fi create n
cadrul aplicaiei);
configurarea obiectelor de timp real (de exemplu de la OS_MBOX_EN la
OS_MBOX_QUERY_EN pentru cutiile potale);
validarea i configurarea unor servicii ale sistemului de operare cum ar fi
cele privind depanarea programelor (OS_DEBUG_EN), managementul
memoriei sistemului (de la OS_MEM_EN la OS_MEM_NAME_SIZE)
sau a managementului timpului (de la OS_TIME_DLY_HMSM_EN la
OS_TIME_TICK_HOOK_EN).

Figura 16.4. Configurarea cilor de acces ale compilatorului.

/* ---------------------- MISCELLANEOUS ----------------------- */


#define OS_ARG_CHK_EN
1 /* Enable (1) or Disable (0) argument checking
#define OS_CPU_HOOKS_EN
1 /* uC/OS-II hooks are found in the processor port files

*/
*/

#define OS_DEBUG_EN

*/

/* Enable(1) debug variables

#define OS_EVENT_NAME_SIZE 32 /* Determine the size of the name of a Sem, Mutex, Mbox or Q*/
#define OS_LOWEST_PRIO

63

/* Defines the lowest priority that can be assigned ...


/* ... MUST NEVER be higher than 63!

204

*/
*/

16.3. Instalarea i configurarea sistemului de operare uCOS-II


#define OS_MAX_EVENTS
#define OS_MAX_FLAGS
#define OS_MAX_MEM_PART
#define OS_MAX_QS
#define OS_MAX_TASKS
#define OS_SCHED_LOCK_EN

10 /* Max. number of event control blocks in your application


5 /* Max. number of Event Flag Groups in your application
5 /* Max. number of memory partitions
4 /* Max. number of queue control blocks in your application
20 /* Max. number of tasks in your application, MUST be >= 2
1

*/
*/
*/
*/
*/

/*Include code for OSSchedLock() and OSSchedUnlock() */

#define OS_TASK_IDLE_STK_SIZE 128 /* Idle task stack size (# of OS_STK wide entries)

*/

#define OS_TASK_STAT_EN
1 /* Enable (1) or Disable(0) the statistics task
*/
#define OS_TASK_STAT_STK_SIZE
128 /* Statistics task stack size (# of OS_STK wide entries)*/
#define OS_TASK_STAT_STK_CHK_EN 1 /* Check task stacks from statistic task
*/
#define OS_TICK_STEP_EN
#define OS_TICKS_PER_SEC

1
20

/* Enable tick stepping feature for uC/OS-View


/* Set the number of ticks in one second

*/
*/

/* ----------------------- EVENT FLAGS ------------------------ */


#define OS_FLAG_EN
1 /* Enable (1) or Disable (0) code generation for EVENT FLAGS*/
#define OS_FLAG_WAIT_CLR_EN 1 /* Include code for Wait on Clear EVENT FLAGS
*/
#define OS_FLAG_ACCEPT_EN
1 /* Include code for OSFlagAccept()
*/
#define OS_FLAG_DEL_EN
1 /* Include code for OSFlagDel()
*/
#define OS_FLAG_NAME_SIZE
32 /* Determine the size of the name of an event flag group
*/
#define OS_FLAG_QUERY_EN
1 /* Include code for OSFlagQuery()
*/
/* -------------------- MESSAGE MAILBOXES --------------------- */
#define OS_MBOX_EN
1 /* Enable (1) or Disable (0) code generation for MAILBOXES*/
#define OS_MBOX_ACCEPT_EN
1 /* Include code for OSMboxAccept()
*/
#define OS_MBOX_DEL_EN
1 /* Include code for OSMboxDel()
*/
#define OS_MBOX_POST_EN
1 /* Include code for OSMboxPost()
*/
#define OS_MBOX_POST_OPT_EN 1 /* Include code for OSMboxPostOpt()
*/
#define OS_MBOX_QUERY_EN
1 /* Include code for OSMboxQuery()
*/

/* --------------------- MEMORY MANAGEMENT -------------------- */


1 /* Enable (1) or Disable (0) code generation for MEMORY
MANAGER */
#define OS_MEM_QUERY_EN
1 /* Include code for OSMemQuery()
*/
#define OS_MEM_NAME_SIZE
32 /* Determine the size of a memory partition name
*/
#define OS_MEM_EN

/* ---------------- MUTUAL EXCLUSION SEMAPHORES --------------- */


#define OS_MUTEX_EN
1 /* Enable (1) or Disable (0) code generation for MUTEX
#define OS_MUTEX_ACCEPT_EN
1 /* Include code for OSMutexAccept()
#define OS_MUTEX_DEL_EN
1 /* Include code for OSMutexDel()
#define OS_MUTEX_QUERY_EN
1 /* Include code for OSMutexQuery()

*/
*/
*/
*/

/* ---------------------- MESSAGE QUEUES ---------------------- */


#define OS_Q_EN
1 /* Enable (1) or Disable (0) code generation for QUEUES
*/
#define OS_Q_ACCEPT_EN
1 /* Include code for OSQAccept()
*/
#define OS_Q_DEL_EN
1 /* Include code for OSQDel()
*/
#define OS_Q_FLUSH_EN
1 /* Include code for OSQFlush()
*/
#define OS_Q_POST_EN
1 /* Include code for OSQPost()
*/
#define OS_Q_POST_FRONT_EN
1 /* Include code for OSQPostFront()
*/
#define OS_Q_POST_OPT_EN
1 /* Include code for OSQPostOpt()
*/
#define OS_Q_QUERY_EN
1 /* Include code for OSQQuery()
*/

205

SISTEMUL DE OPERARE N TIMP REAL uCOS-II


/* ------------------------ SEMAPHORES ------------------------ */
#define OS_SEM_EN
1 /* Enable (1) or Disable (0) code generation for SEMAPHORES
#define OS_SEM_ACCEPT_EN 1 /* Include code for OSSemAccept()
#define OS_SEM_DEL_EN
1 /* Include code for OSSemDel()
#define OS_SEM_QUERY_EN 1 /* Include code for OSSemQuery()

*/
*/
*/
*/

/* --------------------- TASK MANAGEMENT ---------------------- */


#define OS_TASK_CHANGE_PRIO_EN 1 /* Include code for OSTaskChangePrio()
#define OS_TASK_CREATE_EN
1 /* Include code for OSTaskCreate()
#define OS_TASK_CREATE_EXT_EN 1 /* Include code for OSTaskCreateExt()
#define OS_TASK_DEL_EN
1 /* Include code for OSTaskDel()
#define OS_TASK_NAME_SIZE
32 /* Determine the size of a task name
#define OS_TASK_PROFILE_EN
1 /* Include variables in OS_TCB for profiling
#define OS_TASK_QUERY_EN
1 /* Include code for OSTaskQuery()
#define OS_TASK_SUSPEND_EN
1 /* Include code for OSTaskSuspend() and
OSTaskResume() */
#define OS_TASK_SW_HOOK_EN
1 /* Include code for OSTaskSwHook()

*/

/* --------------------- TIME MANAGEMENT ---------------------- */


#define OS_TIME_DLY_HMSM_EN
1 /* Include code for OSTimeDlyHMSM()
#define OS_TIME_DLY_RESUME_EN 1 /* Include code for OSTimeDlyResume()
#define OS_TIME_GET_SET_EN
1 /* Include code for OSTimeGet() and OSTimeSet()
#define OS_TIME_TICK_HOOK_EN
1 /* Include code for OSTimeTickHook()

*/
*/
*/
*/

typedef INT16U

*/

OS_FLAGS;

/* Date type for event flag bits (8, 16 or 32 bits)

*/
*/
*/
*/
*/
*/
*/

Figura 16.5. Fiierul de configurare a sistemului de operare uCOS-II.

Modificnd parametrii precizai n acest fiier, se asigur c executabilul


care se va genera va cuprinde doar codul necesar aplicaiei astfel nct s fie
consumat doar cantitatea de memorie necesar aplicaiei. Acest lucru este necesar
n primul rnd n cazul microcontrolerelor la care cantitatea de memorie este
limitat.

Note bibliografice
[1]
Q. Li, C. Yao, Real Time Concepts for Embedded Systems, CMP Books,
Lawrence, KS, 2003.
nd
[2]
J.J. Labrosse, MicroC/OS-II: The Real-Time Kernel, 2 Edition, CMP Books,
Lawrence, KS, 2002.
[3]
J.J. Labrosse, uC/OS-III, The Real-Time Kernel, or a High Performance, Scalable,
ROMable, Preemptive, Multitasking Kernel for Microprocessors, Microcontrollers & DSPs,
Micrium Press, Weston, FL, 2009)
[4]
A. Assal, MicroC/OS-II, The Real-Time Kernel, Motorola 68HC12 Port for
Metrowerks Codewarrior, University of Ottawa, September 2003.
[5]
J.J. Labrosse, Embedded System Building Blocks. Complete and Ready to Use C
Modules, R&D Books, Lawrence, KS, 2000.

206