bjlny 发表于 2012-12-9 12:05:47

linux下如何指定函数从DDR跳转到指定内存(SRAM)中运行?

各位好:
我现在在做低功耗相关,如果要让系统处于低功耗状态,除了要关闭液晶等外设,还要将ARM处于低功耗,DDR处于自刷新,但是在DDR自刷新之前,程序必须运行在DDR之外,因为按照厂家的说法,这时DDR就已经不能运行程序了(我的理解是DDR自刷新情况下可以执行,但是只要执行程序那么就不会进入自刷新,也就不能休眠DDR,所以要换地方让CPU取指)。目前计划是在DDR自刷新之前将程序运行在内部32K的SRAM上,这样在DDR自刷新之后还可以继续执行将ARM休眠之类的操作。这样问题就来了:如何让一个程序在指定地址运行?
目前常规的有几种办法:1.函数指针跳转2.编写汇编指令
1.函数指针跳转时,我如何编写一个函数,指定他的运行地址是在我要的片内SRAM上,即0地址开始的32K空间内?
2.如果是采用C嵌套汇编,那么如何指定运行地址?在linux环境下是否采用lds文件指定运行地址?那么如果可以用Lds文件指定,那么在执行这段函数之前是否还要进行搬运?如何搬运?
请各位讨论下,如果能贴出来代码,那么更好,这是个很实际的问题,也很考验对程序执行的理解。

NJ8888 发表于 2012-12-9 12:14:06

我看着需要资深专家来说,-----------------------------------------正在入门者路过

dashashi 发表于 2012-12-9 16:37:43

留名,等高手解答- -

netawater 发表于 2012-12-9 16:51:26

首先需要程序存在指定地址,这里有两个办法,A:是编译器指定好了,下载程序后它就在那个位置了。B:是运行时将程序代码(原位置也是由编译器指定的)拷贝到该地址。就你现在描述,估计你要用第二种方式了。

至于跳转过去很容易了,一个JMP指令搞定!

bjlny 发表于 2012-12-9 22:35:26

netawater 发表于 2012-12-9 16:51 static/image/common/back.gif
首先需要程序存在指定地址,这里有两个办法,A:是编译器指定好了,下载程序后它就在那个位置了。B:是运行 ...

是的,要用函数拷贝,现在已经有思路了,谢谢

dr2001 发表于 2012-12-10 08:31:43

bjlny 发表于 2012-12-9 22:35 static/image/common/back.gif
是的,要用函数拷贝,现在已经有思路了,谢谢

没深入研究过Linux内核,但是这个问题里最麻烦的地方是:拿到一片物理地址是SRAM的存储区域,并且具备读/写/运行权限,(因为Linux的MMU。。。);并且让你的代码运行在特权状态(任何非USR状态),否则寄存器操作可能因为特权级挂掉。
之后就好办了,单独编译一个位置无关的程序,复制代码并执行即可。

不过,话说一般DRAM控制器可能会有低功耗模式,如果多少个周期没有DRAM访问,DRAM就会自刷新。这种情况下,降总线频率并且ARM WFI就差不多了。直接Hack内核潜在问题可能挺多。

mangocity 发表于 2012-12-10 09:28:48

进入SLEEP模式的过程不需要用户程序参与的。
要进入ARM的各种POWER模式,如果用三星的ARM的话是通过WFI指令进入。
当执行这个指令的时候,CPU会等待当前总线周期完毕,并且自动将DRAMC进入自刷新模式,然后CLOCK GATING整个CPU就完全停止下来了。某些模式下会有power gating。

所以完全不明白你的意思啊。
页: [1]
查看完整版本: linux下如何指定函数从DDR跳转到指定内存(SRAM)中运行?