ARM/CM3/CM4:读写内核寄存器和内核特殊寄存器

        方式1:内联汇编,所以跟C编译器有关,有些编译器可能会不支持(每种编译器内联汇编的形式都不一样),本代码在MDK的“defaul compiler version 6”编译器里测试通过。

uint32_t core_res_c;

void set_core_res(uint32_t value)    //设置内核寄存器
{
	core_res_c=value;
	__ASM("ldr r0,=core_res_c");
	__ASM("ldr sp,[r0]");
}

void set_special_res(uint32_t value)    //设置内核特殊寄存器(PSR/CONTROL)
{
	core_res_c=value;
	__ASM("ldr r0,=core_res_c");
	__ASM("ldr r1,[r0]");
	__ASM("msr control,r1");
}

uint32_t read_core_res(void)        //读内核寄存器
{
	__ASM("ldr r0,=core_res_c");
	__ASM("str sp,[r0]");
	
	return core_res_c;
}

uint32_t read_special_res(void)    //读内核特殊寄存器
{
	__ASM("ldr r0,=core_res_c");
	__ASM("mrs r1,control");
	__ASM("str r1,[r0]");
	
	return core_res_c;
}

        可以发现每一个函数都用到了“ldr r0,=core_res_c”这句话,这句话可以非常神奇的将core_res_c全局变量的地址传递给内核寄存器,就相当于建立了一个C和汇编直接数据传输的通道,我们就可以借助这个通道对内核寄存器进行读写了,当然这个通道的存在是借助于编译器的,所以文章第一句话就声明了和编译器的瓜葛。

        读写内核寄存器和内核特殊寄存器分属不同的函数,主要是由于内核特殊寄存器的读写要借助于专有的MRS和MSR指令。

        方式2:下面介绍一种使用纯汇编方式读写内核寄存器的方式,不再受到编译器的限制,移植性大大提高

先写4个汇编函数:

set_coreres		PROC
				EXPORT set_coreres
				PUSH {R0,LR}
				MOV SP,R0
				POP {R0,PC}
				ENDP

set_specialres	PROC
				EXPORT set_specialres
				PUSH {R0,LR}
				MSR CONTROL,R0
				POP {R0,PC}
				ENDP
					
read_coreres	PROC
				EXPORT read_coreres
				PUSH {R0,LR}
				STR SP,[R0]
				POP {R0,PC}
				ENDP
					
read_specialres	PROC
				EXPORT read_specialres
				PUSH {R0,R1,LR}
				MRS R1,PSR
				STR R1,[R0]
				POP {R0,R1,PC}
				ENDP

再在C当中extern:

extern void set_coreres(int resvl);
extern void set_specialres(int resvl);
extern void read_coreres(int *resvl);
extern void read_specialres(int *resvl);

最后再正常调用就行了~

相关推荐

  1. ARM/CM3/CM4内核寄存器内核特殊寄存器

    2024-01-30 09:34:02       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-30 09:34:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-30 09:34:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-30 09:34:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-30 09:34:02       18 阅读

热门阅读

  1. 第二百九十四回

    2024-01-30 09:34:02       28 阅读
  2. 仓库管理系统WMS设计思路

    2024-01-30 09:34:02       35 阅读
  3. 【从浅到深的算法技巧】初级排序算法 下

    2024-01-30 09:34:02       27 阅读
  4. flutter制作APP的学习

    2024-01-30 09:34:02       37 阅读
  5. ES6 Reflect详解

    2024-01-30 09:34:02       30 阅读