IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 实现自己的thermal框架 -> 正文阅读

[数据结构与算法]实现自己的thermal框架

? ? ? ?

目录

1、首先创建自己的目录和文件

2、实现自己的zone_device驱动?

2.1 结构体

2.2 要实现的函数

3、实现自己的cooling_device驱动

3.1 结构体

3.2 要实现的函数

4、实现自己的step_wise功能

4.1 结构体

4.2 流程图

4.3 算法实现

5、实现自己的thermal_core功能


? ? ? 学习分析了kernel的thermal后,我们基本了解了thermal框架的基本工作机制,那么在实际的场景中,不同的平台或者OS中可能各有差异,完全可以采用类似的思想,实现一套更加简洁的机制来做定制化实现,同时也避免了开源的风险,步骤如下.

1、首先创建自己的目录和文件

分别为core文件、governor文件、sensor文件、clooling文件

2、实现自己的zone_device驱动?

? ? ? 样例我们以thermal_sensor.c为例,这个里边是sensor的驱动,负责CPU温度数据的获取。

2.1 结构体

Struct zone_device_ops_s {

Int (*get_temperature)(void); //获取当前的温度

Int (*get_temp_state)(void);//根据温度获取当前的状态(cold/normal/hot/critical)

Int (*get_trend)(void);//获取温度趋势

Void (*monitor_func)(void *data); //监控任务

void (*critical)(struct zone_device_s *); //当系统温度异常情况时,采取的措施

};

Enum {

?? THERMAL_TREND_RAISING,

?? THERMAL_TREND_DROPPING,

THERMAL_TREND_STABLE

};

Struct zone_device_s {

???????? ? Char* zdev_name;

?????? Char* governor_name;// zone_device匹配对应的governor

?????? Struct zone_device_ops_s *ops; //记录ops

List_head cooling_device_list_head;//记录可以给该device进行温度控制的cooling device

List_head governor_list_head;//记录对应的governor

List_head list;

Volatile int monitor_time_ms; //任务中监控温度时间间隔,以ms为单位

Int last_temperature;

Int trend;

};

Struct zone_device_s g_sensor_zone_device;

2.2 要实现的函数

Static Int get_sensor_cur_temperature(void) { 返回当前温度}

Static int get_sensor_ cure_state(void) {根据当前温度,匹配到对应的state,并返回}

Static Struct zone_device_ops_s sensor_ops = {‘

?????????? . get_temperture = get_sensor_cur_temperature;

??? . get_temp_state = get_sensor_ cure_state;

};

Static int sensor_init(void ) {

??? Zone_device注册到thermal core中;

初始化g_sensor_zone_device;

g_sensor_zone_device.ops = &sensor_ops;

}

3、实现自己的cooling_device驱动

3.1 结构体

#define MAX_STATE 5

Struct freq_voltage_map {

Int freq;

Int v;

};

Struct cooling_device_ops_s {

???? Int (*set_state)(int state); //设置目标档位的索引

???? Int (*get_state)(void);//获取当前档位

???? Int (*get_max_state); //获取支持的最大档位

};

Struct cooling_device_s {

???????? ? Char* cdev_name;

?????? Struct cooling_device_ops_s *ops; //记录ops

List_head list;

Int cur_state;

Int max_state;

Struct freq_voltage_map table[MAX_STATE]; //假设有MAX_STATE个档位,样例中MAX_STATE为5

};

Struct cooling_device_s g_cooling_device;

3.2 要实现的函数

Static int get_freq_of_state(int state) {

???? Return g_cooling_device. voltage_map[state].freq;

}

Static int cooling_device_get_state(void) {return g_cooling_device. cur_state ;}

Static int cooling_device_set_state(int state) {

?????? 和当前state比,相等则返回成功;

??????? Freq = get_freq_of_state(state);

?????? ?不相等,则设置成对应的频率和电压,调用调频接口。

}

Static int cooling_device_get_max_state(void){

??? g_cooling_device.max_state = MAX_STATE – 1;

}

Static Struct cooling_device_ops_s ops = {

.set_state = cooling_device_get_state;

. get_state = cooling_device_set_state;

. get_max_state = cooling_device_get_max_state;

};

Static ?int cooling_device_init(){

????? g_cooling_device. voltage_map[1…. MAX_STATE]赋值初始化;

??????? g_cooling_device.ops = & ops;

??????? thermal_cooling_register(&g_cooling_device);

}

4、实现自己的step_wise功能

4.1 结构体

Strcut thermal_governor_s{

?? Int (*throttle)( zone_device_s *tz, int trip);

char name[THERMAL_NAME_LENGTH];

struct list_head?? governor_list;

}

Kernel的实现肯定是相对较好的,但是针对各自的平台,完全可以做一些简化的实现,同时也避免了完全参考kernel的实现带来开源的风险。

4.2 流程图

?

4.3 算法实现

Static int step_wise_throttle(Struct zone_device_s *tz) {

???? ?如流程图;

}

Strcut thermal_governor_s thermal_gov_step_wise = {

.name???????????? = "step_wise",

.throttle?? = step_wise_throttle,

};

Static int step_wise_init(void) {

??? Thermal_governor_register(&thermal_gov_step_wise);

}

5、实现自己的thermal_core功能

Int thermal_cooling_register(Struct cooling_device_s *cdev)

{

???? Cdev加入到zdev的链表中,以便zdev在需要温控时调用对应函数。

}

Int thermal_cooling_unregister(Struct cooling_device_s *cdev)

{

???? Cdev从zdev的cooling device链表中删除。

}

Static Void temperature_update_func(Struct zone_device_s *zdev) {

??????? 获取当前温度;

???? 计算温度趋势;

???? 获取当前zdev的温度状态;

???? 判断需要回调governor还是调用critical。

}

Static Void temperature_critical(Struct zone_device_s *zdev) {

??????? 复位系统。

}

Int thermal_zone_device_register(Struct zone_device_s *zdev)

{

1、创建对应温度采集任务。

2、g_sensor_zone_device.ops.critical = temperature_critical;

……

}

Int thermal_zone_device_unregister(Struct zone_device_s *zdev) {

??????? ?thermal_zone_device_register的逆操作

}

Int thermal_governor_register(Struct thermal_governor *gov)

{

绑定到zdev的governor链表上。

……

}

Int thermal_ governor_unregister(Struct thermal_governor *gov) {

??????? ?thermal_governor_register的逆操作

}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:36:03  更:2022-04-04 12:39:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:51:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码