Anda di halaman 1dari 9

ARM-Cortex-M3 FreeRTOS

Xin cho cc bn, sau khi tri qua ht cc bi ging c bn lm vic c vi dng Cortex-M3.
Ngy hm ny ti s i vo mt bi ging c th gi l cao cp hn, l v H iu hnh thi gian thc
FreeRTOS.
1. Tng quan
Khi tip cn vi vi iu khin t 8051, PIC n AVR v by gi l ARM, th 2 cu trc c bn
chng ta xy dng mt chng trnh l da vo ngt v hi vng.
V d ta c mt bi ton n gin nh sau: lin tc nhp nhy mt LED n, v nu nt c
nhn th ta tng tn s nhy LED ln.
Thng th trc khi tip cn vi H iu hnh thi gian thc th chng ta gii quyt bi ton
trn nh sau, hoc l lin tc kim tra cc c ca Timer nhy LED v lin tc kim tra xem nt
c c n hay khng:
While(1)
{
Kiemtra_timer();
Kiemtra_button();
}
Cng vic ta lm trn y gi l hi vng (polling).
Hoc ta cng c th lm theo mt cch khc l dng ngt, 1 ngt Timer, 1 ngt ngoi kim
tra nt nhn, n cng s gip ta gii quyt c bi ton trn.
Tuy nhin, trong thc t th ta cn gp phi nhng bi ton phc tp hn nh trong mt con robot,
va phi c cm bin, va phi gi v my tnh, va phi nhn lnh t my tnh, va phi tnh ton
xut gi tr iu khin cho ng c.
Cc cng vic trn ta cng c th dng phng php hi vng, cng c th dng ngt, nhng s khng
m bo c vn thi gian thc, thi gian thc y khng c ngha l phi nhanh, m l vn
p ng kp thi. V d nh khi nhn lnh khn cp t my tnh, buc phi dng robot li, th vn
thi gian thc y l ngay sau khi nhn lnh, phi thi hnh ngay.
Cn nu ta dng phng php hi vng, th c th l nhn c lnh khn cp t my tnh, nhng chng
trnh ang phc v cho vn khc, nh th ta khng th dng robot li ngay lp tc c.
Chnh v th, mt H iu hnh thi gian thc s gip ta gii quyt bi ton .
Khc vi H iu hnh ca my tnh nh Window, Linux, nhng h iu hnh ca my tnh s gip ta
lp trnh d dng hn do c rt nhiu driver, chng trnh con c sn, ta ch vic dng.
H iu hnh thi gian thc s ch gip ta gii quyt cc cng vic mt cch song song, ni l song
song nhng thc cht cc lnh vn c x l tun t, nhng c phn cc khe thi gian cho cc
cng vic, v vi tn s rt cao nn ta c th coi l cc chng trnh c thc hin ng thi. Chnh v l
, n s gip ta gii quyt c vn thi gian thc.
Ti sao li l FreeRTOS?

Hin nay c rt nhiu h iu hnh thi gian thc, dnh cho rt nhiu loi dng vi iu khin khc nhau,
nh QNX/Neutrino, uCOS, Vxworks, LynxOS.
Nhng FreeRTOS l mt h iu hnh min ph, m ngun m, v c s dng ph bin nht hin nay,
n c th dng c cho c dng vi iu khin nh PIC, AVR v tt nhin l ARM.
Chnh v th ti chn FreeRTOS gii thiu, khi lm quen vi FreeRTOS, th cc loi h iu hnh
thi gian thc khc rt d tip cn.
i km bi ging ny l b th vin ca FreeRTOS, mt ti liu hng dn FreeRTOS ca chnh tc gi
vit ra H iu hnh ny vit nn, Richard Barry,y l ti liu chnh thng v chi tit nht v FreeRTOS.
V i km bi ging ny cn l mt Project vi dng Cortex-M3 ny, tron ti ci thnh cng
FreeRTOS ln chip M3 ny, v thc hin mt s cng vic c bn nh nhy LED v truyn thng UART
vi my tnh.
Cc bn m project ra, np vo mch v cho chy th s thy rt th v, cc cng vic gn nh c
thc hin song song. V ri cc bn c tip cc mc sau ca bi ging ny.
Phn tip theo ca bi ging ti s ni v hot ng ca FreeRTOS, cng nh l v H iu hnh thi
gian thc (bn cht cc h iu hnh th khng khc nhau nhiu lm).
V cui cng l gii thch chng trnh i km vi bi ging ny m cc bn va mi np vo mch.
2. H iu hnh thi gian thc FreeRTOS.
FreeRTOS cng nh l cc h iu hnh thi gian thc khc, phn chia cc cng vic ra thnh cc
TASK, v d nh chng trnh m ti vit th nhy LED l mt TASK, truyn d liu ti my tnh
l mt TASK khc, v nhn d liu t my tnh gi xung l mt TASK khc na. Nh vy
chng trnh ca ti , ti to ra 3 TASK, cc bn c th to ra nhiu TASK hn.
V h iu hnh s phn chia thi gian thc hin cc TASK thnh cc khe thi gian, v
ty thuc vo mc u tin gia cc TASK( mc u tin ny ta c th thit lp c).
C bn v hot ng ca mt h iu hnh thi gian thc c m t qua hnh v sau:

Trong :

Vi
x l ang thc hin tc v. Vi mt b x l th
chng ta ch chy mt tc v ti mt thi im nht nh.
Ready: Vi ngha mt s tc v khc sn sng chy nu b x l ri.
Blocked: Vi ngha tc v khng sn sng chy k c khi b x l trong
trng thi ngh - Idle. Tc v trong trng thi ny v chng i mt s kin
bn ngoi tc ng kch hot n tr li trng thi sn sng.

Running:
ngha b

Hnh di y m t vic phn chia thi gian thi hnh cc Task:

Khe thi gian l thi gian t1 n t2, (tn n tn+1).


Lp lch: L vic h iu hnh quyt nh thi im no s thc hin tc v no, da vo
mc u tin gia chng.
Hnh di y m t mt v d v lp lch, vi 3 Task v:

Cc task 1, 2, 3 c mc u tin gim dn c khi no tc v u tin cao yu cu


th cc task u tin thp phi nhng.

Ti (1), nhim v th nht c thi hnh


Ti (2), CPU dng tc v 1
Ti (3), phc hi li tc v 2
Ti (4), trong khi tc v 2 ang thi hnh, n cm cc ngoi vi ca vi x l
ch cho php chnh bn thn tc v ny truy cp vo.
Ti (5), CPU dng tc v 2
Ti (6) phc hi li tc v 3
Tc v 3 c th truy cp vo cng ngoi vi ca vi x l v thy rng b
cm, v vy n khng th tip tc v t dng ti v tr (7)
Ti (8), CPU phc hi li task 1.
Ti (9), thi im tip theo tc v 2 ang thi hnh v kt thc vi ngoi vi
ca vi x l v cho php cc tc v khc truy cp.
Thi im tip l tc v 3 ang thi hnh v thy rng c th truy cp vo
ngoi vi nn tip tc thc thi cho khi b dng bi CPU
Nh vy ta thy rng cc trong mt khe thi gian th ch c mt TASK c thc thi,sau khi
ht khe thi gian y, th TASK no c mc u tin cao hn s c chn thc thi tip theo.
Hoc ngay khi mt TASK ri vo trng thi ngh, th TASK khc s c kch hot lun.

Trong kernel ca FreeRTOS c nm file chnh, tt c cc chng trnh port


buc phi c:
FreeRTOS.h: kim tra xem FreeRTOSconfig,h nh ngha cc ng dng
macro ph thuc vo tng chng trnh mt cch r rng hay cha.
task.h: to ra cc hm v cc macro lin quan n cc task, nh khi to,
xa, treo,
list.h: to ra cc hm v cc macro lin quan n vic to v xo danh sch
trng thi cc task nh cc danh sch ready, running, block, suppend,
waiting.
croutine.h: to ra cc hm v cc macro lin quan n task v queue nhng
ch yu dng cho coorporative.
portable.h: to tnh linh ng cho lp API. Vi mi chng trnh port cho
mi vi iu khin v mi trnh dch khc nhau u cn thay i file ny
ph hp cc API.
Cn mt s cc khi nim lin quan chuyn su n mt h iu hnh nh, vn a nhim,
qun l b nh, chuyn i ng cnh cc bn cn c thm ti liu m ti gi i km.
l nhng kin thc chuyn su, cn ti liu ny ti tp trung vo vn hng dn s
dng nhiu hn.
y ti c kt c cc vn m cc bn cn phi lm trc mt l lm sao to ra
cc Task, cho cc Task chy, nh th gn nh ta gii quyt cc cng vic mt cch
song song, ri sau mi i su vo vn nh gii quyt xung t, qun l b nh.
Chng ta s nghin cu cc vn lin quan n khi to Task, cho cc Task hot ng.
Mt Task gm c: tn, chc nng, gi tr u tin, su stack, task handle, bin tc ng vo
task.
to task th u tin phi nh ngha chc nng ca n trc, cu trc hm c bn nh sau:

void ATaskFunction(void *pvParameters)


{
// Khi to bin y
for( ; ; )
{
// Chc nng thc hin y
}
}
V d:
ATaskFunction l tn ta t ty . Nh di y ti t tn l vTask1
void vTask1(void *pvParameters)
{
const char *pcTaskName = "This is Task 1 \r\n";
for ( ; ; )
{
vPrintString(pcTaskName);
}
}
Sau phi dng hm xTaskCreate() khi to Task; Khi gi hm ny th Task mi thc s
c to ra.
xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority,
pxCreatedTask);
Trong :
pvTaskCreate: l ci tn hm chc nng ca task c nh ngha trn .
pcName: l tn ta t cho task.
usStackDepth: l gi tr s thanh gi Stack c cp cho Task. V d: Stack 32 bit, ta t
usStackDepth = 100 th khng gian Stack dnh cho n l 100*4 bytes.
pvParameters: Bin c truyn vo Task.
uxPriority: gi tr u tin ca Task.
pxCreatedTask: Nh kiu l ci tn nh danh ta c th task ng vo task. vd nh khi thay
i Priority ca Task.
V d nh trong chng trnh ca ti, ti to ra Task nhy LED nh sau:
static void LED( void *arg) {
int dir = 0;
while (1) {
vTaskDelay (500/ portTICK_RATE_MS );
GPIO_WriteBit (GPIOD , GPIO_Pin_8 , dir ? Bit_SET : Bit_RESET );
dir = 1 - dir;

}
Trong :
vTaskDelay( portTickType xTicksToDelay );
L hm chuyn t trng thi Running sang Blocking
bin s xTicksToDelay: l s lng Tick cn thit Task c th chuyn sang trng thi
Ready. Thng th n v ngi ta cn tnh ton l ms nn ta thng bin s l
t/portTICK_RATE_MS vi t l thi gian blocking tnh theo mili giy.
Nh vy LED s sng 500 ms v tt 500 ms (chu k 1Hz).
V sau ti to Task(hm ny c vit trong chng trnh Main):
xTaskCreate (LED , " LED " , 128,NULL , tskIDLE_PRIORITY + 1 , NULL);
Sau khi khi to cc Task xong, ta s gi hm vTaskStartScheduler (); chng tnh s bt
u ri vo mt vng lp v hn, lin tc thc hin cc Task m ta to ra.
Lu , sau khi gi hm vTaskStartScheduler (); th tt c cc cu lnh nm trong chng trnh
Main sau lnh ny u v ngha, n s khng bao gi c thc hin, m CPU s ch thc
hin lnh trong cc Task c to ra m thi.
n y th cc bn to ra c cc Task, tuy nhin cc bn vn cn phi c thm ti liu
ti gi km c th gii quyt cc vn nh xung t, tranh chp ti nguyn,.
Khi to ra cc Task th chng ta thng to ra cc mc u tin cho n theo quy lut.
Task no c tn sut xut hin nhiu th c mc u tin cng cao v ngc li.
Khi cc Task ang chy m gp hm delay 1 thi gian no th n s b Block, sau khi ht
thi gian Block n s tip tc chy t ci ch m n b block ch khng phi chy li task
t u.
Vy cu trc mt chng trnh vi FreeRTOS nh sau:
#include ..
#include ..
//khi to cc TASK
void ATaskFunction(void *pvParameters)
{
// Khi to bin y
for( ; ; )
{
// Chc nng thc hin y
}
}
//to thm cc TASK khc y
..
//bt u vo chng trnh chnh
Main()
{

// cc thit lp phn cng m ta mun s dng, nh GPIO, UART, SPI, I2C.


Init();
//to cc TASK, c bao nhiu TASK mun dng th gi by nhiu hm xTaskCreate
xTaskCreate(..);
//bt u hot ng
vTaskStartScheduler ();
// nhng lnh t y tr i s khng bao gi c thc hin
}
3. Hng dn to mt Project vi FreeRTOS
Sau y l phn hng dn to mt Project c s dng FreeRTOS.
1. u tin cc bn to mt Project nh bnh thng, c hng dn bi ging u tin.
2. Copy th mc cha b th vin FreeRTOS vo th mc ch Project
Source_FreeRTOS l th mc cha m ngun ca FreeRTOS

3. Add thm cc file ca FreeRTOS

Nhn hnh trn cc bn s thy c y cc file cn phi add, nhng file ny nm trong
th mc Source_FreeRTOS.

Cn file heap_1.c nm portable/MemMang.

File port.c v portmacro.h nm portable/RVDS/ARM_CM3:

4. Add thm ng link cho trnh bin dch tm thy cc file ny

N cng ging nh khi cc bn thm ng link cho b th vin CMSIS.


5. Cui cng bn cn include cc file ny vo trong file main.
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "list.h"
#include "timers.h"
#include "croutine.h"
#include "event_groups.h"
#include "semphr.h"
Sau y ta bt u vit code theo khun mu m ti ni trn, trong cc TASK ta vn c
th gi ti cc chng trnh con khc nu cn thit, v cui cng l bin dch v np vo
mch, cng on ny th khng c g cn phi ch y.
Chc cc bn thnh cng.

Anda mungkin juga menyukai