方式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);
最后再正常调用就行了~
猜你喜欢
网友评论
- 搜索
- 最新文章
- 热门文章