⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coprotest.c

📁 ARM ADS 程序示例(源码),coprotest.c,partest.c,interrupts.c
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>

/* exported functions in copro.s */
extern void DoCP4MCR0(unsigned);
extern unsigned DoCP4MRC0(void);
extern void DoCP4CDP0(void);
extern void DoCP4CDP1(void);
extern void DoCP4CDP2(void);
extern void DoCP4CDP3(void);
extern void DoCP4CDP4(void);
extern unsigned int DoCP4CDP5(void);


/* function to enable IRQ and FIQ */
__inline void enable_IF(void);

/* exception handler install */

unsigned Install_Handler( unsigned routine, unsigned *vector )
{
	unsigned vec, oldvec;

	vec = ((routine - (unsigned)vector - 0x8) >> 2 );
	if( vec & 0xff000000 ) {
		printf( "Installation of exception handler failed\n" );
		exit(1);
	}

	vec = 0xea000000 | vec;
	oldvec = *vector;
	*vector = vec;
	return (oldvec);
}

__irq void IRQHandler(void)
{
	printf( "IRQ entered\n" );
	DoCP4CDP4();
}

__irq void FIQHandler(void)
{
	printf( "FIQ entered - clear source\n" );
	DoCP4MCR0(0); /* put 0 in CP4 c0 */
	DoCP4CDP1(); /* Use CDP 1 with time = 0 to clear irq source */
}

int main()
{
	unsigned *irqvec = (unsigned*)0x18;
	unsigned *fiqvec = (unsigned*)0x1c;
	unsigned value=0;
	unsigned int timerValue=0;
	
	printf( "Installing handlers\n" );
	
	Install_Handler((unsigned)IRQHandler, irqvec);
	Install_Handler((unsigned)FIQHandler, fiqvec);
	
	enable_IF();
	
	printf("Handlers installed\n");
	
	printf("Use MRC/MCR \n" );
	DoCP4MCR0(0xFFFFFFFF); /* put 0xFFFFFFFF in CP4 reg 0 */
	
	value = DoCP4MRC0(); /* get above value from CP4 reg 0 */
	printf( "Value = %08x\n", value );
	
	DoCP4MCR0(0xaaaaaaaa); /* put 0xaaaaaaaa in CP4 reg 0 */
	value = DoCP4MRC0();
	printf("Value = %08x\n", value);
	
	printf( "CDP 1 - cause a FIQ\n" );
	DoCP4MCR0(500);
	DoCP4CDP1();
	printf( "Expecting a fiq. \nCDP1 done\n\n\n");
	
	printf( "CDP 2 - cause an IRQ\n" );
	DoCP4MCR0(500);
	DoCP4CDP2();
	printf( "Expecting an irq. \nCDP2 done\n" );
	
	printf( "\n\nRead timer\n" );
	
	timerValue = DoCP4CDP5();
	printf( "Value = %08x\n", timerValue );
	timerValue = DoCP4CDP5();
	printf( "Value = %08x\n", timerValue );
	
}

__inline void enable_IF(void)
{
  int tmp;
  __asm
  {
    MRS tmp, CPSR
    BIC tmp, tmp, #0xC0
    MSR CPSR_c, tmp
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -