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

📄 cpu.c

📁 os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm
💻 C
字号:
/* *	ApOS (Another Project software for s3c2410) *	 *	This program is free software; you can redistribute it and/or modify *	it under the terms of the GNU General Public License version 2 as *	published by the Free Software Foundation. *			 *						Copyright caiyuqing * */#include "../include/s3c2410/s3c2410.h"#include "../include/s3c2410/cpu.h"/* *	读控制寄存器 */unsigned int read_control_register(){	unsigned int reg;		asm volatile(		"mrc p15,0,r0,c1,c0,0 \n\t"		"str r0,%0 \n\t"		:		:"m"(reg)		:"r0"	);		reg&=~(0x7FFF)<<15;	reg&=~(0x3)<<10;	reg|=0xf<<3;	return reg;}/* *	写控制寄存器 */void write_control_register(unsigned int value){	asm volatile(		"ldr r0,%0 \n\t"		"mcr p15,0,r0,c1,c0,0 \n\t"		:		:"m"(value)		:"r0"	);}void set_ctrl_bit(unsigned int* reg_data,unsigned char offset,unsigned char bit){	*reg_data&=~(0x1)<<offset;	*reg_data|=bit<<offset;}/* *	读 cpsr 寄存器 */unsigned int read_cpsr(){	unsigned int reg;		asm volatile(		"mrs r1,cpsr \n\t"		"str r1,%0 \n\t"		:		:"m"(reg)		:"memory","r1"	);	return reg;}/* *	写 cpsr 寄存器 */void write_cpsr(unsigned int reg){	asm volatile(		"ldr r1,%0 \n\t"		"msr cpsr,r1 \n\t"		:		:"m"(reg)		:"r1"	);}/* *	读 spsr 寄存器 */unsigned int read_spsr(){	unsigned int reg;		asm volatile(		"mrs r1,spsr \n\t"		"str r1,%0 \n\t"		:		:"m"(reg)		:"memory","r1"	);	return reg;}/* *	写 spsr 寄存器 */unsigned int write_spsr(unsigned int reg){	asm volatile(		"ldr r1,%0 \n\t"		"msr spsr,r1 \n\t"		:		:"m"(reg)		:"memory","r1"	);}/* *	切换cpu模式 */void switch_cpu_mode(unsigned char mode){	unsigned int reg;		reg=read_cpsr();	reg&=~(0x1f);	reg|=mode;	write_cpsr(reg);}/* *	读data fault status register */unsigned int read_data_fsr(){	unsigned int reg;	asm volatile(		"mrc p15,0,r0,c5,c0,0 \n\t"		"str r0,%0 \n\t"		:		:"m"(reg)		:"r0"	);	return reg;}/* *	写data fault status register */void write_data_fsr(unsigned int reg){	asm volatile(		"ldr r0,%0 \n\t"		"mcr p15,0,r0,c5,c0,0 \n\t"		:		:"mem"(reg)		:"r0"	);}/* *	读prefetch fault status register */unsigned int read_prefetch_fsr(){	unsigned int reg;	asm volatile(		"mrc p15,0,r0,c5,c0,1 \n\t"		"str r0,%0 \n\t"		:		:"mem"(reg)		:"r0"	);	return reg;}/* *	写prefetch fault status register */void write_prefetch_fsr(unsigned int reg){	asm volatile(		"ldr r0,%0 \n\t"		"mcr p15,0,r0,c5,c0,1 \n\t"		:		:"mem"(reg)		:"r0"	);}/* *	读取 fault address register */unsigned int read_far(){	unsigned int reg;	asm volatile(		"mrc p15,0,r0,c6,c0,0 \n\t"		"str r0,%0 \n\t"		:		:"mem"(reg)		:"r0"	);	return reg;}/* *	写fault address register */void write_far(unsigned int reg){	asm volatile(		"ldr r0,%0 \n\t"		"mcr p15,0,r0,c6,c0,0 \n\t"		:		:"mem"(reg)		:"r0"	);}/* *	使I TLB和 D TLB无效 */void invalidate_TLBs(){	asm volatile(		"ldr r0,=0x00000000 \n\t"		"mcr p15,0,r0,c8,c7,0 \n\t"		:		:		:"r0"	);	}/* *	使 D TLB无效 */void invalidate_DTLB(){	asm volatile(		"ldr r0,=0x00000000 \n\t"		"mcr p15,0,r0,c8,c6,0 \n\t"		:		:		:"r0"	);	}/* *	使 I TLB无效 */void invalidate_ITLB(){	asm volatile(		"ldr r0,=0x00000000 \n\t"		"mcr p15,0,r0,c8,c5,0 \n\t"		:		:		:"r0"	);	}/* *	使 DCache无效 */void invalidate_DCache(){	asm volatile(		"ldr r0,=0x00000000 \n\t"		"MCR p15,0,r0,c7,c6,0 \n\t"		:		:		:"r0"	);	}unsigned int get_process_id(){	unsigned int reg;	asm volatile(		"mrc p15,0,r0,c13,c0,0 \n\t" //read process identifier		"str r0,%0 \n\t"		:		:"mem"(reg)		:"r0"	);	return (reg>>25);	}void set_process_id(unsigned int reg){	unsigned int tmp=reg<<25;	asm volatile(		"ldr r0,%0 \n\t"		"mcr p15,0,r0,c13,c0,0 \n\t" //write process identifier		:		:"mem"(tmp)		:"r0"	);	}

⌨️ 快捷键说明

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