WebElektronika

FreeRTOS alapjai V. (egy egyszerű projekt készítése)

person access_time 2015.08.14.
Ezzel a cikkel a FreeRTOS sorozatunk végéhez értünk. Elkészítünk egy projektet, ahol a taskoknak az lesz a feladata, hogy LED-eket kapcsoljanak be és ki.


Ezzel a cikkel a FreeRTOS sorozatunk végéhez értünk, igaz, ősszel még egy érdekességet be fogunk mutatni.

Töltsük le a FreeRTOS oldaláról a legutóbbi freertos változatot. A kicsomagolás után indítsuk el a PIC32X családhoz tartozó verzióval az MpLab-ot. 

A main.c file-t írjuk át a következő példa szerint. A FreeRTOSConfig.h file-ban a configUSE_IDLE_HOOK értéke 1, tehát engedélyezzük a pihenőszálat.

#include <p32xxxx.h>
#include <plib.h>
#include "FreeRTOS.h"
#include "task.h"

#pragma config FPLLODIV=DIV_1, FPLLIDIV=DIV_2, FPLLMUL=MUL_20, FPBDIV=DIV_2
#pragma config FWDTEN=OFF, FCKSM=CSDCMD, POSCMOD=XT, FNOSC=PRIPLL

static void vTask0( void *pvParameters );
static void vTask1( void *pvParameters );

int main()
{
    TRISD = 0x0000;
    LATD = 0x0000;
    SYSTEMConfigPerformance( configCPU_CLOCK_HZ - 1 );
    mOSCSetPBDIV( OSC_PB_DIV_2 );

    INTEnableSystemMultiVectoredInt();
    portDISABLE_INTERRUPTS();
    
    vPortInitialiseBlocks();

    xTaskCreate(vTask0,"T0",256,NULL,1,NULL);
    xTaskCreate(vTask1,"T1",256,NULL,2,NULL);

    vTaskStartScheduler();

    while(1);
}

static void vTask0( void *pvParameters )
{
    while(1)
    {
        LATDbits.LATD0 = !LATDbits.LATD0;
        vTaskDelay(350/portTICK_RATE_MS);
    }
}
static void vTask1( void *pvParameters )
{
    while(1)
    {
        LATDbits.LATD1 = !LATDbits.LATD1;
        vTaskDelay(3500/portTICK_RATE_MS);
    }
}


//pihenőszál, ha mind a két task blokkolva van
//FreeRTOSConfig.h -ban a configUSE_IDLE_HOOK -nál 1 van 0 helyett
void vApplicationIdleHook(void)
{
    LATDbits.LATD3 = ~ LATDbits.LATD3;
}

void vApplicationStackOverflowHook( void )
{
    for( ;; );
}

void _general_exception_handler( unsigned portLONG ulCause, unsigned portLONG ulStatus )
{
    /* This overrides the definition provided by the kernel.  Other exceptions 
    should be handled here. */
    for( ;; );
}

 

A plib.h header file-t hozzáadtuk a projektünkhöz, mert hívunk függvényeket, rendszermakrókat. Az xTaskCreate() segítségével létrehozunk két szálat, az elsőnek (T0) a prioritása 1, a másiknak (T1) 2. Mind a két szálnak a stack mérete 256.

Ezután elindítjuk az ütemezőt.

A két függvényben végtelen ciklusban negáljuk az adott D portbitet, majd a szál futását felfüggesztjük.

Ha a projektet ezután lefordítjuk és a hex file-t betöltjük a tesztpanelba, akkor azt látjuk, hogy a D porton a D0 és a D1 LED-ek villognak.Tekintettel arra, hogy a pihenőszálat engedélyeztük a config-ban, ezért a D3-as LED is világít, de itt nincs késleltetés, ezért ez halványabban és állandóan világít.

Ha nincs tesztpanelunk, akkor szimuláljuk le a programunk működését. A Watch ablakba (1. ábra) vegyünk fel különböző változókat és nézzük meg ezeknek a változásait.

kep
1. ábra   A watch ablak
 

Nézzük meg az RTOSView-errel a task-ok állapotát (2. ábra) és a különböző rendszerjellemzőket (3. ábra).

kep
2. ábra   A taskok állapotai
 

A harmadik ábrán láthatjuk például, hogy az ütemezőnk működik, nincs felfüggesztve.

kep
3. ábra   Néhány változó értéke