Anda di halaman 1dari 17

EMBEDDED OPERATING SYSTEM : ArdOS ( Arduino Operating System

Imp!ementasi "ungsi Semap#ores pada Arduino Operating System


Oleh :
Muchamad Malik
262/Pra-MIK/27/2014
ArdOS $ T#e Arduino Operating System
ArdOS adalah system !erasi real-time ya"# se!e"uh"ya me"duku"# !emr#rama" da"
semua li$rary ya"# ada !ada Ardui"% de"#a" multitaski"# !riritas da" kmu"ikasi da"
meka"isme krdi"asi ya"# meli!uti:

&i"ary a"d cu"ti"# sema!hres'
Mute( lcks'
)"diti"al *aria$les'
+I+O messa#e ,ueues'
Pririti-ed messa#e ,ueues'
ArdOS mudah dik".i#urasi% da!at me""akti.ka" .itur ya"# tidak di$utuhka" da"
sehi"##a "a"ti"ya tidak aka" dikm!ilasi ke dalam kde $yek akhir ya"# diu"##ah ke Ardui"'
+ils.i desai" ArdOS adalah u"tuk me"ca!ai keseim$a"#a" a"tara kemudaha" !e"##u"aa"%
kekm!aka"% da" !ri"si!-!ri"si! desai" real-time'
ArdOS didistri$usika" dalam $e"tuk surce-cde da" $ersama-sama de"#a" !aket
distri$usi ArdOS' Semua distri$usi ArdOS da!at mem!erleh dari /e$site resmi
htt!s://$it$ucket'r#/cta"k/ards-ide'
Insta!!ing ArdOS
0ersi I12 Ardui" 1'0'4
3"tuk me"am$ahka" li$rary di$utuhka" lkasi dima"a !e"##u"a me"yim!a" Ardui"
!ada cm!uter' Se$a#ia" $esar i"stalasi 4i"d/s $iasa"ya tersim!a" !ada direktri
51kume"ts6Ardui"6li$raries7 atau 5My 1cume"ts6Ardui"6li$raries7 atau sesuai de"#a"
seti"#a" is"talasi user' 1alam Mac $iasa"ya tersim!" !ada 51cume"ts/Ardui"/li$raries7')ari
direktri li$rary !e"##u"a% da" kemudia" u"-i! isi ArdOS'-i! ke direktri terse$ut' 1irektri
li$rary aka" terlihat se!erti i"i:
Klik duakali direktri ArdOS' 1idalam"ua aka" ada $e$era!a dcume"t se!erti :
)OP8I9:% )OP8I9:';2SS2<: =he :93 ;:P; lice"se'
ker"el'c!!% ker"el'h: Pelaksa"aa" ArdOS ker"el utama'
task'c!!: ma"a>eme" ruti"itas =ask'
sema'h% sema'c!!: duku"#a" sema!hre &i"ary'
,ueue'h% ,ueue'c!!: duku"#a" !riritas a"tria" +I+O'
mute('h% mute('c!!:me"duku"# ku"ci mute( da" *aria$el $ersyarat '
Selai" itu >u#a terda!at direktri 5e(am!les7 ya"# me"yertaka" .ile c"th !er#rama"
!ada ArdOS yaitu :
IS<1em:' &a#aima"a me"##u"aka" sema!hres $ersamaa" de"#a" $e$era!a ruti"
i"terau!t
mute(1em: &a#aima"a me"##u"aka" ku"ci mute( da" *aria$le $ersarat'
!ri?ueue1em: &a#aima"a me"##u"aka" !riritas a"tria"
,ueue1em: &a#aima"a me"##u"aka" a"triam +I+O
sema1em: &a#aima"a me"##u"aka" sema!hre u"tuk me"#krdi"asi task
$i#2(am!le: Kum!ula" c"th dkume"tsi da" !r#ram
@ika i"stalasi telah selesai aka" terlihat li$rary ArdOS didalam 5)"tri$uted7 !ada $a#ia"
Sketch im!rt li$rary
3"tuk me"#akses c"th !r#ram da!at dilakuka" de"#a" me"#klik +ile-A2(am!les-AArdOS:
Sekara"# aka" terlihat se$uah c"th ya"# km!rehe"si. te"ta"# $a#aima"a u"tuk
mem$uat da" me"distri$usika" a!likasi ArdOS' user da!at me"#akses c"th i"i de"#a"
me"#klik +ile-A e(am!le-A ArdOS-A $i#2(am!le'
Pemr#rama" !ada <=OS sa"#at $er$eda dari !emr#rama" !ada sistem !erasi $esar
se!erti 4i"d/s% MacOS atau ;i"u(' Secara khusus:
1' <=OS didistri$usika" dalam $e"tuk surce cde'
2' =u#as diatur se$a#ai .u"#si dalam !r#ram ) $uka" se$a#ai !r#ram !ada hard disk'
B' @ika user memiliki $e$era!a !e"#alama" !emr#rama" di thread POSIC memudahka"
!er#rama" dalam ArdOS'
1alam c"th kita aka" melihat:
)ara me"##u"aka" OSSlee! u"tuk memastika" $ah/a kde tu#as me"#eksekusi !ada
i"ter*al ya"# teta!'
)ara me"##u"aka" a"tria" !esa" +I+O u"tuk me"yam!aika" !esa"'
)ara me"##u"aka" Sema!hre u"tuk me"#krdi"asika" a"tara kde tu#as da"
me"##a"##u ruti"itas !elaya"a"'
)ara me"##u"aka" !rt serial ketika me"##u"aka" ArdOS'
Imp!enetasi Semap#ore pada ArdOS :
Sema!hre $er#u"a u"tuk me"#krdi"asika" tu#as' Se$uah sema!hre cu"ti"# adalah
sema!hre ya"# da!at me"#am$il "ilai ya"# setia! $ila"#a" $ulat !siti. termasuk "l' Dal i"i
da!at di#u"aka"% misal"ya% u"tuk melacak >umlah slt tersisa di $u..er% me"a"##uhka" tu#as
ketika tidak ada la#i slt kiri da" mela">utka" ketika slt ya"# di$e$aska"'
Se$uah sema!hre $i"er% se!erti "ama"ya% me"#am$il "ilai 0 atau 1' Dal i"i da!at
di#u"aka" u"tuk me"ce#ah tu#as dari $er>ala" sam!ai !eristi/a terte"tu ter>adi' Se$uah c"th
!e"##u"aa" di$erika" dalam sketsa IS<1em ma"a tu#as ditu"da sam!ai !ush $utt" diteka"'
@ika tu#as me"#am$il sema!hre ya"# seda"# dalam keadaa" 0% tu#as aka" mem$lkir
da" k"trl aka" diserahka" ke tu#as lai"' @ika tu#as me"#am$il sema!hre ya"# tidak dalam
keadaa" 0% se#era !e"#am$ilaliha" !a"##ila" kem$ali da" tu#as aka" mema"##il resume'
@ika ada tu#as mem$lkir sema!hre% tu#as de"#a" !riritas terti"##i di$lkir da" sia!
u"tuk me">ala"ka"' @ika tu#as ya"# di$lkir memiliki !riritas le$ih ti"##i dari!ada tu#as
mema"##il% tu#as mema"##il adalah !ra-em!ted da" tu#as aka" $er>ala"'
@ika tidak ada tu#as mem$lkir !ada sema!hre% sema!hre melakuka" !e"am$aha" atau
i"kreme" Eatau set ke 1 dalam kasus Sema!hre $i"erF'
Part Des%ription
<1 t <B BB0 hm resistrs
<4 10k resistr
<G Pte"timeter
;211 t ;21B <ed r yell/ ;21s
S1 Push $utt" s/itch
3"tuk me"##u"aka" layut $ard se$a#ai $erikut
ketera"#a":
Pi" ;21 ke !i" di#ital 6% H da" 11 !ada Ardui" Edalam hal i"i kita me"##u"aka" 3"F'
Du$u"#ka" katda E"e#ati.F sisi ;21 ke #ru"d melalui BB0 hm resistr u"tuk
me"ce#ah !em$akara" ;21'
Pi" tm$l !ush u"tuk i"!ut di#ital 2' 1i!erluka" me"##u"aka" resistr 10k u"tuk !ull
d/"'
Memasa"# se$uah !te"simeter !ada a"al# i"!ut 0'
&uat sketch Ardui" $aru kemudia" klik Sketch-AIm!rt ;i$rary-AArdOS' Secara
tmatis Ardui" aka" memasukka" ArdOS !ada !emr#rama" "ya
task1 : Me"ulis OSticks ke !rt serial dua kali !erdetik' OSticks me"#em$alika" >umlah
milidetik se>ak ArdOS dimulai da" da!at mem"itr i"i me"##u"aka" M"itr Serial'
task2 : Mem$aca .. dari a"tria" !esa" da" me"##u"aka" "ilai se$uah ;21 !ada ut!ut P4M
11'
taskB : Mem$aca !te"simeter !ada a"al# i"!ut 0 setia! G0ms me"em!atka" ke dalam a"tria"
!esa"'
task4 : Sema!hre de"#a" i"t0ha"dler ' Me"#akti.ka" ;21 !ada !i" H ketika tm$l !ush
diteka"'
taskG : ;ed aka" $erkedi!
Selai" lima tu#as i"i kami >u#a aka" memiliki ruti" laya"a" i"teru!si EIS<F ya"#
me"a"#a"i i"teru!si ekster"al I9=0% ya"# masuk !ada !i" di#ital 2'
Semua task $erla"#su"# dalam i".i"ite l! seme"tara' Perhatika" $ah/a semua task
ArdOS me"#am$il !arameter ti!e *id I' Kita aka" melihat a!a !arameter i"i dalam taskG'
// Writes OSticks to the serial port every 100ms.
void task1(void *p)
{
char buffer1!"#
$hile(1)
{
spri%tf(buffer& '(ime) *lu'& OSticks())#
Serial.pri%tl%(buffer)#
OSSleep(+00)#
,
,
Kde i"i cuku! sederha"a' Seme"tara l! !ri"t OSticks EF Eme"#em$alika" >umlah
milidetik se>ak ArdOS mulaiF dalam $u..er da" cetaka" ya"# ke !rt serial me"##u"aka"
Serial'!ri"tl"' Ia kemudia" mela">utka" slee! selama J detik' Serial sa"#at se"siti. terhada!
kem$alia" e"tra"cy' @ika Serial dise$ut leh le$ih dari satu task harus dili"du"#i de"#a" ku"ci
mute( atau sema!hre $i"er' Serial >u#a tidak $leh !a"##il le$ih dari sekali setia! G-G0 ms
ter#a"tu"# !ada >umlah teks ya"# aka" dicetak' Silaka" lihat .u"#si !ri"tSerial di mute(1em
u"tuk cara ya"# $e"ar
// -eads the pote%tiometer at a%alo. i%put 0 every 10 ms a%d places it o%to
the messa.e /ueue.
0defi%e 1234 5
i%t /buf1234"#
OS1ueue ms.#
// -eads the messa.e /ueue a%d co%trols the bri.ht%ess of the 236 at 7W8
output 11.
void task9(void *p)
{
u%si.%ed i%t val#
$hile(1)
{
val:(u%si.%ed i%t) OS6e/ueue(;ms.)#
a%alo.Write(11& val)#
,
,
3"tuk mem$uat a"tria" !esa" kita !ertama kali mem$uat $u..er ,$u. i"te#er !a">a"#
?;29 Edi si"i adalah ?29 KF serta *aria$le a"tria" ms#' ;! task2 mem$aca "ilai .. dari
a"tria" da" me"##u"aka" "ilai u"tuk me"#"trl keceraha" ;21 !ada !i" 11 me"##u"aka"
a"al#4rite'
void task<(void *p)
{
u%si.%ed i%t val& remap#
$hile(1)
{
val:a%alo.-ead(0)#
remap:map(val& 0& 109<& 0& 9++)#
OS3%/ueue(remap& ;ms.)#
OSSleep(+0)#
,
,
=askB mem$aca a"al# cha""el 0 setia! G0 milidetik% da" rema!s "ilai ya"# ditemuka"
a"tara 0-102B da" u"tuk 0 sam!ai 2GG' I"i memu"#ki"ka" ;21 di atas seluruh re"ta"#
!te"simeter' Kemudia" e",ueues "ilai da" kem$ali slee! selama G0 ms'
Kde $erikut u"tuk msauka" I9=0 ha"dler i"teru!si ekster"al da" u"tuk task4:
OSSema sem#
// =%terrupt service routi%e for e>ter%al i%terrupt =4(0 (di.ital pi% 9)
void i%t0ha%dler()
{
OS?iveSema(;sem)#
,
// (o..les the 236 at pi% @ every time the push butto% is pressed.
void taskA(void *p)
{
u%si.%ed char fla.:B=?B#
$hile(1)
{
OS(akeSema(;sem)#
di.italWrite(@& fla.)#
fla.:Cfla.#
,
,
3ser da!at mem$uat sema!hre $aru de"#a" ti!e OSSema% serta !e"#e"dali i"teru!si
u"tuk i"teru!si ekster"al 0 EI9=0F% dise$ut i"t0ha"dler' Peker>aa" ha"dler adalah u"tuk
merelease sema!hre sem de"#a" me"##u"aka" OS:i*eSema' 1emikia" !ula tu#as 4
me"#am$il sema!hre me"##u"aka" OS=akeSema da" ditu"da sam!ai rilis i"t0ha"dler itu'
Ketika sema!hre dile!aska" task4 mematika" ;21 !ada !i" H'
Peker>aa" =askG sa"#at sederha"a: ha"ya me"#edi!ka" ;21 di !i" 6 !ada ti"#kat
terte"tu'
void task+(void *p)
{
u%si.%ed i%t pause:(u%si.%ed i%t) p#
$hile(1)
{
di.italWrite(!& B=?B)#
OSSleep(pause)#
di.italWrite(!& 2OW)#
OSSleep(pause)#
,
,
Ar#ume" u"tuk taskG dile/atka" melalui !arameter !' Kare"a ! adalah ti!e *id I% kita
$isa me"era!ka" #i!s u"tuk me"#u$ah"ya me">adi i"t u"si#"ed'
Me"deklarasika" ruti" u"tuk meletakka" se#ala sesuatu $ersama-sama' Pertama-tama kita
me"de.i"isika" se$uah sim$l ya"# dise$ut 93ML=ASKS ya"# me"u">ukka" >umlah taskya"#
kita miliki Edalam hal i"i GF' Kemudia" mema"##il OSI"it de"#a" >umlah task ya"# aka" kita
$uat'
0defi%e 4D8E(FSGS +
void setup()
{
OS=%it(4D8E(FSGS)#
&erikut $e$era!a $aris me"#i"isialisasi !rt serial de"#a" $it rate 11G200 $!s% da"
me"#atur !i" 6 da" H me">adi !i" O3=P3=' Kemudia" mema"##il attachI"terru!t u"tuk
me"#assiasika" i"t0ha"dler de"#a" I9=0'
Serial.be.i%(11+900)#
pi%8ode(!& OD(7D()#
pi%8ode(@& OD(7D()#
attach=%terrupt(0& i%t0ha%dler& -=S=4?)#
Sela">ut"ya mema"##il OS)reateSema u"tuk mem$uat sema!hre' Ar#ume" !ertama
adalah sema!hre kita i"isialisasi% ar#ume" kedua adalah mem$eri "ilai a/al u"tuk sema!hre%
da" ar#ume" keti#a adalah .la# ya"# me"u">ukka" a!akah i"i adalah sema!hre $i"er
E!arameter keti#a adalah 1F atau sema!hre cu"ti"# E!arameter keti#a adalah 0 F'
OSHreateSema(;sem& 0& 1)#
Sela">ut"ya mema"##il OS)reate?ueue u"tuk me"#i"isialisasi a"tria"' Ar#ume"
!ertama adalah array i"te#er u"tuk me"##u"aka" se$a#ai !e"ya"##a% ar#ume" kedua adalah
!a">a"# array i"i dalam $ila"#a" $ulat% da" ar#ume" keti#a adalah a"tria" kita i"#i"
me"#i"isialisasi:
OSHreate1ueue(/buf& 1234& ;ms.)#
Sekara"# mema"##il OS)reate=ask u"tuk me"da.tarka" task i"di*idu' Parameter
!ertama adalah >umlah !riritas Ekecil M !riritas ya"# le$ih ti"##i' Priritas 0 adalah ya"#
terti"##i'F% 8a"# kedua adalah "ama dari .u"#si ya"# $erisi tu#as% da" ya"# keti#a adalah
ar#ume" ya"# aka" dile/atka" ke task !ada startu!'
OSHreate(ask(0& task1& 4D22)#
OSHreate(ask(1& task9& 4D22)#
OSHreate(ask(9& task<& 4D22)#
OSHreate(ask(<& taskA& 4D22)#
=askG u"tuk .lash ;21 !ada !i" 6 !ada sekitar dua kali !er detik:
OSCreateTask(4, task5, (void *) 250);
Terahir memanggil OSRun untuk memulai rdOS
OS-u%()#
,
&erikut cde !r#ram"ya
void setup()
{
OS=%it(4D8E(FSGS)#
Serial.be.i%(11+900)#
pi%8ode(!& OD(7D()#
pi%8ode(@& OD(7D()#
attach=%terrupt(0& i%t0ha%dler& -=S=4?)#
OSHreateSema(;sem& 0& 1)#
OSHreate1ueue(/buf& 1234& ;ms.)#
OSHreate(ask(0& task1& 4D22)#
OSHreate(ask(1& task9& 4D22)#
OSHreate(ask(9& task<& 4D22)#
OSHreate(ask(<& taskA& 4D22)#
OSHreate(ask(A& task+& (void *) 9+0)#
OS-u%()#
,
Setelah OS<u" di!a"##il leh ArdOS maka aka" memulai da" me">ala"ka" melalui
semua task' Se$e"ar"ya ArdOS tidak memerluka" .u"#si l!% ta!i tidak $erlaku u"tuk Ardui"'
Sehi"##a harus mem$uat .u"#si l! ks"#:
void loop()
{
// 3mpty
,
&erikut adalah kde le"#ka! la#i u"tuk $i#2(am!le' Setelah A"da memasukka" i"i
dalam A"da da!at me"#-u!lad ke !a!a" Ardui"' @ika semua $er>ala" la"car ;21 !ada !i" 6
aka" $erkedi! dua kali !er detik% keceraha" ;21 !ada !i" 11 da!at dik"trl de"#a"
me"##u"aka" !te"simeter% da" ;21 !ada !i" H da!at diakti.ka" de"#a" me"##u"aka" tm$l
!ush'
0i%clude Iker%el.hJ
0i%clude I/ueue.hJ
0i%clude Isema.hJ
// Writes OSticks to the serial port every 100ms.
void task1(void *p)
{
char buffer1!"#
$hile(1)
{
spri%tf(buffer& '(ime) *lu'& OSticks())#
Serial.pri%tl%(buffer)#
OSSleep(+00)#
,
,
// -eads the pote%tiometer at a%alo. i%put 0 every 10 ms a%d places
// it o%to the messa.e /ueue.
0defi%e 1234 5
i%t /buf1234"#
OS1ueue ms.#
// -eads the messa.e /ueue a%d co%trols the bri.ht%ess of the 236 at 7W8
output 11.
void task9(void *p)
{
u%si.%ed i%t val#
$hile(1)
{
val:(u%si.%ed i%t) OS6e/ueue(;ms.)#
a%alo.Write(11& val)#
,
,
void task<(void *p)
{
u%si.%ed i%t val& remap#
$hile(1)
{
val:a%alo.-ead(0)#
remap:map(val& 0& 109<& 0& 9++)#
OS3%/ueue(remap& ;ms.)#
OSSleep(+0)#
,
,
OSSema sem#
// =%terrupt service routi%e for e>ter%al i%terrupt =4(0
// (di.ital pi% 9)
void i%t0ha%dler()
{
OS?iveSema(;sem)#
,
// (o..les the 236 at pi% @ every time the push butto% is pressed.
void taskA(void *p)
{
u%si.%ed char fla.:B=?B#
$hile(1)
{
OS(akeSema(;sem)#
di.italWrite(@& fla.)#
fla.:Cfla.#
,
,
void task+(void *p)
{
u%si.%ed i%t pause:(u%si.%ed i%t) p#
$hile(1)
{
di.italWrite(!& B=?B)#
OSSleep(pause)#
di.italWrite(!& 2OW)#
OSSleep(pause)#
,
,
0defi%e 4D8E(FSGS +
void setup()
{
OS=%it(4D8E(FSGS)#
Serial.be.i%(11+900)#
pi%8ode(!& OD(7D()#
pi%8ode(@& OD(7D()#
attach=%terrupt(0& i%t0ha%dler& -=S=4?)#
OSHreateSema(;sem& 0& 1)#
OSHreate1ueue(/buf& 1234& ;ms.)#
OSHreate(ask(0& task1& 4D22)#
OSHreate(ask(1& task9& 4D22)#
OSHreate(ask(9& task<& 4D22)#
OSHreate(ask(<& taskA& 4D22)#
OSHreate(ask(A& task+& (void *) 9+0)#
OS-u%()#
,
void loop()
{
// 3mpty
,

Anda mungkin juga menyukai