arm上获取寄存器的值

本文介绍了一种在ARM架构下轻松获取寄存器值的方法,并提供了实用的宏定义来辅助内核及用户空间的调试工作。文章还讨论了编译时优化参数的选择。

http://blog.chinaunix.net/uid-20228521-id-1971079.html



 本来说在arm上获取寄存器的值是因为需要调试一个很古怪的问题,而在自己的机器上测试的386结构的代码似乎还不如arm上对register的访问自由。大致的想了想似乎arm上得到寄存器的值很简单的样子。所以之前才说可能在arm上会比较简单。结果今天上午一试还是当头一棒,毕竟还是对arm asm不太熟悉的结果,反而是磕磕碰碰的不太顺利,不过好歹还是搞清楚了。
    其间还一度对arm的设计产生的怀疑,不过最后看来看去还是发现arm asm的功能啊什么的还是很8错的,哈哈。

    自己做一个能够有易于使用的,能够在arm linux平台上在kernel和user space都可用的监视寄存器值的手段,就出了一个不算完善的东东,有些东西也是复习复习,也还没有测试完善,在kernel中使用的话可能还有些需要修改的东西吧。暂时收录起来:



    使用的时候可以把宏放到一个头文件里面就可以直接使用了。现在还有一点不爽的就是还需要一个特定数据类型的变量作为宏的参数传入,如果传入的数据类型长度小于所位于的平台的位数,就会产生“令人迷惑的结果”。所以使用的时候依赖于不同的平台了。对于arm,传入的参数的类型最好还是:unsigned long吧。如果定义成u32或者u64等等也行,只要和reg的长度相符合就可以了。

    同样,在编译的时候加上优化的参数:-O(默认的优化级别似乎就是2,当然禁止优化就用-O0了。哈哈)。
       1.如果是为了调试用的话,加上-g可能会有更好的效果。
       2.似乎-finline-functions也是不太令人欢迎的选项。

    嗯,大概就是这些吧,如果在kernel中使用的话,可以做成一个module,或者就是一个头文件就搞定,等下一阶段如果要调试kernel module的时候有用到再说了。

    收工看书去也。

### 如何在C语言中读取寄存器 为了实现对特定硬件寄存器的操作,通常会先利用预处理器指令`#define`创建一个宏定义来表示该寄存器的位置。例如: ```c #define UART_RHR (*(volatile unsigned char *)(UART_BASE_ADRS + 0)) /* 数据接收寄存器 */ ``` 此段代码声明了一个名为`UART_RHR`的常量,它指向的是基地址为`UART_BASE_ADRS`偏移量为零处的一个字节大小(`unsigned char`)的易失性存储单元[^1]。 当涉及到实际读取某个已知地址上的寄存器内容时,则可以通过解引用之前所定义好的指针表达式完成这一动作。对于上面提到的例子而言,若想获取数据接收寄存器中的当前数,只需简单地使用如下语句即可将其赋给本地变量以便后续处理: ```c unsigned char received_data; received_data = UART_RHR; // 从指定位置读取单个字符并保存到局部变量中 ``` 另外一种常见的方式是在嵌入式编程环境中直接针对具体的外设控制模块进行配置,比如ARM Cortex-M系列微控制器上常见的CCM(Clock Control Module)。这里给出一段用于初始化时钟门控寄存器`CCM_CCGR0`的具体实例: ```c #define CCM_CCGR0 (*((volatile unsigned int *)0X020C4068)) // 假定目标平台下该寄存器宽度为32位整数型 int main(){ ... printf("Current value of CCM_CCGR0 is %u\n", (unsigned int)(CCM_CCGR0)); } ``` 上述程序片段展示了怎样把位于固定内存区域内的寄存器映射至相应的C语言变量,并通过标准库函数输出其即时状态[^2]。 得注意的是,在某些情况下可能还需要考虑端口I/O特性以及编译优化选项的影响;此外,由于不同架构下的汇编指令集有所差异,因此编写跨平台兼容性强的应用软件时应当格外小心对待底层资源管理部分的设计与实现细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值