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

📄 swi.h

📁 国外LPC2000系列的一些源程序,请大家快快下载
💻 H
字号:
/* done by Martin Thomas */

/* This needs more testing... */

#ifndef SWI_H_
#define SWI_H_

#include "swi_numbers.h"

static inline unsigned long do_SWI( const int swi_num, 
	unsigned long par0,
	unsigned long par1,
	unsigned long par2,
	unsigned long par3 )
{
	unsigned long ret_val;

	asm volatile (
		"mov r0, %2 \n\t" \
		"mov r1, %3 \n\t" \
		"mov r2, %4 \n\t" \
		"mov r3, %5 \n\t" \
		"swi %a1    \n\t" \
		"mov %0, r0 \n\t" \
		:	"=r" (ret_val)
		:	"I" ((const int)swi_num), 
			"r" (par0), "r" (par1), "r" (par2), "r" (par3)
		:	"r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
	);

	return ret_val;
}

#define SWI_CALL(MY_SWI_ID) \
	asm volatile( \
	"swi %a0     \n\t" \
	: : "I" (MY_SWI_ID) : "lr")

#define MY_SWI_CALL_RES(MY_SWI_ID, MY_RESULT) \
	asm volatile( \
	"swi %a1     \n\t" \
	"mov %0,r0  \n\t" \
	: "=r" (MY_RESULT) : "I" (MY_SWI_ID) : "r0", "lr" )

#define MY_SWI_CALL_PARAM(MY_SWI_ID, MY_PARAM, MY_RESULT) \
	asm volatile( \
	"mov r0,%1  \t\n" \
	"swi %a2     \n\t" \
	"mov %0,r0  \n\t" \
	: "=r" (MY_RESULT) : "r" (MY_PARAM), "I" (MY_SWI_ID) : "r0", "lr" )

static inline unsigned long IntGetCPSR(void)
{	
	unsigned long res; 
	MY_SWI_CALL_RES(SWI_NUM_GET_CPSR, res);
	return res;
}

static inline unsigned long IntDisable(void)
{
	unsigned long res; 
	MY_SWI_CALL_RES(SWI_NUM_IRQ_DIS, res);
	return res;
}

static inline unsigned long IntEnable(void) {
	unsigned long res; 
	MY_SWI_CALL_RES(SWI_NUM_IRQ_EN, res);
	return res;
}

static inline void IntRestore(unsigned long oldstate)
{
	unsigned long res; 
	MY_SWI_CALL_PARAM(SWI_NUM_IRQ_REST, oldstate, res);
}

static inline unsigned long FiqDisable(void)
{
	unsigned long res; 
	MY_SWI_CALL_RES(SWI_NUM_FIQ_DIS, res);
	return res;
}

static inline unsigned long FiqEnable(void) {
	unsigned long res; 
	MY_SWI_CALL_RES(SWI_NUM_FIQ_EN, res);
	return res;
}

static inline void FiqRestore(unsigned long oldstate)
{
	unsigned long res; 
	MY_SWI_CALL_PARAM(SWI_NUM_FIQ_REST, oldstate, res);
}



#if 0
static inline unsigned long do_SWI2 (int swi_num, 
	unsigned long par0,
	unsigned long par1,
	unsigned long par2,
	unsigned long par3)
{
	unsigned long ret_val;

	register unsigned long reg0 asm("r0") = par0;
	register unsigned long reg1 asm("r1") = par1;
	register unsigned long reg2 asm("r2") = par2;
	register unsigned long reg3 asm("r3") = par3;

	asm volatile (
		/* "mov r0, %2 \n\t" \
		"mov r1, %3 \n\t" \
		"mov r2, %4 \n\t" \
		"mov r3, %5 \n\t" \ */
		"swi %a1    \n\t" \
        "mov %0, r0 \n\t" \
		:	"=r" (ret_val) /* Outp */
		:	"I" ((const int)swi_num) // , 
		/*	"r" (reg0), "r" (reg1), "r" (reg2), "r" (reg3) */ /* Inp */
		:	"r0", "ip", "lr", "memory", "cc" /* Clobber */ 
	);

	return ret_val;
}
#endif

#if 0
static inline unsigned long do_SWI( const int swi_num, 
	unsigned long par0,
	unsigned long par1,
	unsigned long par2,
	unsigned long par3 )
{
	unsigned long ret_val;

	asm volatile (
		"mov r0, %2 \n\t" \
		"mov r1, %3 \n\t" \
		"mov r2, %4 \n\t" \
		"mov r3, %5 \n\t" \
		"swi %a1    \n\t" \
		"mov %0, r0 \n\t" \
		:	"=r" (ret_val)
		:	"I" ((const int)swi_num), 
			"r" (par0), "r" (par1), "r" (par2), "r" (par3)
		:	"r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
	);

	return ret_val;
}
#endif


#endif






⌨️ 快捷键说明

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