Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有人能解释一下exynos ARM中的电源控制寄存器吗?_C_Assembly_Linux Kernel_Arm - Fatal编程技术网

C 有人能解释一下exynos ARM中的电源控制寄存器吗?

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

在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 register*/
    asm("mrc p15, 0, %0, c15, c0, 1" : "=r"(g_diag_reg) : : "cc");
    return;
}
在研究了这个问题之后,这似乎是gcc内联汇编。考虑到它是一个关键组件,
asm
将其视为

  • 更快,因此效率更高
  • 在C语言中不可用
  • 在学习汇编时,我检查了
    MCR
    ,但我可以看出
    MCR
    是一个协处理器,因为它有三个字母的长度。内联asm似乎访问并将结果(从寄存器)保存到第一行的无符号整数中(我希望在某个时候调用)

    关于电源控制寄存器,arm手册列出

    • Cortex-A9处理器实现的时钟延迟
    • 动态时钟门控
    我很难理解为什么需要它,它可以在函数中动态访问

    最后,ARM手册列出了32位宽寄存器的设计。基本时钟似乎设置在那里,我们是在从空闲上下文进程启动时读取它的吗


    我还发现了一个-这也可能对你有帮助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()
    中使用局部变量。这个