Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1006688
  • 博文数量: 153
  • 博客积分: 4195
  • 博客等级: 上校
  • 技术积分: 2631
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-22 11:32
文章存档

2012年(7)

2010年(35)

2009年(111)

分类:

2009-11-12 20:19:04

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

Written by leeming

leeming.cublog.cn 转载请说明出处

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-bootlinux启动参数bootargs加上loglevel=8 cpufreq.debug=,就可以看到cpufreq的相应级别的运行信息。 的值可以是 124,也可以是它们的或(3567),具体意义如下:

1 to activate CPUfreq core debugging,

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

4 to activate CPUfreq governor debugging

 

后台进程 cpufreqd 需要用到三个库,分别是cpufreqd-2.2.1cpufrequtils-002 sysfsutils-2.1.0,这三个库都是 GNU 免费开源软件,我们对 cpufreqd-2.2.1cpufrequtils-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 =

DESTDIR =

其中为上文所述 sysfsuitls 的安装路径,为自定义的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.1cpufrequtils-002 在交叉编译阶段已静态连接到cpufreqd-2.2.1

a. 安装 sysfsutils-2.1.0

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

 

b. 安装 cpufreqd-2.2.1

主机 /lib/ 下的 cpufreqd_cpu.so cpufreqd_governor_parameters.so

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

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

将主机/bin/下的cpufreqd-get cpufreqd-set拷贝到目标板的/bin//usr/bin/下; 

将主机/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驱动是针对桌面电脑开发的,其中很多和桌面相关的接口比如 acpiapm等我们没有用到(apm我暂时还没打开,在内核中针对4020已实现),下面针对我们使用到的功能来介绍 cpufreqd.conf 的写法。它的完整介绍可参看/share/man/man5/cpufreqd.conf.5

cpufreqd.conf 分三个部分:GeneralProfile Rule

 

[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]

阅读(2076) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~