FC2カウンター FPGAの部屋 MicroBlaze MCSをISE WebPACKから使用する6(割り込み)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

MicroBlaze MCSをISE WebPACKから使用する6(割り込み)

今回は、また例によって、、”iso.enat.jp さんのブログ”の”MicroBlaze MCSで割り込みを使う”を参考にさせて頂いてやってみた。(microblaze_enable_interrupts とmicroblaze_disable_interrupts を引用させて頂いた)

結果は、うまく割り込みで動作した。mb-gcc のオプションが-O2 でも -O0 でも同様に割り込みで動作した。

Cソース (Atlys_LED_int.c) を下に貼っておく。

// 
// Atlys_LED_int.c
//
// AltysボードのLEDを1秒ごとに+1するソフトウェア
// FITの割り込みを使用する
//

#define    GPO1_ADDR            0x80000010
#define GPI1_ADDR            0x80000020

#define IRQ_ENABLE            0x80000038
#define IRQ_ACK                0x8000003C
#define    FIT1_INTERRUPT_BIT    0x80        // FIT1の割り込みビット位置

volatile int interrupt = 0;

//割り込み処理
void interrupt_handler()    __attribute__ ((interrupt_handler));
void interrupt_handler() {
    interrupt = 1;
    *(volatile unsigned int *)(IRQ_ACK) = FIT1_INTERRUPT_BIT;
}

//割り込み許可
void microblaze_enable_interrupts()

    __asm__(
    "mfs    r12, rmsr\n\t"        //Read the MSR register
    "ori    r12, r12, 2\n\t"    //Set the interrupt enable bit
    "mts    rmsr, r12\n\t"        //Save the MSR register
    );
}
//割り込み禁止
void microblaze_disable_interrupts()
{
    __asm__(
    "mfs    r12, rmsr\n\t"        //Read the MSR register
    "andi    r12, r12, ~2\n\t"    //Clear the interrupt enable bit
    "mts    rmsr, r12\n\t"        //Save the MSR register
    );
}

int main()
{
    unsigned int led = 0x55;
    
    *(volatile unsigned int *)(GPO1_ADDR) = led;
    
    microblaze_enable_interrupts();
    *(volatile unsigned int *)(IRQ_ENABLE) = FIT1_INTERRUPT_BIT;
    
    while(1){
        // FIT割り込み待ち
        interrupt = 0;
        while(interrupt==0);
        *(volatile unsigned int *)(GPO1_ADDR) = led++;
    }
}



Makefile を下に貼っておく。

TARGET=Atlys_LED_int.elf
TARGET_DEBUG=Atlys_LED_int_debug.elf
SRCDIR=./
OBJDIR=./

SRCS=            $(SRCDIR)Atlys_LED_int.c
OBJS=            $(OBJDIR)Atlys_LED_int.o
OBJS_DEBUG=        $(OBJDIR)Atlys_LED_int_debug.o

CC=mb-gcc
CFLAGS=-O2 -mlittle-endian -Wl,-Map=Atlys_LED_int.map
CFLAGS_DEBUG=-O0 -g -mlittle-endian -Wl,-Map=Atlys_LED_int_debug.map
LDFLAGS1=-Wl,-s

$(TARGET) : $(OBJS)
    $(CC) $(CFLAGS) $(LDFLAGS1) $(OBJS) -o $(OBJDIR)$(TARGET) $(LDFLAGS2)

$(OBJDIR)Atlys_LED_int.o: $(SRCDIR)Atlys_LED_int.c $(INCS)
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    rm -f $(OBJDIR)*.elf $(OBJDIR)*.o $(OBJDIR)*.map 

debug: $(TARGET_DEBUG)

$(TARGET_DEBUG) : $(OBJS_DEBUG)
    $(CC) $(CFLAGS_DEBUG) $(OBJS_DEBUG) -o $(OBJDIR)$(TARGET_DEBUG) $(LDFLAGS2)

$(OBJDIR)Atlys_LED_int_debug.o: $(SRCDIR)Atlys_LED_int.c $(INCS)
    $(CC) $(CFLAGS_DEBUG) -c $< -o $@


  1. 2012年02月11日 07:27 |
  2. MicroBlaze MCS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/2061-394d85fd
この記事にトラックバックする(FC2ブログユーザー)