Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2696841
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: 嵌入式

2014-12-11 16:14:27

C*Core中断处理程序说明:
// +FHDR -----------------------------------------------------------------------
// Copyright (c) 2009, Hongsi.
// Hongsi Confidential Proprietary
// 20096/07/21 
//
// -----------------------------------------------------------------------------
// File Name: init_int.c
// Type: C Language 
//
// -----------------------------------------------------------------------------
// Description:
// This code is a function for Interrupt Vector Initialization.
//
// -----------------------------------------------------------------------------
// Detailed Func Description:
// 1. Interrupt Vector Initialization Function.
// 
// -----------------------------------------------------------------------------
// Revision History
// DATE         AUTHOR          DESCRIPTION
// 2009/07/21 V1.0
// -FHDR -----------------------------------------------------------------------




// ---------------------------------------------------------------------  
// Variables Declarations 
// ---------------------------------------------------------------------  
// r2 : 1st arg of Fnuction;
// r3 : 2st arg of Fnuction;
// r4 : 3st arg of Fnuction;
// r5 : 4st arg of Fnuction;
#define BASE  r2
#define STACK r3
#define HANDLER r4
#define OFFSET r5

Disable_Interrupts;

INTC_ISCR = 0x00000000;
INTC_NIER |= 0x00000004; //Interrupt level 2 enabled: bit2=1
INTC_PLSR8_11 = 0x02000000; //PIT1 interrupt = level 2
//
 interrupt = level 2,在前面将中断等级设为 2 级, 起步正好从 32 开始  32 + 2 = 34  里面的34就是这样来的,isr_PIT1_PIF是
//中断处理函数的函数名,对于C语言函数名既是函数的首地址,因此 isr_PIT1_PIF 为函数首地址!

Init_Int(0x803c00,0x803e00,isr_PIT1_PIF,34);
说明:
0x803e00 - 0x803c00 = 512;//正好是512

所有异常向量都存放在管理员地址空间,并通过相对寻址方式访问。只有复位和软件复位向量是放在处理器存储表中。一旦初始化结束,异常向量表基址复位后被装入VBR  

C?CORE 支持512字节的异常向量表,可容纳128个异常向量 开始32 个向量用于内部产生的异常。剩余96个向量用于外部设备,诸如中断控制器等。




asm void Init_Int(register long base,register long stack,register void(*handler)(),register unsigned char offset)
{
mfcr r1, VBR //复制控制寄存器VBR的值到寄存器r1
mtcr BASE,VBR //转存寄存器BASE的内容到指定的控制寄存器VBR
movi  r7,31 //将立即数转存到寄存器r7
cmphs r0,r0 //如果相等则C bit置位
 loop: ld.w r6,(r1,0)
  st.w r6,(r2,0)
  addi r1,4
  addi r2,4
  //loopt r7,loop
  declt r7
  bf loop
  mfcr r1, VBR
  st.w STACK,(r1,0)
  mfcr r7, PSR
  bseti r7,1
  mtcr r7,PSR
  mfcr r6, VBR
  ld.w r0,(r6,0)
  mfcr r7, PSR
  bclri r7,1
  mtcr r7,PSR
  mfcr r6,VBR
  lsli OFFSET,2
  addu  OFFSET,r6
  st.w HANDLER,(OFFSET,0)
  jmp r15
}
阅读(1507) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~