ターゲットはGR-Sakura RX63Nボード(Arduino模擬環境というのか?)です。
さっそく、GR-Sakura RX63Nボードを standalone で試し、動作確認できた。
さらに、ARM Cortex-M3 で試し、動作確認できたので、記載しておきます。
dispatch.s のみの書き換えで動作しました。
ただし、8byte stack align などを考慮していません。
-------------------------
IAR EWARM環境のアセンブラ記述
public swi_ctx ;/*実行コンテキストの切替*/
public sta_ctx ;/*コンテキストをロードし、タスクを開始*/
section .text:CODE
;/************************************************
; コンテキストをロードし、タスクを開始
; void sta_ctx(
; void *exe ) //実行コンテキストの保存先
;************************************************/
sta_ctx:
push {lr} ;/*lrを退避*/
ldr r13,[r0] ;/*スタックポインタ設定*/
pop {r4-r12,pc} ;/*r4-r12,pcを復帰*/
;/************************************************
; 実行コンテキストの切替
; void swi_ctx(
; void *pre, //現在のコンテキストの保存先
; void *post) //切り替えるコンテキスト
;************************************************/
swi_ctx:
push {r4-r12,lr} ;/*r4-r12,lrを退避。r4が最も若いアドレスになる*/
str r13,[r0] ;/*スタックポインタ保存*/
ldr r13,[r1] ;/*スタックポインタ復帰*/
pop {r4-r12,pc} ;/*r4-r12,pcを復帰*/
end
スタックの消費傾向が、GR-Sakuraと同様だったので、期待どうりの動作だと思います。
RX63N では
R6, R7, R8, R9, R10, R11, R12, R13, R14 pushm でスタックに積まれる
PC 関数Call で自動的にスタックに積まれる
ARM Cortex-M3では 戻りPCはスタックに積まれずLR:R14に格納されるので、手動でLRをスタックに積む必要がある。
R4, R5, R6, R7, R8, R9, R10, R11, R12, LR:R14 push でスタックに積む 。
結果 RX63NもCortex-M3もスタックに積むレジスタ数が10個となった。
このため mul_tsk.c::reg_tsk() などの修正が不要となったもの。
2013.02.04 ユーザーモードマルチタスクを単一モードマルチタスクに修正
0 件のコメント:
コメントを投稿