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=PRIPLLstatic 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.
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).
2. ábra A taskok állapotai
A harmadik ábrán láthatjuk például, hogy az ütemezőnk működik, nincs felfüggesztve.
3. ábra Néhány változó értéke
Hát igen.... Elérkeztünk a 100. cikkhez. Köszönjük az érdeklődést, a visszajelzéseket. Ezért valami érdekessel, nem annyira ismert témával ünnepeljük ezt a kerek fordulót. A választás a FreeRTOS-ra, egy valósidejű operációs rendszerre esett. Ezt a be. . . .
Megismerkedünk most gyakorlati oldalról az USB-CDC használatával. Készítünk egy projektet az MpLab segítségével, amelynek segítségével LED-eket kapcsolunk be, illetve ki, de megnézzük azt is, hogy hogyan tudunk a mikrovezérlőből beolvasni string-et.. . . .
Folytatjuk tovább a FreeRTOS megismerését, de most a száraz elméletet félretéve, összeállítjuk az első projektünket.. . . .