2013年2月3日日曜日

単一モードでのマルチタスク

hamayanさんのとこで 単一モードでのマルチタスクの実装が公開されています。
ターゲットは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 ユーザーモードマルチタスクを単一モードマルチタスクに修正