ログインしていません。このフォーラムはログインユーザのみに投稿が許可されています。投稿する場合はログインしてください。
ダウンロード
Magazine
開発
アカウント
ダウンロード
Magazine
開発
ログイン
アカウント/パスワードを忘れた
アカウント作成
言語
ヘルプ
言語
ヘルプ
×
ログイン
ログイン名
パスワード
×
アカウント/パスワードを忘れた
日本語の翻訳状況
カテゴリ:
ソフトウェア
人物
PersonalForge
Magazine
Wiki
検索
OSDN
>
ソフトウェアを探す
>
システム
>
オペレーティングシステム カーネル
>
Hyper Operating System(ITRON仕様OS)
>
フォーラム
>
開発者
>
PIC32MX220F032Bでhos-v4a
Hyper Operating System(ITRON仕様OS)
Fork
概要
プロジェクト概要
開発ダッシュボード
Webページ
開発メンバー
画像ギャラリー
公開フィード一覧
活動
統計情報
活動履歴
ダウンロード
リリース一覧
統計
ソースコード
コードリポジトリリスト
Git
hos-v4a
CVS
リポジトリ閲覧
チケット
チケット一覧
マイルストーン一覧
チケットの種類一覧
コンポーネント一覧
よく使われるチケット一覧のリスト/RSS
新規チケット登録
文書
コミュニケーション
フォーラム
フォーラム一覧
開発者 (761)
ヘルプ (688)
公開討議 (342)
メーリングリスト
MLの一覧
hos-cvs
hos-git
ニュース
フォーラム:
開発者
(スレッド #37911)
話題(スレッド)一覧に戻る
RSS
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で動いているというのは感慨深いものがあります。
今後とも期待しております。
#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で同様の手は使いました)。
これで暫くの間、暇な時に試験を行う予定です。
#78445
への返信
Re: PIC32MX220F032Bでhos-v4a (2016-08-05 06:32 by
ts_ingk
#78468)
チケットに引用
●追記
前記の割り込み時の手抜き仕様は、「多重割り込み時」に割り込みレベルのpriorityを固定し、そのレベルの閾値に満たないレベルの割り込みは保留される仕様としています。
#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を固定し、そのレベルの閾値に満たないレベルの割り込みは保留される仕様としています。
#78468
への返信
Re: PIC32MX220F032Bでhos-v4a (2016-08-06 09:23 by
ryuz
#78470)
チケットに引用
少し追記しておきますと、DPC では、カーネルの中でオブジェクトの状態を書き換えるようなクリティカルな処理を割り込みを許可したまま行います。
当然割り込みが入ってきますので、その中で再びオブジェクトの状態を書き換えるようなカーネルコールが発生する可能性があります。
そのような場合、後から来た処理をそこでは処理せずにキューにためておき、最初のクリティカルな処理が終わってから実行するように処理を遅延します。
概念自体は ts_ingk様が優先度の低い割り込みをフラグを立てて保留しているのとまったく同じです。
こうすることで、いろいろな制約は増えるものの、割り込み処理のレスポンスを向上させることが可能になります。
#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
#78470
への返信