C 有人能解释一下exynos ARM中的电源控制寄存器吗?
在Linux内核中,更准确地说,在3.9-rc6上,这些行是C 有人能解释一下exynos ARM中的电源控制寄存器吗?,c,assembly,linux-kernel,arm,C,Assembly,Linux Kernel,Arm,在Linux内核中,更准确地说,在3.9-rc6上,这些行是 static unsigned int g_pwr_ctrl, g_diag_reg; static void save_cpu_arch_register(void) { /*read power control register*/ asm("mrc p15, 0, %0, c15, c0, 0" : "=r"(g_pwr_ctrl) : : "cc"); /*read diagnostic regist
static unsigned int g_pwr_ctrl, g_diag_reg;
static void save_cpu_arch_register(void)
{
/*read power control register*/
asm("mrc p15, 0, %0, c15, c0, 0" : "=r"(g_pwr_ctrl) : : "cc");
/*read diagnostic register*/
asm("mrc p15, 0, %0, c15, c0, 1" : "=r"(g_diag_reg) : : "cc");
return;
}
在研究了这个问题之后,这似乎是gcc内联汇编。考虑到它是一个关键组件,asm
将其视为
MCR
,但我可以看出MCR
是一个协处理器,因为它有三个字母的长度。内联asm似乎访问并将结果(从寄存器)保存到第一行的无符号整数中(我希望在某个时候调用)
关于电源控制寄存器,arm手册列出
- Cortex-A9处理器实现的时钟延迟
- 动态时钟门控
我还发现了一个-这也可能对你有帮助你的问题没有重点,请考虑更新。我假设您正在尝试理解Linux内核中的exynos挂起/恢复机制 为什么是内联汇编程序 。。。这似乎是gcc内联程序集。考虑到它是一个关键组件,asm将其解读为 a) 更快,因此效率更高
b) 在C语言中不可用 我们选择选项b,无法用C表示
mcr
/mrc
内联缓冲列表
第二<代码>:“抄送”)代码>
这是一个gcc
clobber列表。它说条件代码将被指令更改。这可能只是为了确保gcc
决定不放弃此指令。您可以在中阅读更多内容
这是干什么的
我很难理解为什么需要它,它可以在函数中动态访问
您需要查看的部分是exynos4\u enter\u core0\u aftr()
。这使用了保存cpu\u arch\u寄存器()
和恢复cpu\u arch\u寄存器()
。因此,有一组对偶函数,我们注意到这些值存储在全局函数中。另一件需要注意的事情是cpu\u suspend(0,空闲\u finisher)代码>。此函数告诉Linux,cpu被挂起,然后调用cpu\u do\u idle()代码>通常是ARM()指令。这会使CPU在该指令处冻结,直到触发已启用的中断。全速挂起CPU时钟的问题是,这可能会浪费一些电流/电源。通常,SDRAM和平台时钟在此模式下可能会自动置于低功耗状态
您必须查阅CPU/SOC上的数据表以了解更多信息。然而,回到问题上来。这种低功耗模式很可能会破坏/更改这些协处理器寄存器,因此需要save\u cpu\u arch\u register()
和restore\u cpu\u arch\u register()
来确保它们保持调用前的状态。代码可能会在exynos4\u enter\u core0\u aftr()
中使用局部变量。它们确实需要保存和恢复,否则CPU可能会以奇怪的电源/电压/时钟恢复。这也可能是因为cpu\u do\u idle()
对于您的机器来说已经过度使用,并且正在更改这些寄存器
简单地说,这个函数是为了保存当CPU进入<强>暂停>强>或等待中断模式时会被破坏的状态。
< P>你的问题没有重点,请考虑更新它。我假设您正在尝试理解Linux内核中的exynos挂起/恢复机制
为什么是内联汇编程序
。。。这似乎是gcc内联程序集。考虑到它是一个关键组件,asm将其解读为
a) 更快,因此效率更高
b) 在C语言中不可用
我们选择选项b,无法用C表示mcr
/mrc
内联缓冲列表
第二<代码>:“抄送”)代码>
这是一个gcc
clobber列表。它说条件代码将被指令更改。这可能只是为了确保gcc
决定不放弃此指令。您可以在中阅读更多内容
这是干什么的
我很难理解为什么需要它,它可以在函数中动态访问
您需要查看的部分是exynos4\u enter\u core0\u aftr()
。这使用了保存cpu\u arch\u寄存器()
和恢复cpu\u arch\u寄存器()
。因此,有一组对偶函数,我们注意到这些值存储在全局函数中。另一件需要注意的事情是cpu\u suspend(0,空闲\u finisher)代码>。此函数告诉Linux,cpu被挂起,然后调用cpu\u do\u idle()代码>通常是ARM()指令。这会使CPU在该指令处冻结,直到触发已启用的中断。全速挂起CPU时钟的问题是,这可能会浪费一些电流/电源。通常,SDRAM和平台时钟在此模式下可能会自动置于低功耗状态
您必须查阅CPU/SOC上的数据表以了解更多信息。然而,回到问题上来。这种低功耗模式很可能会破坏/更改这些协处理器寄存器,因此需要save\u cpu\u arch\u register()
和restore\u cpu\u arch\u register()
来确保它们保持调用前的状态。代码可能会在exynos4\u enter\u core0\u aftr()
中使用局部变量。这个