如何读取寄存器的值?用c/c++高级语言能够实现吗

lishi_1991 2012-12-25 12:17:50
想读取这两个寄存器的值 该怎么办呢 谢谢大家了
...全文
1506 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lr2131 2012-12-28
引用 7 楼 yc_first 的回复:
这个问题 和 从取CPSR中的值有区别么?
当然有区别,是CPU内部的寄存器,这个寄存器是没有地址的对于用户来说,你是不可能用C一级的代码直接得到它的值的,它不能像被外设寄存器或存储器一样被访问到,它不在你的寻址范围中,必须使用特定的汇编指令才能访问,而且对于CPSR,不同模式下的访问权限也不一样。
回复
lr2131 2012-12-27
应该是可以的,如果是类似于ARM的统一编址的话,访问内存和访问寄存器的汇编指令是一模一样的,在C/C++一级都是一样的写法。但如果是X86这种独立编址的话,访问内存和访问寄存器的汇编指令是不一样的,但不确定在C/C++一级也可以采用同一种写法,没有实际搞过不敢瞎说。 就统一编址的话说,访问寄存器和访问内存是一样的,你想想访问内存是怎么访问的,给出指针是吧,也就是地址是吧。查到寄存器的实际物理地址,例如定时器的控制寄存器T0TCR,地址为0x80001000,那么对应的定义 unsigned long *p = ((volatile unsigned long *) 0xE000401C); 那么读寄存器的话unsigned long ReadValue = *p; 写寄存器的话,unsigned long WriteValue = VALUE; *p = WriteValue ; 你也可以看一下相关CPU的寄存器地址头文件中的定义格式: #define T0TCR (*((volatile unsigned long *) 0xE0004004)) T0TCR只是个宏名而已。 你就理解这底层是怎么做的。 查一下VOLT的地址,同时注意位宽,因为ARM的是32的,所以寄存器一般也是32,所以用的是unsigend long。具体到实际的CPU要对应的改改。 例如VOLT的地址为 0xA0001200,CPU位宽为8BIT,具体的如果有问题,请自己试着改改,也就哪几种方式。 那么为方便使用,宏定义: #define VOLT (*((volatile unsigned char *) 0xA0001200)) 读寄存器 unsigned char ReadValue = VOLT ; 写寄存器 unsigned char WriteValue = 0x5A; VOLT = WriteValue ;或直接点: VOLT = 0x5A;
回复
yc_first 2012-12-27
这个问题 和 从取CPSR中的值有区别么?
回复
lr2131 2012-12-27
忘了,这里没有考虑MMU内存映射的问题,如果有MMU内存映射的话,你试着换算一下也是一样的。另外,如果资料、文档代码里面有提供的接口或现成的例子最好,仔细参考一下。
回复
lishi_1991 2012-12-26
各位大概明白你们的意思 找到寄存器地址 来读取数值!可是怎么读取数值呢 各位能贴个代码参考一下嘛!谢谢各位大牛了
回复
woshi_ziyu 2012-12-25
楼主使用的是哪个芯片 直接读取寄存器地址就可以了
回复
Binzo 2012-12-25
寄存器也是有IO的。有系统的,调用相应API;没有,引出相应IO(看电路图)直接读。
回复
風輕雲淡 2012-12-25
寄存器有地址的
回复
发动态
发帖子
硬件设计
创建于2007-09-28

5836

社区成员

硬件/嵌入开发 硬件设计
申请成为版主
社区公告
暂无公告