Pokus o design jádra RTOS na 8051 LC

O

opentdoors

Guest
Dobrý den, everyones!

Jsem nový člen tohoto fóra.Jsem z Vietnamu jako elektrotechnický inženýr.
Snažil jsem se navrhnout RTOS jádro pro 89c52 s 8 KB RAM ext.Je přesně tak, jak se naučit Real-time Linux.

Moje zhodnocení palubě skládají 89c52 s 8K RAM (6264) na 0x8000.Tam je 16 úloh v mém návrhu, každý úkol má 256 bytů externí paměti.Příklad:

Úkol-0 s ext mem od 0x8000 až 0x80FF
-Úkol 1 ---------------------- 0x8100 až 0x81FF
...
-Úloha 15 ---------------------- 0x8F00 na 0x8FFF

Tak, že DPH = task_id nebo 80, přímá odpovědnost výrobců = 0x00 až 0xFF.

Každý úkol má byte pultu.Při přerušení časovače došlo, počítadlo úkolem je zmenší jeden, a je-li čelit úkolu dostat na nulu, pak se tento úkol je připraven stát.
Počítadlo pole je umístěn ve vnitřní RAM, ponted do R0.Když úkol je v provozu, bude volat Ondelay na reset jeho pultu.

Existují dva další pole ve vnitřní RAM, semafor (pouze binární semafor) pole a pole událost.Když úkol je ve stavu čekání semafor, 8051 CPU také v pohotovostním režimu až časovač přerušení došlo.A když úkol je ve stavu čekání událost, je to vždycky přešel na sheduler rutina.

Sheduler je rutinní založena na pult pole pro změnu úkolu id ve dvou proměnných: running_id a blocke_id, pak volat context_switching ušetřit vnitřní stoh blokován úkolu externí paměti, že úkol, a obnovit zásobník obsahu pro další úkol.Novým úkolem bude v provozním stavu po "reti".

Omlouváme se, v příště budu psát nějaké zdrojové kódy napsané v ASM 8051.

Díky
Naposledy upravil opentdoors dne 16 února 2005 8:24, editovaný 1 krát v celkové

 
Všechny úkoly byly definovány v paměti programu, jako je toto:

tasktable:

DW task0
DW task1
...
DW task15

S 256 byty externí RAM pro každý úkol, jsem použil řešení od 0x00 pro uložení kontextu.

stack všeo 5FH
Stránka všeo 80H
XSP všeo 0FDH
_createTask: / * ACC = úkol id; R0 = úkol prioritu * /

mov b,
mov dptr, # tasktable
rl
Inc
movc a, @ a dptr
push ACC
mov a, b
rl
movc a, @ a dptr
push ACC
push PSW
push 0
push 1
..
push 7
push ACC
push b
push DPH
push přímé odpovědnosti výrobců

mov, # page
ORL, b; task_id OR 0x80
mov DPH,
CLR
mov přímou odpovědnost výrobců,
create_xsp: / * uložení zásobníku na RAM * /
pop acc
movx @ dptr,
vč dptr
mov, sp
cjne, # zásobník, create_xsp
/ * Vytvoření TCB * /

push přímá odpovědnost výrobců; ušetřit ext stack
mov, # XSP
mov přímou odpovědnost výrobců,
pop acc
movx @ dptr,
vč dptr
mov, R0: úkolem je prioritou
movx @ dptr,
vč dptr
mov, DPH
movx @ dptr,
retPřidáno po 22 minutách:Kostra úkolů může být definován:

task0:
/ * Body úlohy * /
mov, # counter0
lcall _timeDelay
ajmp task0

task1:
/ * Body úlohy * /
mov, # counter1
lcall _timeDelay
ajmp task1

....
task15:
/ * Body úlohy * /
mov, # counter15
lcall _timeDelay
ajmp task15

_timeDelay Funkce reset čelit každé úlohy.Počítadlo každého úkolu zmenší do časovače přerušení rutinní.Když počítadlo úkol přijít na nulu, úkol to bude v připraveno státě, pokud jsou tam dva nebo tři ..úkolů bylo v roce připraveno stavu, pak úloha má prioritu vyšší přišel běh státu.

Pokud Timer ISR došlo každé 2 ms, pak úkolu counter = # counter_n * 2 ms, bude úkolem bude spouštět každých (# counter_n * 2 ms).Počítadlo každého úkolu je proměnná WORD.

 
xTimeDelay všeo 0FBH

_timeDelay:
/ * = Čelit vysoké byte, R1 = čelit nízké byte * /
CLR EA; vypnout přerušení
push DPH
push přímé odpovědnosti výrobců
push 0
push b

mov b,
mov, running_id, running_id je globální proměnné v interní RAM
mov DPH,

ANL, # 0Fh
Přidat # taskcounters, taskcounters je adresa pult pole
mov R0, A; R0 poukazují na adresu čelit úkolu běží
mov, # xTimeDelay, adresu proměnné slovo v zahraniční RAM
mov přímou odpovědnost výrobců,
mov, R1
movx @ dptr,
vč dptr
mov a, b
movx @ dptr,

mov @ R0,
pop b
pop 0
pop přímé odpovědnosti výrobců
pop DPH
setb EA
setb IDL, PCON.0 jít do klidového režimu
retPřidáno po 24 minutách:To je sheduler funkce, je-li zkontrolovat počítadlo pole odhalit, které task'counter přijít až na nulu ke změně obsahu dvě proměnné: running_id a suspend_id.Pak přepínání kontextu běžné na základě těchto proměnných na switch.

_sheduler:

CLR EA
push PSW
push 0
...
push 7
push ACC
push b
push DPH
push přímé odpovědnosti výrobců

mov R2, # 0FFh, první úkol priority
mov R0, # taskcounters
mov DPH, # page, DPH = 0x80
mov R1, # 0Fh
mov suspend_id, running_id

_loop:

mov, @ R0
jnz _next
mov, # priority
mov přímou odpovědnost výrobců,
movx, @ dptr, dostanete úkol prioritou
mov b,
subb, R2, pokud> R2
jnc _next;
mov R2, b, ELS-li <R2 pak R2 =
mov, # task_id
mov přímou odpovědnost výrobců,
movx, @ dptr, dostanete úkolu id (task_id = ID nebo 0x80)
mov resume_id,
_next:
vč R0
vč DPH
djnz R1, _loop

mov running_id, resume_id

/ ** /Přidáno po 2 hodinách:Tato změna kontextu běžné.Tato rutina kopie vnitřní zásobník ponted SP registr aktuální úlohy (označené DPH) na externí RAM a uložte obsah přímé odpovědnosti výrobců registru umístění XSP z 256 byte externí RAM.

_contextSwitching:

mov, suspend_id
mov DPH,
CLR
mov přímou odpovědnost výrobců,
save_context:
pop acc
movx @ dptr,
vč dptr
mov, sp
cjne, # zásobník, save_context
push přímé odpovědnosti výrobců
mov, # XSP
mov přímou odpovědnost výrobců,
pop acc
movx @ dptr,

mov, resume_id
mov DPH,
movx, @ dptr; za vady = [XSP]
mov přímou odpovědnost výrobců,
restore_context:
prosince dptr
movx, @ dptr
push ACC
mov, přímá odpovědnost výrobců
jnz restore_context
pop přímé odpovědnosti výrobců
pop DPH
pop b
pop acc
pop 7
...
pop 0
pop PSW
retiPřidáno po 22 minutách:Tento _timer rutinní nazývá TimerISR.Když to říká, to rutinní úbytek čítače úkol jeden.

_timer:
push <0,1, dptr, ACC, b>
mov R0, # taskcounters
mov R1, # 0Fh; smyčka index
_tloop:
mov, @ R0
JZ _tcheck
prosince @ R0
K1:
vč R0
djnz R1, _tloop
ret
_tcheck:
mov, R0
subb, # taskcounters; si id
ORL, # page, task_id = ID nebo 0x80
mov DPH,
mov, # xtimeDelay
mov přímou odpovědnost výrobců,
movx, @ dptr, dostanete vysokou byte
JZ k1
prosince
movx @ dptr,
vč dptr
movx, @ dptr, Get Low byte
mov @ R0,
sjmp k1

 
Je tu někdo může dát mi poradit o mém návrhu?

Myslím si, že je lepší vývoj RTOS na RICS-jako LC jako AVR nebo PIC.Viděl jsem nějaké RTOS pro LC 8 bitů jako Salvo, uCOS-II, TinyRTX Keil ....Přidáno po 39 minutách:Zde je semafor zpracování rutiny.I vytvořit binární semafor pole s názvem "mutex_buf" ve vnitřní RAM poukázal na R0 (nebo R1).

mutex_buf je boolean: nula nebo non-nula.Každý prvek mutex_buf přidělené zdroje, jako je port, paměť ..
ex:

PORT_sem všeo 1H
mov, # PORT_sem; zde semafor id je PORT_sem, id = 0 až 15_semCreate:
/ * ACC = semafor je id, R1 = počáteční hodnota semaforu (nula) * /

push 0
mov R0, # mutex_buf
Přidejte, R0
mov R0, A; R0 bod [mutex_buf i]
, Mov, R1, může být "CLR"
mov @ R0, A; * (mutex_buf) = R1
pop 0

ret

Když úkol přístup sdílený zdroj, to bych počkat semphore přidělené tohoto zdroje, aby přístup k-pravý.
neplatné semWait (UCHAR semaphore_id)
(
while (semaphore_id);
semaphore_id = 1;
)

V ASM:
_semWait:
/ * = Semafor id * /
CLR EA
push 0
mov R0, # mutex_buf
Přidejte, R0
mov, @ R0
jnz _semWaiting
mov @ R0, # 1
pop 0
setb EA
ret

_semWaiting:
pop 0
setb EA
setb IDL; goto idle módu
sjmp _semWait

_semSignal:
/ * = Semafor id * /
CLR EA
push 0
mov R0, # mutex_buf
Přidejte, R0
mov R0,
mov @ R0, # 0H
pop 0
setb EA
ret

Tak úkol může být psáno jako je tento, se Semafor vytvořil _semCreate rutinní výše:

_task:
.......
mov, PORT_sem
lcall _semWait
.... Zpracování PORT
lcall _semSignal
.....
mov, # counter
lcall _timeDelay
ajmp _task

 
Zdravím všechny,

Já jsem G Kannan, tady jsem projektování plánovač pro 8051 (priority na základě nucené přerušení).

i potřebovat jeden HELP.i chtějí design tok plánovače a jak změna kontextu došlo.Podívejte se dopředu slyšet od U.

pls mail mi kannan_emb (at) yahoo.com

Díky a pozdravem
Kannan

 
Je mi to líto.V předchozích času, řekl jsem, že sheduler volal, když úkol čeká případě stát.

Ale algoritmus mého RTOS je round-robin.Takže CPU přijít k nečinnosti státu, pokud úkol čeká případě do časovače přerušení došlo.

Event vlajka je byte, který jeho hodnota tohoto rozdílu 255 událostí.Úkolem, který v čekání případě státu by mohl být psán:

_task:
mov, # _eventType
lcall _eventWait
/ * Zpracování * /
ajmp _task

_eventWait v Pseudomonas-do kód:
neplatné _eventWait ()
(
taskcounters [running_id] = 255;
IF (event == _eventType), pak
akce = 0;
ELSE goto IDLE_MODE;
)

Obsah akce proměnná byl stanoven na další úkol.

 
thinkey napsal:

proč ne post vývojový diagram namísto ASM kódu?
 
Mám rád ASM, C, C .
a píšu RTOS 52, děkuji Váš příspěvek.

 
Může být ASM kód obtížné pochopit, než kód C.Ale psaní jádra ASM kód, může jádro sledovat hodnotu program proti kontrolní úkoly.

Psaní aplikací v C, s použitím systémové volání z jádra závisí na kompilátoru.

 
Mohli jste vyslán celý kód do jednoho souboru.
Co je třeba pro vysílání v mnoha post?
hlezna

 
Chci, aby se RTOS podle jazyka C.Jeho přesnost je program napsaný ASM jazyk?

 
elchula napsal:

Chci, aby se RTOS podle jazyka C.
Jeho přesnost je program napsaný ASM jazyk?
 
To by bylo lépe rozumět, za osobu, jako jsem já, který není tak dobrý na shromáždění, jen C je o to ......

Hodně štěstí

 
Jsem Tring navrhnout RTOS i nějaké problémy s výkladem ASM kódu v kódu přes popsaný úkol fissed v přesný počet?o může být upraven druhý požadavky?

 
Jack / / Ani napsal:

To by bylo lépe rozumět, za osobu, jako jsem já, který není tak dobrý na shromáždění, jen C je o to ......Hodně štěstí
 

Welcome to EDABoard.com

Sponsor

Back
Top