Softver

Autor: Stevan Tošić, dipl. ing.

 

 


cMCX11 Real Time operativni sistem u programskom jeziku C


Asembler je brz, C je elegantan. Kombinovanjem ova dva programska jezika na pravi način mogu se dobiti aplikacije kvalitetnije nego korištenjem svakog ponaosob. U real-time operativnim sistemima jezgo ili kernel se obično pravi u asembleru, a ostali deo koda u C-u kako bi se iskoristile prednosti i asemblera i C-a.

Programski jezik C je odavno zauzeo svoje mesto u embedid aplikacijama. Prednosti C-a naročito dolaze do izražaja pri izradi složenijih programa. Istina je da programiranje u asembleru maksimalno koristi resurse mikrokontrolera, ali je na mestu pitanje kako ćete nekom drugom objasniti šta ste (ili kako) nešto isprogramirali. U timskom radu ova činjenica može biti vrlo otežavajuća okolnost. Ovde je reč o izvesno transformaciji RTOS MCX11 koji je napisan u asembleru (IAS11 gdje slovo I označava firmu ImageCraft), u programski jezik C (ImageCraftov kompajler ICC11). Dakle, novi RTOS se zove cMCX11, gde prefiks c simbolizira jezik C. Ideja je bila (i ostvarena) da se iskoristi postojeći MCX11 koji je napisan u asmebleru, odnosno da se uradi »omotač« oko asemblerskog kernela kako bi se taskovi mogli programirati u C-u. Reč omotač je uvedena kako bi sugerisala da se na izvestan način sakriva asemblerski kod. Konkretno, dati omotač je u stvari datoteka MCX_LIB.C u kojoj su definisane funkcije u jeziku C, a koje sada zamenjuju kod napisan u asmebleru. Drugim rečima, pišemo kod u C-u, a u izvršava se u stvari »sakriveni« asemblerski kod. 

Poređenje

Pogledajmo neke delove datoteke MCX_LIB.C. Funkcija .wait. koja se u asembleru poziva sa:

ldab #SEMA_x
swi
FCB .wait.

u C-u se poziva sa:

mcxWait(SEMA_x);.

Dakle, tri linije programskog koda u asembleru se zamenjuju sa jednom naredbom u jeziku C. Dalje se neće navoditi primeri za ostale funkcije (sveukupno postoji 15 funkcija). Namera je bila da se kratko uporede ova dva načina. Radi pojašnjenja kako se koristi cMCX11 , pogledajmo delove unutar omotača. Gornja funkcija (uzgred vredi napomenuti i fundamentalna) .wait. je realizovana (datoteka MCX_LIB.C) na sledeći način: 

void mcxWait(int semaid)
{
asm(» ldab 3,x »);
asm(» swi »);
asm(» fcb1 »);
}.

Asemblerske funkcije su napisane u C. 


Jednostavnost 


Za pisanje programa nije potrebno poznavati unutrašnjost datoteke MCX_LIB.C. Jedino je bitno da se odgovarajući parametri pri pozivu pravilno proslede po tipu i redosledu. Poređenja radi, navodi se program sa taskovim iz prošlog broja zajedno sa novim programom koji je napisan u C-u (Listing 1. i 2.).

LISTING 1. Programski jezik C
#include "mcx_lib.c"
#include "6811regs.h"

#define TSK1 1 /* Taskovi */
#define TSK2 2
#define TSK3 3
#define SELF 0

#define Sem1 1 /* Semafori */
#define Sem2 2
#define Sem3 3

int main(void)
{
asm(" jmp 0x9000 ");    /* Prvo se pokrece Kernel Start-up */
return 0;
}

void Task1(void)
{
TCTL2=0x28; /* Podesavanje IC1 i IC2 */
TFLG1|=0x06;
TMSK1|=0x06;

DDRG=0xFF; /* PORTG je izlazni */
PORTG=0x00;

mcxExecute(TSK2); /* Pokreni task 2 */
mcxDelay(0,0,2000/49); /* Kasni 2 sek. */
PORTG|=0x01; /* PG0 - ON */
mcxWait(Sem1); /* Cekaj */
PORTG&=~0x01; /* PG0 - ON */

mcxExecute(TSK3); /* Pokreni task 3             */
mcxTimer(TSK3,Sem3,1500/49); /* Task 3,Semafor 3, 1.5 sek */
mcxTerminate(SELF); /* Kraj */
}

void Task2(void) /* PG0 */
{
static char i;
mcxWait(Sem2); /* Cekaj Semafor 2 */
for(i=0;i<5;i++){
     mcxDelay(0,0,667/49); /* Delay 2/3 sek */
     PORTG|=0x02; /* PG0 - ON */
     mcxDelay(0,0,333/49); /* Delay 1/3 sek */
     PORTG&=~0x02; /* PG0 - OFF */
     prikaz(i);
}
mcxTerminate(SELF); /* Kraj */
}

void Task3(void) /* PG1 */
{
mcxWait(Sem3); /* Cekaj na Semaforu 3 */
PORTG|=0x04; /* PG2 - ON */
mcxDelay(0,0,3000/49); /* Kasni 3 sek */
PORTG&=~0x04; /* PG2 -OFF */
mcxTerminate(SELF); /* Kraj */
}
LISTING 2. Asembler
tsk1 <inicijalizacija SPI komunikacije, inicijalizacija IC1 i IC2 i
       def. porta G kao izlaznog>

       ldaa #T2 ; pokreni T2
       swi
       FCB .execute.

       clra ; čekaj 2 sek.
       clrb
       ldx #2000/49
       swi
       FCB .delay.

       ldaa PORTG ; pali PG0
       oraa #$01
       staa PORTG

       ldab #SEMA_1 ; čekaj IC1
       swi
       FCB .wait.

       ldaa PORTG ; gasi PG0
       anda #$FE
       staa PORTG

       ldaa #T3 ; pokreni task 3
       swi
       FCB .execute.

       ldaa #T3 ; postavi tajmer
       ldab #SEMA_3 ; za task 4
       ldx #1500/49 ; 1.5 sek.
       swi
       FCB .timer.

       clra ; kraj taska 2
       swi
       FCB .terminate.

tsk2  ldab #SEMA_2 ; cekaj IC2
       swi
       FCB .wait.

       clr BROJ ; brojac na 0
LOOP clra ; 2/3 sek.
       clrb
       ldx #667/49
       swi
       FCB .delay.
       ldaa PORTG ; pali PG1
       oraa #$02
       staa PORTG
       clra ; 1/3 sek.
       clrb
       ldx #333/49
       swi
       FCB .delay.
       ldaa PORTG ; gasi PG1
       anda #$FD
       staa PORTG
       ldd BROJ ; inkrementiraj
       addd #1 ; BROJ
       std BROJ
       jsr PRIKAZ ; prikazi BROJ
       ldd #5 ; izvršavava se
       cpd BROJ ; 5 taktova
       bgt LOOP
       clra ; kraj taska2
       swi
       FCB .terminate.

tsk3 ldab #SEMA_3 ; čekaj signal
       swi ; tajmera, vidi
       FCB .wait. ; task 2
       ldaa PORTG ; pali PG2
       oraa #$04
       staa PORTG
       clra ; 3 sek.
       clrb
       ldx #3000/49
       swi
       FCB .delay.
       ldaa PORTG ; gasi PG2
       anda #$FB
       staa PORTG
       clra
       swi
       FCB .terminate. ; kraj taska 3

Ostaje nam da ukratko rezimiramo šta se dobija primenom jezika C (sa strane gledišta programera) – kraći, jednostavniji, čitljiviji, modularniji kod koji je lakši za održavanje. Uvek ostaje mogućnost da se kritični delovi koda napišu u asembleru. Ovo ne znači da oni koji ne poznaju C ne mogu pratiti analizu MCX11. Njima preostaje samo da izvrše inverznu operaciju, odnosno da ono što bude napisano u C-u prevedu u asembler na osnovu datoteke MCX_LIB.C.

Napomena: Za realizaciju cMCX11 je korišten ImageCraftov kompajler ICC11. Autori ICC11: Richard Man i Christina Willrich.
Ideja za MCX11:
Brian Dombrowski.
Autor cMCX11:
Grant Beattie.
web:
http://www.mtechgroup.com

Piše: Stevan Tošić, dipl. ing.

Pročitajte više o ovoj temi
Vezni igrač
MCX11 MicroController eXecutive za 68HC11
Programiranje u MCX11
Semafori
Tajmeri

C o p y r i g h t  1998 mikroElektronika. All Right Reserved. Za sva pitanja obratite se redakciji