SSブログ

ColdFire V1がやって来た 例外処理 [ColdFire V1]

さて次は例外処理に付いて眺めてみます。
例外処理の手順:

1.例外処理に入ると、プロセッサはSRのコピーを生成し、Sbitをセットしてスーパーバイザー モードに入る。また、Tbitをクリアする事でトレースモードを解除する。
割り込み例外もまた、Mbitをクリアし、割り込み優先度を現行の割り込みレベルにセットする。

2.プロセッサーは割り込みベクター番号を決定する。
全てのFAULT例外割り込みでは、プロセッサーはそのタイプに基づいた計算を実行する。

割り込み例外では、CPUCRのIAEがセットされているならば、割り込みコントローラからベクター番号を得る為の割り込み認識(IACK)サイクルを実行する。
IACKサイクルは、割り込みレベルをアドレスにコード化して、割り込みコントローラのアドレス空間の中の特別な場所にマップされる。???なんだこりゃ?。

CPUCRのIAEがクリアされているなら、パフォーマンス改善の為に要求が合図される時、プロセッサは割り込みコントローラから供給されるベクター番号を使用する。???なんだこりゃ?。

※いまいち訳がすっきりしないな。これは実験が必要だな。
※どっちにしろ割り込みベクター番号は割り込みコントローラから供給されると言う事か?。

3.プロセッサーはシステムスタック上に例外スタックフレームを生成する事で、現行のコンテキストの保存を行う。
例外スタックフレームは、スーパーバイザー スタック ポインタで示されるシステムスタックの上に”0-modulo-4 address”として生成される。

プロセッサーは、全ての例外に対して単純化された固定長のスタックフレームを使用する。

例外タイプはFAULT時のインストラクションの位置か、次に行うべきインストラクションのアドレスのどちらかを、例外スタックフレームのプログラムカウンタの位置に入れるかを決定する。

※”0-modulo-4 address”ってのはあれか!、4で割り切れるアドレスって事か?。

4.プロセッサーは例外ハンドラの最初のインストラクションのアドレスを計算する。
例外ベクターテーブルは1Mbyte境界に配置される。
このインストラクションアドレスは、ベクター ベース レジスタ内に定義されるアドレスに位置するテーブルから例外ベクターをフェッチする事で生成される。
例外テーブルへのインデックスはベクター番号の4倍として計算される。
例外ベクターがフェッチされた後、ベクターの中身は、要求が発生したハンドラの最初のインストラクションのアドレスを決定する。
ハンドラーの最初のオペコードのインストラクションフェッチが始まった後、例外処理は終了する。そして、通常のインストラクションはハンドラー内で継続する。

全てのColdFireプロセッサーは、1Mbyteアドレス境界に配置される1024byteのベクターテーブルをサポートする。V1 Coreにとって実際的な位置は、FLASH ROMの0x0000 0000番地か、RAMの0x0080 0000番地を基本とされる。
テーブルは256の例外ベクターで構成される。最初の64はcoreの為に定義されており、残りの192は周辺デバイスに割り付けられている。
※詳細は8章を読む。

V1 Coreにとって、最初の64を内部のプロセッサー例外の為に予約。ベクターが64~102は周辺デバイスと7つのソフトウエア割り込みの為に予約。ベクター103~255は使用されてはいないが、予約済みとなっている。

まだまだ続くぞ、こりゃ。


nice!(0)  コメント(28)  トラックバック(2) 

nice! 0

コメント 28

のりたん

> IACKサイクルは、割り込みレベルをアドレスにコード化して、

68000の場合ですが、

CPUは、受け付けた割り込みのレベルを知っているので、そのレベルをアドレスバスの A3-A1 に流します。これがIACKサイクルです。一方、割り込みコントローラは、割り込みレベルに応じた割り込みベクタを知っているので、そのアドレスを D7-D0 に流します。これが割り込みコントローラを使用する場合の動作です。

> CPUCRのIAEがクリアされているなら、

一方、68000には、自動ベクタという機能があって、割り込みコントローラを使用せずに、割り込みレベルに応じた割り込みベクタをCPU自身が発生することができます。でも、これとは違う機能みたいですね。

"at the time the request was signaled" の "request" というのは、割り込み要求の事だと思いますので、「割り込み要求が来たときにIACKサイクルでCPUにお伺いをたてる事無く、勝手にベクタアドレスを発生する」という意味でしょう。

参考文献
M68000ファミリ 16/32ビット データブック
CQ出版、昭和58年6月1日初版発行
by のりたん (2008-01-04 22:48) 

hamayan

↑なるほど、なるほど。

しかしもっとも理解し難くしているのが、QE128はプロセッサタイプではなくコントローラタイプであり、ローカルバスはチップ内部で完全に閉じているのに、何故にわざわざ外部に割り込みコントローラーが在る様な動作シーケンスが有るのか?。それが判らない。
by hamayan (2008-01-04 23:05) 

のりたん

> 何故にわざわざ外部に割り込みコントローラーが
> 在る様な動作シーケンスが有るのか?

きっと、 "ColdFire V1" が "ColdFire V2" から作られたからだと思います。上位の ColdFire は、外部バス前提の設計になっています。この割り込みコントローラの利点は、割り込みに優先順位がつけられる所の一点だと思います。しかも、割り込みソースのうち、二つだけは、特別に優先順位を上げることが出来ます。

この機能、HC(S)08には無いのですが、HC11マイコンには存在していて、"HPRIO"というレジスタで優遇する割り込みソースを指定する事ができます。まあ、使うことがなければ、トコトン必要の無い機能なんですけどね。

私にとって謎なのが、「7つのソフトウエア割り込み」です。「15種類のTRAP命令」とは別に「ソフトウェア割り込み」があるらしいのだけど、どうやって使うのだろう??
by のりたん (2008-01-04 23:33) 

のりたん

試しにCodeWarrior で 空プロジェクトを作らせて眺めてみました。

例外ベクタ・テーブルは、"Project Settings/Startup Code/exceptions.c"にあります。

リセット後のPCの値は、INITPC番地($000004)に入っていて、ここには"Project Settings/Startup Code/startdf.c"ファイルで定義される"_startup()"関数のアドレスが入ります。

一方、リセット後のSSPの値は、INITSP番地($000000)に入っていて、ここには"exceptions.c"で定義されるextern配列変数"_SP_INIT"のアドレスが入ります。"_SP_INIT"を宣言しているのは、HCS08のPRMファイルに相当する"Project Settings/Linker Files/Project.lcf"です。"userram"エリアに"heap"と"stack"が含まれる".custom"セグメントを宣言しています。

この他に"userram"には、static変数の入る".data"と".bss"の二つのセグメントが宣言されています。それぞれのセグメントの割り当て結果は、"Project Settings/Linker Files/Project.abs.xMAP"に記録されます。

この空プロジェクトだけで例外ベクタ以外に$000410から$0008B7まで1191バイトのROMを消費しています。さすがにでかいな。
by のりたん (2008-01-06 10:19) 

hamayan

> この空プロジェクトだけで例外ベクタ以外に$000410から$0008B7
> まで1191バイトのROMを消費しています。さすがにでかいな。

まあこれ位は、ROM容量が128K有るので許してあげましょう。

実は68Kは初めてなので、結構四苦八苦しています。
そうか!、割り込み入った所で、スタックをほじくるとベクター番号が判るのは良いなあ。

Cコンパイラのマニュアルは何処に有るのかな?。
by hamayan (2008-01-06 12:41) 

のりたん

今日は、例外処理を実機で確認。

新モジュールのRTCを使って、0.5秒毎に割り込みを発生させます。

// Configure RTC module
RTCSC_RTCLKS = 0; // 1kHz OSC
RTCSC_RTCPS = 11; // 10msec
RTCMOD = 50-1; // 50counts (500msec)
RTCSC_RTIE = 1; // Enable interrupts.

割り込みが発生したらLEDを反転します。 Interrupt Service Routine (ISR) は、こんな感じ。

__interrupt VectorNumber_Vrtc rtc_isr(void) {
RTCSC_RTIF = 1; // Clear the flag.

// Toggle the PTC0
RGPIO_TOG = RGPIO_TOG_TOG8_MASK;
}

Example プロジェクトを真似っ子しました。
RTCのフラグのクリアの仕方は、TPMと異なっているので注意が必要です。何で、統一しないかなあ。

デバッガでISRに入ったところに Breakpoint を仕掛けて、スタックを確認しました。

4158 2014 00000460

Format = 0100; 8バイトスタックフレーム
FS = 0000; no fault
Vector = $158; RTC割り込みのベクタ
SR = $2014; ステータス・レジスタ
PC = $0000046; プログラム・カウンタ

おぉ、確かにリファレンスマニュアルどおりだ。

割り込みベクタテーブルは、以前のコメントにも書いたように、 "Project Settings/Startup Code/exceptions.c" ファイルで作成されます。このファイルの中では、デフォルトの ISR があてがわれているので、 "main.c" に書いた ISR と競合しそうな気がしますが、 "main.c" で書いた "__interrupt" 宣言の方が優先されるようです。

そろそろ、Cコンパイラのマニュアルのありかを探すか。
by のりたん (2008-01-08 19:46) 

hamayan

> "main.c" で書いた "__interrupt” 宣言の方が優先される
> ようです。

おお、そうなんですか!。
今日、試しにちょびっとタイマー割り込みを試そうとコーディングをしたのですが、exceptions.cの該当部分を一々コメントアウトしていました。


> そろそろ、Cコンパイラのマニュアルのありかを探すか。

それです、それ。
先日、半日位アメリカサイトをうろうろして、でも見付けられなかった。
(;´д` )
by hamayan (2008-01-08 21:11) 

のりたん

CodeWarriorのオンラインマニュアルから類推して、Cコンパイラのマニュアルは、 Build Tools Reference というPDFファイルにまとまっていると思います。 HC(S)08 や ColdFile Architecture の Build Tools Reference は見つかるのに肝心の ColdFire V1 用が見つかりません。無いのかな?

本日二つ目のテーマは、スーパバイザモードからユーザモードへの移行です。まず、グローバルな記憶域にユーザモードスタックを確保します。

static dword ustack[16];

ユーザモードへ移行するためのマクロがどこかにあるかも知れませんが、今の知識ではアセンブラで書くしかありません。

__asm {
move.l a0,-(a7) // save A0
move.l #&(ustack[16]),a0
move.l a0,usp // initialize USP
move.l (a7)+,a0 // restore A0
move.l d0,saved_d0 // save D0
move.w sr,d0
and.l #0xFFFFDFFF,d0
move.w d0,sr // Clear S flag
move.l saved_d0,d0 // restore D0
}

前半でユーザモードでのスタックポインタを設定します。後半では、SRレジスタのSビットをクリアします。クリアしたとたんにA7が入れ替わるので、D0の退避には、スタックではなく静的変数 saved_d0 を使います。

スタックフレームは、SSPに積まれます。

4158 0000 00000414

Format = 0100; 8バイトスタックフレーム
FS = 0000; no fault
Vector = $158; RTC割り込みのベクタ
SR = $0000; ステータス・レジスタ S=0 I=000
PC = $00000414; プログラム・カウンタ

ISR の入り口に Break point を仕掛けると、 SR=$2200 となっています。 S=1, I=010 と、 RTC 割り込みのレベル2まで割り込みがマスクされていることがわかります。

これを拡張していくと、マルチタスクみたいな事ができると思いますが、こんな短いプログラムでも穴だらけに見えてきます。
by のりたん (2008-01-08 22:27) 

hamayan

この前遊びでスーパーバイザーモードとユーザーモードの切り替えをやってみました。元にしたのは、CodeWarriorをインストールするとできる
C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.1\(CodeWarrior_Examples)\ColdFire V1\Assembly Examples\MCF51QE Demos\MCF51QE128 Demo\Sources
です。

まずスタートアップでシステムの初期化完了後、
move SR,D0
andi.l #0xD8FF,D0
move D0,SR
lea ___USER_SP_INIT,A7

で!、割り込みの中で
move.w #0x0478,(6,SP)
※0x0478は元とは別のプログラムのアドレスを直接指定。

で、割り込み元とは別の所に戻って来る事やっていました。

SRレジスタのSbitをクリアしてから、SRレジスタをいじると、デバッカーを巻き込んで暴走するのね( ̄ー ̄)。

頭の中の構想では、これを進めてラウンドロビンをやろうかと思っているのですが、noritanさんの方が早そうですね。

コンテキストスイッチの要領が判れば、後はあれ、野望に向けて進む事ができます。
by hamayan (2008-01-08 22:52) 

hamayan

インラインアセンブルの#asm、#endasmキーワードが使えないのね。
さて、困ったぞ!。
by hamayan (2008-01-09 06:53) 

hamayan

__asm { };が使えるので、上記キーワードが使えなくとも大丈夫みたい。

ところで割り込みの出入り口処理もCソース+アセンブラマクロで対応できるかと思ったけれど、アセンブラで書いた方が確実かな、やはり。
by hamayan (2008-01-09 07:56) 

のりたん

おぉ、すでに「遊んで」いらっしゃったのですね。

Assembly Example なんてのがあったんですか。ウィザードは、アセンブラを使う新規プロジェクトを作らせてくれないので、やっちゃいけないのかと思っていました。

オペレーティングシステムを考えるとなると、どうしてもアセンブラで記述することになります。私は、別ファイルにアセンブラソースを書こうとしていたのですが、どうやら、かなり強力なインラインアセンブリがあるみたいで、Cのソースファイルだけでもけっこういけるんじゃないかと。オンラインマニュアルが、 CodeWarrior のヘルプの ColdFire V1 for Microcontrollers : ColdFire Build Tools Reference : Inline Assembly にあります。PDF版は、まだ見つかりません。

# Function-level のインラインアセンブラと言うのは、Cなのか?

私が参考にしているのは、ITRONではなく、これです。

OS-9/68000 共立出版株式会社
1989年1月30日初版

すごい、まだamazonに新品があることになっている。
by のりたん (2008-01-09 08:25) 

のりたん

オンラインヘルプに一番近いPDFは、これみたいです。

CF63BTRM
CodeWarrior Development Studio ColdFire Architectures Edition Build Tools Reference

アセンブラのマニュアルは、これです。

CFV1ASSEMBLERRM
ColdFire v1 Assembler Manual

それぞれのキーワードを freescale.com の右上にある Enter Keyword に入れて探してください。
by のりたん (2008-01-09 08:50) 

hamayan

> おぉ、すでに「遊んで」いらっしゃったのですね。

そうなんです。正月休みの最後の方でやっていて、コンテキストの切り替えが動いたので、じゃあC言語のアセンブラインタフェースの辺りでも調べようか!と思って、そこからが迷い道。

例えば引数の渡し方は、レジスタ渡しなのか、スタックに積むのか?。
保護されるべきレジスタ、保護の要らないレジスタなど等。
リストとか逆アセンブルで調べることができますが、最適化を変えるとそこも変わっちゃうんじゃ困っちゃうし。明確な文書が欲しいのです。

ドキュメントの在り処、有難うございます。ISA_?は見つかったんですけれどね。

> Cのソースファイル

結局ユーザーモードのプログラムカウンタとかをスタックからほじくる場合、Cソース中のインラインアセンブラでは、その時点のスタックの深さが判らない、、、ああ、その為のA6なのか、、、なるほど、成る程。
by hamayan (2008-01-09 09:04) 

hamayan

> OS-9/68000 共立出版株式会社
> 1989年1月30日初版
> すごい、まだamazonに新品があることになっている。

(*^。^*)是非、カスタマーレビューを書いてやって下さい。
by hamayan (2008-01-09 09:08) 

のりたん

A6は、いわゆるベースポインタと呼ばれるもので、LINK/UNLK命令で簡単に操作できます。このスタックフレームを作るか作らないかは、 CodeWarrior の Standard Settings : Code Generation : ColdFile Processor にある A6 Stack Frames で指定できます。今やオプションになってしまっています。

LINK/UNLK命令を使ったスタックフレームは、元をたどると呼び出し側の関数内変数をアクセスすることができます。この機能は、関数内に子関数を定義することができて、子関数から親関数の関数内変数にアクセスする事が許されているPASCALで必要な機能です。そのため、必ずしもCでは必要ないと思っていました。

LINKには、作業領域を確保するためのオペランドが付けられるのだけど、どうやってもコンパイラは使ってくれません。何故なんだろう。

> 引数の渡し方は、レジスタ渡しなのか、スタックに積むのか?
これもオプションで設定できるようになっているのですが、ライブラリを作成する場合には、どちらかに決めてくれないと困りますよね。何か、指示子でもあるのかな?

インラインアセンブラの fralloc を使って、実験的に調べたところ、保護しなくてはならないのが A5-A7 、使ってもいいけど元に戻さなきゃいけないのが D3-D7/A2-A4 、ワークエリアに使って壊してもいいのが残りの D0-D2/A0-A1 という結果になりました。もっとも、公式文書は見つけていません。

タイマ割り込みでタスクを切り替えるときに、コンテキストに必要なRAM容量を考えてみたのですが、D0-D7/A0-A7で64バイト、割り込みスタックフレームに8バイト、と軽く100バイトぐらいは消費してしまいます。これにそれぞれのタスクに必要な記憶域とスタックを用意すると、8K/4KのRAMがあっても、あっという間にいっぱいになってしまいそうで…やっぱり、68Kは、重いなあ。
by のりたん (2008-01-09 12:27) 

のりたん

68000は、本質的に多重割り込みが出来るように設計されているのですが、プログラムを書くほうは対応する心積もりがありません。このチップの場合、RAM容量が少ないので多重割り込みでスタックの予定容量を超えてしまったら即暴走と言う事態になりかねません。

多重割り込みを禁止する方法は、リファレンスマニュアルの Chapter 8 Interrupt Controller の 8.6.1 Emulation of the HCS08's 1-Level IRQ Handling に書いてあります。
1. ISRの最初の命令として、 STLDSR #$2700 を実行せよ。
2. ISRの最初の命令として、 MOVE.w #$2700,SR を実行せよ。
ColdFireは、ISRの最初の命令だけは、割り込みを受け付けない仕様だそうです。そのため、最初の命令で割り込みマスクレベルを7に設定すれば NMI 以外の割り込みが発生することはありません。とはいっても、 SR レジスタの割り込みマスクだけを 7 に設定する気の利いた命令は無いので、 SR レジスタ全体に定数を書き込むことになります。
STLDSR 命令は、 SR をスタックに積んでから定数を設定しますので、 CCR の部分を取り戻すこともできます。でも、よく考えたら、割り込み発生前の SR の値は元々スタックフレームに入っているから、いくらでも取り戻せるんですよね。

多重割り込みを起こさせないもう一つの効果的な方法は、
3. CPUCR レジスタの IME ビットをアサートせよ。
このビットをアサート(セット)すると、割り込みが発生したときに割り込みマスクに 7 を入れてくれるので、 NMI 以外の割り込みは発生しません。しかも、 ISR に妙な命令を入れなくて済みます。なんだ、これでいいじゃん。

相変わらず不明なのは、ベクタ番号 96 から 102 のソフトウェア割り込みです。何のことだろうな?
by のりたん (2008-01-09 17:46) 

hamayan

コンテキストスイッチに必要な容量を考えてみると、タスクはユーザーモードで動くので、D0~D7/A0~A7とPCとCCRでしょうか。全部で72byte程。

HOSを考えてみると、タスク以外で一番RAMを消費しているのはTCB(タスクコントロールブロックで、SHの場合、1タスクに56byte消費しています。

意外と頭が痛いのは割り込み管理用の領域で、割り込みの数×8byte消費するので、192個割り込みをサポートすれば1536byteか。
もっとも下限値と上限値を設定できるのですが。

つまり、デフォルトで2Kbyte+TCBの56byte×タスクの数+各々のタスクスタック(必ず72byte以上)+割り込みスタック+idleタスク用(これは128byte程度有れば)が必要になるRAM領域の最低です。
それにリソースを使えば、そのリソースの分。

まあうっかりprintfとかfloatとか呼ばなければ、4とか5個くらいのタスクは起動できる様に思えます。

RTOSは、V1で立ち上げて、V2以上に展開すると言う事で。
by hamayan (2008-01-09 19:02) 

nori@まだ55歳

>OS-9/68000 共立出版株式会社
昔、ソニーマグネスケールのNV10というのを使ったとき、OS-9の本を
探したけど見つけられませんでした。
ま、見つけてても私には、理解できて無いと思いますが。
ぼっけえ懐かしい名前OS-9じゃけえ書いてみた。
by nori@まだ55歳 (2008-01-09 20:29) 

hamayan

noriさん、もしかして一週間切っている?。

「ぼっけえ」って、岡山の言葉なんですね!。
by hamayan (2008-01-09 23:17) 

のりたん

他に「でえれぇ」というのもお忘れなく。

その昔、岡山のメーカーが出していたMPUボードの型番が、D0何とかというやつで、読み仮名に「でえれぇ」と付いていたのを思い出しました。たしか、笠岡だと思っていましたが、どこのメーカーだったか、記憶をたどっても、googleさんにきいても出てきません。
by のりたん (2008-01-10 05:13) 

nori@まだ55歳

でえれぇ16、って川鉄のCPUだった様な気が・・
試した人の話ではZ80より早いと言ってましたが。
その人は、その後もZ80を使ってました。

>noriさん、もしかして一週間切っている
切ってます。
by nori@まだ55歳 (2008-01-10 20:32) 

DAI

「でえれぇ」
私も記憶にあります。トラ技の広告で見たのかな。
大きな勘亭流の文字だったような気がします。
by DAI (2008-01-10 21:28) 

のりたん

えぇと、例外処理の話を書いてもよろしいでしょうか。

本日、何もしないタスク二つをタイマで切り替えるプログラムを書いてシミュレーションにかけたのですが、なぜか、特権命令実行例外が発生して暴走してしまいました。

で、追いかけましたところ、RTC割り込みのISRルーチンでコンテキスト保存のために実行している move USP,A1 が気に入らないとのこと。ISRルーチン内は、当然、スーパバイザモードだろうと動きを追いかけたところ、本当にISRに入ってもユーザモードのままです。

きっと、タスク切り替えなんて複雑なことをしたからに違いないと考えました。そこで、 main 関数でユーザモードに入って、ユーザスタックを設定してからRTC割り込みを待つだけの簡単なプログラムをシミュレータで実行したところ、やはりユーザモードのままISR内に入り、例外を発生してしまいました。

たしか、シリコンでは、正常に動いていたので、これはシミュレータの問題なのではないかと思います。これも確認してから本国のService Requestに聞いてみます。まだ、バグが残っているみたいだなあ。
by のりたん (2008-01-10 23:57) 

hamayan

> えぇと、例外処理の話を書いてもよろしいでしょうか

勿論どうぞ、どうぞ。

> 何もしないタスク二つをタイマで切り替えるプログラム

いよいよラウンドロビンですね。これができるだけでも随分使い勝手が変わってきますからね。

やはり、実機デバックに勝るもの無し、、、かな。

そろそろMC51QE128を搭載するドーターボードの設計を考えねばなりませんね。
by hamayan (2008-01-11 01:03) 

のりたん

MC51QE128のドータカード、 P&E Micro でバラ売りされています。

http://pemicro.com/products/product_viewDetails.cfm?product_id=15320095
P&E Microcomputer Systems
- MCF51QE128 Daughter Card
- ColdFire V1, Development Board

こっちは、MC9S08QE128

http://pemicro.com/products/product_viewDetails.cfm?product_id=15320094
P&E Microcomputer Systems
- MC9S08QE128_Daughter_Card
- 68HCS08, Development Board

どちらも一枚$25.00と部品調達や実装の手間を考えると妥当なのですが、何ぶん、入手方法が P&E Micro への直接注文しかないようです。試しに見積もりを取ったら、送料 $53.10 ということで、よほど枚数を集めなければならないようです。

# ドータボードを作る際は、ぜひ通常の三倍早い赤いレジストで作ってください。

# どちらも同じ価格。こんなとこまで、コンパチにする必要もなかろうに。
by のりたん (2008-01-11 08:36) 

hamayan

> ぜひ通常の三倍早い赤いレジスト

シャア専用ですか!。足は要りますか?。
追加料金5000円です。

$25は魅力的ですが、DEMOQE128が5879円なので!(笑)。
それと四方にPINが有ると、マザー側の配線が難しくなるので、できれば側面の2方向にまとめたい。
by hamayan (2008-01-11 08:57) 

のりたん

> 足は要りますか?
あんなもんは、飾りじゃけぇ。
上のもんには、それがよぅわからんのじゃ。

いや、足の無いドータボードは、シャレにならないので、追加してください。

> できれば側面の2方向にまとめたい。
すると、64P-DIPパッケージ?
いよいよ、68000らしくなってきました。
by のりたん (2008-01-11 15:23) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 2

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。