http://hamayan.blog.so-net.ne.jp/2012-12-27
修正箇所は2か所。
1. dispatch_850.asm
;/* RH850 CC-RH */
.section ".text", text
.public _swi_ctx ;/*実行コンテキストの切替*/
.public _sta_ctx ;/*コンテキストをロードし、タスクを開始*/
;/************************************************
; コンテキストをロードし、タスクを開始
; void sta_ctx(
; void *exe ) //実行コンテキストの保存先
;************************************************/
_sta_ctx:
push lp
ld.w [r6],sp ;/*スタックポインタ設定*/
popsp r20,r31
jmp [lp]
;/************************************************
; 実行コンテキストの切替
; void swi_ctx(
; void *pre, //現在のコンテキストの保存先
; void *post) //切り替えるコンテキスト
;************************************************/
_swi_ctx:
pushsp r20,r31
st.w sp,[r6] ;/*スタックポインタ保存*/
ld.w [r7],sp ;/*スタックポインタ復帰*/
popsp r20,r31
jmp [lp]
2. mul_tsk.c 修正箇所reg_tsk()
/****************************************************************************/
/* タスク登録 */
/* タスクID、エントリーポイント、スタック領域、スタックサイズ、 */
/* 起動時引数を4つまで登録できる。 、 */
/****************************************************************************/
ER reg_tsk( ID tid, void *tsk, void *stk, int stk_sz,
VP_INT exinf1, VP_INT exinf2, VP_INT exinf3, VP_INT exinf4 )
{
VP_INT *ptr;
if( tid < 0 || tid >= MAX_TASK_NUMBER ) return E_ID;
/*タスクのスタックの初期化*/
tcb[tid].sp = (void *)((char *)stk + stk_sz - (4 * (12))); /*r20からr31までこの領域に保存される*/
ptr = (VP_INT *)tcb[tid].sp;
ptr[ 0] = (VP_INT)tsk; /*LP(R31)*/
ptr[ 1] = 0x30303030; /*EP(R30)*/
ptr[ 2] = 0x29292929; /*R29*/
ptr[ 3] = 0x28282828; /*R28*/
ptr[ 4] = 0x27272727; /*R27*/
ptr[ 5] = 0x26262626; /*R26*/
ptr[ 6] = 0x25252525; /*R25*/
ptr[ 7] = 0x24242424; /*R24*/
ptr[ 8] = 0x23232323; /*R23*/
ptr[ 9] = 0x22222222; /*R22*/
ptr[10] = 0x21212121; /*R21*/
ptr[11] = 0x20202020; /*R20*/
tcb[tid].exinf[0] = exinf1;
tcb[tid].exinf[1] = exinf2;
tcb[tid].exinf[2] = exinf3;
tcb[tid].exinf[3] = exinf4;
tcb[tid].rdy_flg = TTS_DMT;
return E_OK;
}
0 件のコメント:
コメントを投稿