dvfs 解析

本文介绍了DVFS(动态电压频率调节)的基本概念,详细解析了相关代码结构,包括数据结构、函数接口和初始化过程,并提供了调试注意事项及心得。
摘要由CSDN通过智能技术生成

一、基本概念

DVFS(Dynamic Voltage and Frequency Scaling)动态电压频率调节,是一种实时的电压和频率调节技术。在 CMOS 电路中功率消耗主要可以分为动态功率消耗静态功率消耗,公式如下:

    

其中 C 代表负载电容的容值,V工作电压α 是当前频率下的翻转率f工作频率I_dq 代表静态电流。公式的前部分代表的是动态功率消耗,后部分则代表的是静态功率消耗。从公式中可以看出,想要降低动态功率消耗可以从C、V、α、f着手,对于软件来讲常用的调节方式只涉及到V、f 两个因素。


二、代码解析

1、数据结构

系统中存在 7 大总线:ARM_CLK、AXI_CLK、DSP_CLK、APP_CLK、MPH_CLK、GE_CLK、VS_CLK,DVFS 系统的所有工作都围绕这几大总线以及核心电压CORE_VOLTAGE展开,代码里面用到的数据结构有:DVFS_REQ、DVFS_CMD、DVFS_NODE、DVFS_CDB,定义如下:

typedef struct {
	const char*   module;   /* 发出调节请求的模块名称 */
	unsigned char flag;     /* 调节频率的标记: 有最低、最高、锁定三种 */
	DVFS_CLK_e    clk;      /* 申请调节的时钟总线,有7大总线 */
	int           freq;     /* 期望频率值 */
} DVFS_REQ;

typedef struct {
	DVFS_CBF    cb;     /* 回调函数 */
	int         arg;    /* 参数 */
	int         num;    /* 本次请求的数目 */
	DVFS_REQ    reqs[MAX_REQ_NUM];   /* 请求存放的数组,最多8个请求 */
} DVFS_CMD;

typedef struct {
	struct list_head head;  /* 链表节点 */
	DVFS_REQ         req;   /* 当前请求 */
} DVFS_NODE;

typedef struct {
	// cmd queue managment
	DVFS_CMD    q_array[CMD_Q_LENGTH];
	uint8_t     q_idx_r;
	uint8_t     q_idx_w;
	uint8_t     q_idx_p;
	spinlock_t  q_lock;

	// worker thread management
	wait_queue_head_t q_wait;  /* 等待队列 */
	struct task_struct* task;  /* 任务 */

	// list of request for each clock
	DVFS_NODE*  req_lists[DVFS_CLK_ALL];       /* 指向每条总线的请求链表 */

	// clock/voltage setttings
	int         curr_freq_idx[DVFS_CLK_ALL];   /* 当前频率的索引值 */
	int         trgt_freq_idx[DVFS_CLK_ALL];   /* 目标频率的索引值 */
	struct clk* hw_clock[DVFS_CLK_ALL];        /* 时钟设置 */
	
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值