Forums: Developers (Thread #37911)

PIC32MX220F032Bでhos-v4a (2016-07-26 19:36 by ts_ingk #78409)

hos-v4aが公開されてからチマチマと暇な時に作業していたPIC32MX220F032B上でhos-v4aのsampleの哲学者の食事の問題が、とりあえず・一応・なんとか動作した様です。
環境はdebian上で、

$/usr/local/mips48el/bin/mipsel-elf-gcc -v
Using built-in specs.
COLLECT_GCC=/usr/local/mips48el/bin/mipsel-elf-gcc
COLLECT_LTO_WRAPPER=/usr/local/mips48el/libexec/gcc/mipsel-elf/4.8.4/lto-wrapper
Target: mipsel-elf
Configured with: ../configure --target=mipsel-elf --prefix=/usr/local/mips48el --enable-languages=c,c++ --enable-multilib --disable-decimal-float --with-float=soft --with-abi=32 --with-tune=mips32 --with-dwarf2 --disable-__cxa_atexit --disable-libssp --with-gmp=/usr/local/gmp600/ --with-mpfr=/usr/local/mpfr312/ --with-mpc=/usr/local/mpc102/ --disable-nls --with-newlib --disable-zlib
Thread model: single
gcc version 4.8.4 (GCC)
の自前ビルド

その他microchipのelfからihexのコンバータ?であるxc32-bin2hex
と書き込みはPICKIT3を使用。

書き出しで「とりあえず・一応・なんとか」と記載したのは、割り込み優先順位を変更すると
動作に異常が生じるのため、どうも不完全ぽいのですが発生条件が不明です。
割り込みはisig_timのtimer1とUART1送信割り込みを使用し、下記の条件で発生します。

割り込み優先順位
UART1送信割り込み > timer1(isig_tim) --- ×
UAR1T送信割り込み = timer1(isig_tim) --- ○
UAR1T送信割り込み < timer1(isig_tim) --- ○
上記はPIC内蔵の割り込みpriorityレジスタIPCnに書き込む値のみ変更し、その他は一切無変更です。
sub-priorithyも変更可能ですが、sub-priorityの変更では影響がない模様です。
逆アセンブラを通してでも確認を一応しています。

なお、sampleのmbxとmpfを使用した際には正常に動作するようです。

とりあえずopenocd経由でJTAGから覗いてみましたが、regPCがあらぬアドレスを示しているとしかわかりませんでした。
*openocdの使い方が、まだ完全に把握できていないので指定したPCのaddressで止まってくれない。

根本は、mipsのcoreの挙動とPIC内蔵周辺peripheralがよく把握できていない為でもあると思いますが。

といった状況です。

Re: PIC32MX220F032Bでhos-v4a (2016-08-02 00:00 by ryuz #78445)

お世話になります。Ryuzです。

細く長く挑戦頂いて、有難うございます。

今のPICマイコンって中身MIPSだったのですね。
20年ぐらい前に初期のPICに触って以来なので、時代の流れを感じます。

ITRON仕様は割り込みコントローラを含んでしまっているので、CPUコアよりもインプリ毎に異なるペリフェラルが厄介なのですね。特に割り込み周りはコーナーケースのバグが入り易い上にICEがあってもデバッグ面倒なので、奥深いバグに嵌りがちなイメージを持っております。

しかし、HOSがPICで動いているというのは感慨深いものがあります。

今後とも期待しております。
Reply to #78409

Re: PIC32MX220F032Bでhos-v4a (2016-08-04 21:11 by ts_ingk #78467)

Ryuz様。

PICと一口に言いましても8bit系・16bit系・32bit系とありまして、
8bit系(PIC10F、PIC12F、PIC16F、PIC18F等)と
16bit系(PIC24、dsPIC等)は
microchipのオリジナル?で、
PIC32系のみmipsのM4kやM14kを使用している様です。
(PIC32MX250F128Bは秋月で¥420と安いですし)


また、先の割り込みの課題でしたが色々と考えた上で超手抜き仕様により、どうにか自分の希望する動作には近づいたようです。
具体的には、例外処理ハンドラの_kernel_exc_hdrに移行した際に割り込みpriorityの閾値を固定値にし、その閾値未満は受付ない様にする手抜き仕様です。
もし、それ未満のpriorityで割り込みを行う時は勝手割り込みハンドラを別途記述してOS本体とは非同期で行います(以前、HOS-V4のH8/300Hで同様の手は使いました)。
これで暫くの間、暇な時に試験を行う予定です。
Reply to #78445

Re: PIC32MX220F032Bでhos-v4a (2016-08-05 06:32 by ts_ingk #78468)

●追記
前記の割り込み時の手抜き仕様は、「多重割り込み時」に割り込みレベルのpriorityを固定し、そのレベルの閾値に満たないレベルの割り込みは保留される仕様としています。
Reply to #78467

Re: PIC32MX220F032Bでhos-v4a (2016-08-06 08:45 by ryuz #78469)

 お世話になります。Ryuzです。

 なるほど、いろいろ工夫してレベル割り込みを実装いただいているのですね。

 やりたい処理に対してCPUが十分早ければ、割り込み処理はタスク起こすだけとして、後はすべてタスク優先度管理に一元化するという手もあるのですが、CPUが早くなるとその分よりリアルタイム性の高いことをやらせたくなるので、結局のところ割り込み処理は非常に重要かと思います。
 難しくはあるものの割り込み処理の部分はある意味OSも無視して、高い応答性を個別にカスタマイズできますので非常に重要なスキルに思います。

 一方で、OSカーネル内やタスク処理に長い割り込み禁止期間があると身も蓋もなくなります。
 そういう意味でOS内のクリティカルセクションを割り込み禁止にするバズロック型に対して、遅延プロシージャコール(DPC)の活用は重要に考えています。

 HOS-V4a の場合 _KERNEL_CFG_DPC を TRUE とすることで、遅延プロシージャコールを使えるようにする試みを試行中です。よろしければこのあたりも興味を持っていただければと思います。


 ちなみに私がPICに触れたのは秋月に並び始めてすぐぐらいのころだったので、8bitのみですね。
 最近ではこのレンジはFPGAどっぷりになってしまいっております。




[メッセージ #78468 への返信]
> ●追記
> 前記の割り込み時の手抜き仕様は、「多重割り込み時」に割り込みレベルのpriorityを固定し、そのレベルの閾値に満たないレベルの割り込みは保留される仕様としています。

Reply to #78468

Re: PIC32MX220F032Bでhos-v4a (2016-08-06 09:23 by ryuz #78470)

少し追記しておきますと、DPC では、カーネルの中でオブジェクトの状態を書き換えるようなクリティカルな処理を割り込みを許可したまま行います。
当然割り込みが入ってきますので、その中で再びオブジェクトの状態を書き換えるようなカーネルコールが発生する可能性があります。
そのような場合、後から来た処理をそこでは処理せずにキューにためておき、最初のクリティカルな処理が終わってから実行するように処理を遅延します。

概念自体は ts_ingk様が優先度の低い割り込みをフラグを立てて保留しているのとまったく同じです。

こうすることで、いろいろな制約は増えるものの、割り込み処理のレスポンスを向上させることが可能になります。
Reply to #78469

Re: PIC32MX220F032Bでhos-v4a (2016-08-10 20:49 by ts_ingk #78498)

Ryuz様。

これを開始する際に、少しでも処理を軽くできないかな?と考えて色々と覗いた事はありましたが結局、道を外すようになったので中断したままとなっています。
そのうちにまたチャレンジすると思いますが、暫くはこのままだと思います。
その際には、御指導をお願いします。

さて、一応私の環境下で現状動作をしている例外ハンドラの処理をUPします。
この処理は某OSのハンドラとHOS-V4aのハンドラを混在した様な処理で、おそらく無駄な処理も結構入っていると思いますが、なにしろmips系は経験値が少ないに等しいので...。

●vector.S
    .section .vector_XXX,"ax"
~~略~~
__vector_XXX:
li k0, XXX
j _kernel_exc_hdr
nop
.end __vector_XXX

●例外処理ハンドラ
#include "mips_reg.h"
~~略~~
#define __K_OPT__
~~略~~
/************************************************
  例外処理ハンドラ
************************************************/
        .global _kernel_exc_hdr
        .ent  _kernel_exc_hdr
#ifdef __K_OPT__
_kernel_exc_hdr:
        /* %jp{レジスタ退避}%en{register save} */
        addiu  sp, -132
        sw   k0, 4(sp)        /* 割り込み番号保存 */
/*       mfc0  k0, _CP0_CAUSE */
        mfc0  k1, _CP0_STATUS
        sw   k1, 128(sp)       /* save CP0_STATUS */
        ins   k1, zero, 0x01, 0x0f
        ori   k1, k1, (6 << 10)    /* 割り込みレベル=6 ... 手抜き仕様 */
        mfc0  k0, _CP0_EPC
        mtc0  k1, _CP0_STATUS
        sw   k0, 124(sp)       /* save EPC */
        sw   ra, 120(sp)
        sw   fp, 116(sp)
        sw   t9, 112(sp)
        sw   t8, 108(sp)
        sw   t7, 104(sp)
        sw   t6, 100(sp)
        sw   t5, 96(sp)
        sw   t4, 92(sp)
        sw   t3, 88(sp)
        sw   t2, 84(sp)
        sw   t1, 80(sp)
        sw   t0, 76(sp)
        sw   a3, 72(sp)
        sw   a2, 68(sp)
        sw   a1, 64(sp)
        sw   a0, 60(sp)
        sw   v1, 56(sp)
        sw   v0, 52(sp)
        sw   at_reg, 16(sp)
        mfhi  s6
        sw   s6, 12(sp)
        mflo  s6
        sw   s6, 8(sp)
        lw   a0, 4(sp)        /* 割り込み番号取り出し */
        la   k0, _kernel_ictxcb
        lbu   k1, 0(k0)
        /* %jp{多重割込み判定} */
        bne   zero, k1, multiple_int
        addiu  k1, 1
        sb   k1, 0(k0)
        /* %jp{スタック入れ替え} */
        move  k1, sp
        lw   sp, 4(k0)        /* 割り込み用spへ切り替え */
        nop
        addiu  sp, -4
        sw   k1, 0(sp)        /* 割り込み前のsp保存 */
        /* %jp{割込み開始処理} */
        jal   _kernel_sta_inh
        nop
        /* %jp{割込みハンドラ実行} */
        jal   _kernel_exe_inh
        nop
        /* %jp{スタック復帰} */
        lw   sp, 0(sp)        /* 元のsp呼び出し */
        la   k0, _kernel_ictxcb
        sb   zero, 0(k0)
        /* %jp{割込み終了処理} */
        jal   _kernel_end_inh
        nop
ret_exc_hdr:
        lw   t0, 8(sp)
        mtlo  t0
        lw   t1, 12(sp)
        mthi  t1
        lw   at_reg, 16(sp)
        lw   v0, 52(sp)
        lw   v1, 56(sp)
        lw   a0, 60(sp)
        lw   a1, 64(sp)
        lw   a2, 68(sp)
        lw   a3, 72(sp)
        lw   t0, 76(sp)
        lw   t1, 80(sp)
        lw   t2, 84(sp)
        lw   t3, 88(sp)
        lw   t4, 92(sp)
        lw   t5, 96(sp)
        lw   t6, 100(sp)
        lw   t7, 104(sp)
        lw   t8, 108(sp)
        lw   t9, 112(sp)
        lw   fp, 116(sp)
        lw   ra, 120(sp)
        di
        ehb
        lw   k0, 128(sp)
        lw   k1, 124(sp)
        addiu  sp, sp, 132
        mtc0  k0, _CP0_STATUS
        mtc0  k1, _CP0_EPC
        ehb
        eret
        nop
multiple_int:
        sb   k1, 0(k0)
        /* %jp{割込みハンドラ実行} */
        jal   _kernel_exe_inh
        nop
        j    ret_exc_hdr
        nop
        .end  _kernel_exc_hdr
#else
~~略~~
#endif
Reply to #78470