So-net無料ブログ作成
検索選択

ユーザ・ドライバでLEDピカピカ [ColdFire V2]このエントリーを含むはてなブックマーク#

1990557

ユーザ・ドライバが書けるようになったので、応用プログラムを書いてみます。 題材は、もちろん、LEDピカピカです。

ユーザドライバで割り込みを使う

今回のプログラムのコンセプトは、例外ベクタを調べた (5)で取り上げた PIT1 割り込みを使った処理の移植です。 前回は、SilentCで全ての設定を行わせたため、機械語で書いた割り込みサービス・ルーチン (Interrrupt Service Routine) をRAMに書き込む部分までSilentCのプログラムで書きました。 今回は、すべての部分を CodeWarrior の C で記述します。

#include "support_common.h" /* include peripheral declarations and more */

//
//  Exception vector table on RAM
//
extern uint32 __VECTOR_RAM[];


//
//  Jump table for drivers.
//
uint32 init(uint32 arg);

asm void jump_table(void) {
  jmp init      // Driver #0   
}

//
//  PIT1 interrupt service routine
//
__declspec(interrupt) pit1_isr(void) {
  MCF_PIT1_PCSR |= MCF_PIT_PCSR_PIF;          // Clear PIF
  MCF_GPIO_PORTLD ^= MCF_GPIO_PORTLD_PORTLD1; // Toggle LNKLED
}

//
//  Driver #0
//    Initialize PIKA PIKA
//    arg  0 : Stop LED blinking
//         1 : Start LED blinking
//
uint32 init(uint32 arg){
  switch (arg) {
    case 1: // Enable PIKA
      // Prepare GPIO
      MCF_GPIO_PORTLD = 0x00; // PORTLD[1:0]=0
      MCF_GPIO_DDRLD  = 0x03; // DDRLD[1:0]=1
      MCF_GPIO_PLDPAR = 0x00; // PLDPAR[1:0]=0
      // Prepare INT
      __VECTOR_RAM[120] = (uint32)pit1_isr;         // Register ISR
      MCF_INTC0_IMRH &= ~MCF_INTC_IMRH_INT_MASK56;  // enable PITI
      MCF_INTC0_ICR56 = 0x08; // PRIORITY=0,LEVEL=1 
      // Prepare PIT
      MCF_PIT1_PMR    = 29297-1;  // Period count
      MCF_PIT1_PCSR   = 0x081F;   // Start PIT1
      return 1;
    case 0: // Disable PIKA
      MCF_PIT1_PCSR   = 0x0000;   // Stop PIT1
      return 0;
  }
  return (uint32)-1;
}

使用しているベクタは、#0のひとつだけです。 引数に 1 を指定すると、PIT1割り込みに必要な処理をすべて行い、呼び出し元に 1 を返します。 すると、割り込み処理によって、LEDは勝手に点滅を行います。 引数に 0 を指定すると、PIT1の動作を停止し、呼び出し元に 0 を返します。 割り込みイベントが発生しないので、LEDの点滅は止まります。 引数にそれ以外の値を指定すると、呼び出し元に -1 を返します。

RAM上にある割り込みベクタテーブルの場所は、リンカ命令ファイル (lcf) に書いてあります。 プログラムからは、 "__VECTOR_RAM" というシンボルとして、この場所を知ることが出来ます。 ここでは、32ビット幅、256要素の配列を示すシンボルとして宣言しています。

割り込みサービス・ルーチンには、関数の型宣言の代わりに "__declspec(interrurpt)" を付けます。 すると、通常の関数呼び出しは保存されないレジスタの退避・回復などが行われ、呼び出し元に戻る際には、 RTS (ReTurn from Subroutine) の代わりに RTE (ReTurn from Exception) が使われるようになります。

使ってみよう

コンパイル後、"COLDFIRE.BIN"を作成し、転送したら、準備完了です。

OK
?UserDriver(0,1)
1

基板上の LED3 が点滅を始めます。

OK
?UserDriver(0,0)
0

LED3 の点滅が止まります。

OK
?UserDriver(0,10)
-1

0 と 1 以外の引数は、受け付けられません。

参考文献

Interface (インターフェース) 2008年 12月号 [雑誌]

Interface (インターフェース) 2008年 12月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/10/25
  • メディア: 雑誌
Interface (インターフェース) 2008年 09月号 [雑誌]

Interface (インターフェース) 2008年 09月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/07/25
  • メディア: 雑誌

nice!(1)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 1

コメント 0

コメントを書く

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

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。