これは、趣味や組込みC言語の勉強に持って来いだ。こことか見て勉強したらどうだろう。ただ対応したマイコンボードが秋月とかであんまり売ってないが、、、
とりあえずなんか作ってみようと思ったが、ソフトを組むのにやっぱりOSがないと組みにくい。と言ってもゴリゴリに使うわけではないし、趣味で組むのにRTOSを購入なんて出来ない。なので自作のなんちゃってRTOS(μITRON風)を作ってみた。
機能はとりあえず、cre_tskとrot_rdqとdly_tskだけ。
タスクのディスパッチをどう実現するか?
タスク毎にスタック領域を持っておき、ディスパッチの時にレジスタ値をPUSHして、スタックポインタの値はタスクコントロールブロックに保存する。次に実行するタクスのスタックポインタを保存先からリストアしてレジスタ値をPOPすれば、元の状態に戻るのでRET命令でリストアしたスタックポインタに積まれた戻りアドレスに従って戻っていく。
こんな感じにしてみた。(dispatch.asm)
;-----------------------------------------------------------
; void dispatch(int* pSaveSP, int iRestoreSP)
; AX = pSaveSPのアドレス
; SP+0 = 戻りアドレス(LL)
; SP+1 = 戻りアドレス(LH)
; SP+2 = 戻りアドレス(HL)
; SP+3 = 戻りアドレス(HH)
; SP+4 = iRestoreSPの値
;-----------------------------------------------------------
PUBLIC _dispatch
@@LCODEL CSEG
_dispatch:
PUSH AX
PUSH BC
PUSH DE
PUSH HL
MOVW DE,AX ;pSaveSPのアドレスをDEに保存
MOVW AX,SP ;SP値取り出し
MOVW [DE],AX ;*pSaveSP に SP値を保存
MOVW HL,AX ;SPをHLに保存
MOVW AX,[HL+4+8] ;iRestoreSP値取り出し
MOVW SP,AX ;SPにiRestoreSPをセット
POP HL
POP DE
POP BC
POP AX
RET
END
これでタスクの切り替えが可能になった。後はタスクの初っ端をどうやって呼び出すか?
とりあえず、アセンブラが必要そうなのはここまでなので後はすべてC言語で書くとする。
(続く)
0 件のコメント:
コメントを投稿