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
}
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()
{
Nhn hnh trn cc bn s thy c y cc file cn phi add, nhng file ny nm trong
th mc Source_FreeRTOS.