ARMulator下定时器中断测试程序

/****************************************************************************************/
/*  NAME:   test.c                                                                      */
/*  DESC:   test doby through I/O Port with timer interrupt(1s).                        */
/*  Date:   06.18.2008                                                                  */
/*  version:    0.0                                                                     */
/*  Program:    Shen Hui (Shh)                                                          */
/****************************************************************************************/
/*  程序主要演示怎样使用armulator的定时器中断.输入也可以不在程序中赋值,直接在内存中改  */
/*  关键的地方在:                                                                       */
/*  1>.要打开中断.                                                                      */
/*  2>.要更改IRQ的服务程序.                                                             */
/*  3>.'服务程序'必须离'矢量'在32MB范围内.即25位地址.                                   */
/*  4>.无中断矢量初始化程序(无.s文件),只设置了IRQ.                                      */
/*  5>.目标CPU必须与调试器一致(例如,同是arm920T).                                       */
/*  6>.MMU/PU initialization Pagetab必须设置为NO_PAGERABLES,否则映射不对                */
/****************************************************************************************/
/*Input:                                                                                */
/*  0805ff01: D0-start  h active                                                        */
/*  0805ff02: D0-stop   l active                                                        */
/*Output:                                                                               */
/*  0805ff0d: D0-doby1  l active            0805ff0e:   D0-doby1    l active            */
/*            D1-doby1  l active                        D1-doby1    l active            */
/*            D2-doby1  l active                        D2-doby1    l active            */
/*            D3-doby1  l active                        D3-doby1    l active            */
/*            D4-doby1  l active                        D4-doby1    l active            */
/*            D5-doby1  l active                        D5-doby1    l active            */
/*            D6-doby1  l active                        D6-doby1    l active            */
/*            D7-doby1  l active                        D7-doby1    l active            */
/****************************************************************************************/ 
#include "test.h" 
void itoa2(unsigned short n, unsigned char *str)
{//not find itoa in stdlib.h
    int i=0;
    int swap;
    do
    {
        str[i]=n%2+'0';
        i++;
    
    }while(n/=2);
    str[i--]='/0';
    for(n=0; n<i; n++, i--)
    {
        swap=str[n];
        str[n]=str[i];
        str[i]=swap;
    }
}
void __irq IRQ_Handler(void)
{
  unsigned status;
  status = IRQStatus;
  /* 处理中断源 */
  if (status & IRQTimer1)
  {
    Timer1Clear = 0; /* 清除中断 */
    IntCT1++;        /* 置标记   */
  } 
}
/* ************************************************** */
/* 更新'矢量'的内容使他包含一个转移到'服务程序'的指令 */
/* 函数返回原'矢量'值.                                */
/* 注意: '服务程序'必须离'矢量'在32MB范围内.          */
/* ************************************************** */
unsigned Install_Handler (unsigned routine, unsigned *vector)
{ 
    unsigned vec, oldvec;
    vec = ((routine - (unsigned)vector - 0x8)>>2);
    if (vec & 0xff000000)
    {
        printf ("Installation of Handler failed");
        exit(1);
    }
    vec = 0xea000000 | vec;//EA=
    oldvec = *vector;
    *vector = vec;
    return (oldvec);
}
/* ************************************************** */
/* 打开或关闭中断                                     */
/* 通过读 cpsr 标记然后更新第7位来打开或关闭中断      */
/* 这些函数只能用于 privileged 模式,因为cpsr和spsr的  */
/* 控制位在用户模式下不能改变.                        */
/* ************************************************** */
__inline void enable_IRQ(void)
{
    int tmp;
    __asm
    {
        MRS tmp, CPSR
        BIC tmp, tmp, #0x80
        MSR CPSR_c, tmp
    }
}
//
__inline void disable_IRQ(void)
{
    int tmp;
    __asm
    {
        MRS tmp, CPSR
        ORR tmp, tmp, #0x80
        MSR CPSR_c, tmp
    }
}
// 如果目标为920T则要清除所有中断捕获!
int main(void)
{
    unsigned short  Mask=1;
    unsigned char *str;
    
    DOBYINPUT0_7=0xff;
    DOBYINPUT8_F=0xff;
    
//  itoa2(0x1234,str );
//  printf("str %s/n",str);
    
    printf("Timer Interrupt/n");
    
//未安装前   00000018       [0xe7ff0010]   dci      0xe7ff0010 ; ? undefined
//使地址(IRQ)00000018处为:  [0xea002022]  * b  IRQ_Handler
    Install_Handler ((unsigned)IRQ_Handler, irqvec);
    
    printf("Normal (RAM at 0x8000, semihosting) version/n/n");
    printf("Initializing.../n");
//
    enable_IRQ();
    IRQEnableClear = ~0;      // 清除所有的中断
    
    Timer1Control = 0;        // 通过控制位关闭计数器
    Timer1Clear = 0 ;         // 通过写任何值到'清除'清除寄存器来清除中断
    Timer1Load = 2000;        // 装计数器值,可通过晶频计算,这里2000只是为了测试 
    Timer1Control = (TimerEnable | TimerPeriodic | TimerPrescale8 );     
    IRQEnableSet = IRQTimer1; 
    printf("Running.../n");
    IntCT1 = 0;          // 清 CT1 标记
     
    while (START)
    {
        if(STOP) break;
        if (IntCT1 != 0)        // 定时器1产生中断
        {
            IntCT1 = 0;         // 复位定时器1中断标记
            DOBYOUTPUT0_7 = (~Mask) & 0xFF;
            DOBYOUTPUT8_F =((~Mask) & 0xFF00)>>8;
            itoa2(Mask,str);
            printf("%016s/n",str);
            Mask<<=1;
            if(Mask==0) Mask=1;
        }
    }
    printf("Ended/n");
    disable_IRQ();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
最新下载 : http://www.hugacy.com/read.php?tid=15 如果你是一个ARM平台的video算法爱好者,或者开发优化工程师,你将会从这里领略到ARM模拟器带来的无穷魅力。 armulator.exe是最快的ARM指令集模拟器(性能是qemu的两倍),支持ARM7,ARM9,ARM11,Cortex/Thumb,可直接运行ELF和WINCE程序。(ELF程序用armcc或者arm gcc编译,WINCE程序用pb等编译) 。 如果只想关注应用程序开发,尤其做算法优化,比如汇编(甚至neon)优化,完全不想关心底层平台和操作系统,就请使用ARM模拟器,只要你的程序编译出来能在ARM+Linux的开发板上跑,就能在这个模拟器上运行。反之亦可。 使用高性能ARM模拟器,就可以体验ARM平台开发优化video codec的威力,不再需要去采购动辄几千元的ARM11, Cortex开发版,仅仅需要一台装有windows的PC,在ARM模拟器的帮助下,带领你进入arm平台video开发优化的世界。使用ARM模拟器最终开发出的video版本,不加任何修改就可以运行在真实的ARM产品平台上,执行结果绝无任何差异。 <**任何个人和团体学习者,及教育机构,在非赢利前提下,均可以无偿体验和使用ARM模拟器,商业使用请联系作者**> 使用方法极其简单,比如在开发板上运行./x264 --help 在PC上使用模拟器的方法:armulator.exe x264 --help 本压缩包的x264使用源代码版本x264-snapshot-20100824,具体生成过程如下: 1. 官方网站下载x264源代码并解压缩 2. 在host主机上执行./configure --disable-asm 3. 修改config.mak a. ARCH=ARM b. CC=arm-none-linux-gnueabi-gcc (请先指定好你的交叉编译器路径) c. AR=arm-none-linux-gnueabi-ar 4. 修改config.h,去掉一行#define ARCH_X86 1 5. make 对于neon汇编优化,需要在config.mak增加AS=arm-none-linux-gnueabi-as,需要4.3.3以后的交叉编译器. <**压缩包的包含的x264,仅作讨论交流之用,对于任何其它使用,不承担由其产生的一切后果**>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值