Cpufreq应用程序在arm开发板端的交叉编译及实现[转]

1.内核选项:

Linux 动态变频管理 cpufreq 提供了操作系统级别的变频功能,同时需要用户层来制定和执行策略。cpufreq后台进程cpufreqd 就是用来监测系统的运行状况,并根据不同的状况设定 CPU 的工作频率的。

要想在用户层使用后台进程cpufreqd,首先需要在配置linux内核编译选项时选择CPU Frequency scaling功能选项, 其内有一些子选项,包含governor的选择和是否Enable CPUfreq debugging。 cpufreq有五种governor(将在10.1.3中介绍),要使cpufreqd正常运行,至少需要选择performance governor;在测试阶段往往希望看到系统变频信息,那么需要Enable CPUfreq debugging。在Enable CPUfreq debugging的前提下,在u-boot的linux启动参数bootargs加上loglevel=8 cpufreq.debug=<value>,就可以看到cpufreq的相应级别的运行信息。 <value>的值可以是 1、2、4,也可以是它们的或(3、5、6、7),具体意义如下:

1 to activate CPUfreq core debugging,

2 to activate CPUfreq drivers debugging(这是和SEP4020相关的调试), and

4 to activate CPUfreq governor debugging

后台进程 cpufreqd 需要用到三个库,分别是cpufreqd-2.2.1、cpufrequtils-002和 sysfsutils-2.1.0,这三个库都是 GNU 免费开源软件,我们对 cpufreqd-2.2.1、cpufrequtils-002 进行了一些修改,由于编译这三个库还是蛮麻烦的,因此我在君正发布的cpufreqd的开发包上对arm平台进行二次编译,这样减少了不少工作(做事要站在巨人的肩膀上,呵呵)首先你可以君正的官方ftp上下载这个包。

下面将介绍cpufreqd 在arm上的交叉编译和安装过程以及在目标板上安装和运行方法。

2.交叉编译:

●编译 sysfsutils-2.1.0

进入sysfsutils-2.1.0目录:

执行:./configure –prefix=<你希望安装的目录> --host=arm-linux

Make

Make install

●编译 cpufrequtils-002

需要对Makefile 中的两个变量重新赋值:

sysfsuitls_install_dir = <sysfsuitls_install_dir>

DESTDIR = <cpufrequtils_destdir>

其中<sysfsuitls_install_dir>为上文所述 sysfsuitls 的安装路径,<cpufrequtils_destdir>为自定义的cpufrequtils库的安装路径的前缀,DESTDIR 可以为空,cpufrequtils 的安装路径为$(DESTDIR)/usr.

把CROSS一栏改成 = arm-linux-

执行下列命令开始编译和安装:

执行make && make install

make install的过程中会报错:

/usr/bin/install: cannot stat `.libs/libcpufreq.lai': No such file or directory

make: *** [install-lib] Error 1

解决方法是将 ./libs/libcpufreq.la 拷贝为./libs/libcpufreq.lai, 并将内部的 installed=no 改为 installed=yes,

然后再make install,这样就会在刚才你安装目录下生成一个usr目录,里面有一大堆东西。

● 编译 cpufreqd-2.2.1

使用configure-ingenic.sh 配置脚本对编译和安装过程进行配置,首先需要在该脚本中定义下面三个路径

变量:

cpufreqd_install_dir= #It's the directory where you want to install cpufreqd

cpufrequtils_destdir= #It's the same as the DESTDIR in Makefile of cpufrequtils-002

sysfsuitls_install_dir= #It's the directory where you installed sysfsutils

另外我们的运行脚本中是基于mips的处理器的,所以这里面要针对我们的arm平台做一些处理,也就是下面的config选项改成基于arm的:

./configure --prefix=$cpufreqd_install_dir --host=arm-linux /……

这里要注意的是它把arm的选项都disable了,但是我在给sep4020做低功耗的时候同时也实现了apm技术,所以这里要打开它。

然后运行该脚本:./configure-ingenic.sh

该脚本会生成 Makefile 和 config.h,需要修改生成的 config.h 中的路径,这些路径为 cpufreqd 在目标板上运行时所需要的相关文件的路径。默认路径的前缀为编译时所设的在主机上的安装路径,需要改为在目标板上的相应路径(以下所设路径仅供参考):

/* Define this to configuration dir location */

#define CPUFREQD_CONFDIR "/etc/"

/* Define this to plugins dir location */

#define CPUFREQD_LIBDIR "/lib

/* Define this to local state dir location */

#define CPUFREQD_STATEDIR "/var/"

执行:make &&make install即完成编译安装

3.开发板端的配置:

● 只需要安装 sysfsutils-2.1.0 和 cpufreqd-2.2.1。cpufrequtils-002 在交叉编译阶段已静态连接到cpufreqd-2.2.1。

a. 安装 sysfsutils-2.1.0.

将主机<sysfsuitls_install_dir>/lib/下的 libsysfs.so、libsysfs.so.2、libsysfs.so.2.0.1 三个文件拷贝到目标板的/lib/或/usr/lib/下。

b. 安装 cpufreqd-2.2.1.

主机 <cpufreqd_install_dir>/lib/ 下的 cpufreqd_cpu.so 、 cpufreqd_governor_parameters.so 、

cpufreqd_programs.so 三个文件拷贝到目标板上的CPUFREQD_LIBDIR(在 config.h 中定义)路径下;

将主机<cpufreqd_install_dir>/sbin/cpufreqd 拷贝到目标板的/sbin/或/usr/sbin/下;

将主机<cpufreqd_install_dir>/bin/下的cpufreqd-get 和cpufreqd-set拷贝到目标板的/bin/或/usr/bin/下;

将主机<cpufreqd_install_dir>/etc/cpufreqd.conf拷贝到目标板上的CPUFREQD_CONFDIR(在config.h中定义)路径下(即etc).

●在目标板上运行 cpufreqd

注意要保证开发板文件系统下存在/var/run文件夹,否则会运行不起来的。

运行cpufreqd即按照默认的conf文件进行运行,

如果想看到cpufreqd 的运行信息,那么可以加-V选项,共有 0到 7八个信息级别,0 的信息最少,7 的最多。比如要想打印出各个 Rule的得分,可以执行:

# cpufreqd –V 6

●目标开发板的配置

首先根据系统需要来修改cpufreqd 的配置文件cpufreqd.conf,该配置文件决定了 cpufreqd的行为。Cpufreqd 及内核中的cpufreq驱动是针对桌面电脑开发的,其中很多和桌面相关的接口比如 acpi、apm等我们没有用到(apm我暂时还没打开,在内核中针对4020已实现),下面针对我们使用到的功能来介绍 cpufreqd.conf 的写法。它的完整介绍可参看<cpufreqd_install_dir>/share/man/man5/cpufreqd.conf.5。

cpufreqd.conf 分三个部分:GeneralProfileRule

[General]

pidfile=/var/run/cpufreqd.pid //因为cpufreq是后台执行,kill的时候需要这个id号

poll_interval=2 //poll_interval(单位是秒,可以设为小数)是 cpufreqd 读取系统状态的时间间隔,每一次读取状态后,都会根据当前状态来给各个Rule 打分得分最高的Rule对应的 Profile将被执行,关于rule下面会详细谈

suspend_interval=10 //名为 Powersave Low 的 Profile 的执行时间长达 suspend_interval(单位是秒,应该设为整数)时,系统将自动进入睡眠状态

verbosity=0 //verbosity 指示 syslogd 后台进程记录 cpufreqd 进程的运行信息等级

#enable_remote=1 //如果想手动选择 cpufreqd 执行的 Profile, 需要在 cpufreqd.conf 的 General 栏中设置enable_remote=1.并在cpufreqd 命令后加上-m 选项,即可。这样就可以通过命令 cpufreqd-get 打印出 cpufreqd.conf 中所有可用的Profile,通过命令 cpufreqd-set n, 来选择执行第n 条profile.

[/General]

[Profile] 可以有多个profile

name=Performance High

minfreq=100% // minfreq 和 maxfreq定义了该 Profile 允许的频率范围,可以用绝对频率表示,单位默认是 KHz,比如 minfreq=42000 表示最低频率为 42MHz;也可以用内核允许的最高频率(由 u-boot的启动频率决定)的百分比表示

maxfreq=100%

policy=performance。 //performance 会让系统运行在指定频率范围[minfreq, maxfreq]内的最高频率,powersave 会让系统运行在[minfreq, maxfreq]内的最低频率

[/Profile]

[Profile]

name=Powersave Low

minfreq=42000

maxfreq=42000

policy=performance //即使是powersave我们使用的内核策略还是performance,其实这里也可以使用powersave,只要主频一样,那本质还是一样的

[/Profile]

每个 Rule的满分由自身条件的个数决定,有 n个条件的 Rule的满分是(100+n)%,比如上面所列的名为“CPU not busy”的Rule满分为 101%,名为“Movie Watcher”的Rule 满分为 102%。如果存在两个 Rule都为满分时,分数较高的Movie Watcher将被执行。如果两个Rule 得分相同,那么位置靠前的优先执行。

#full score=101%

[Rule] 可以有多个rule

name=CPU not busy // name是该 Rule的名字

cpu_interval=0-15 // cpu 的占有率范围, 比如cpu_interval=0-15表示 cpu 占用率为 0%~15%,

profile=Powersave Low

[/Rule]

#full score=102%

[Rule]

name=Movie Watcher

programs=mplayer,madplay // 表示当前运行的程序有 mplayer 或madplay

cpu_interval=0-100

profile=Performance High

[/Rule]

转载于:https://www.cnblogs.com/lishixian/articles/2866974.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值