| |
|
开发:
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框架 |
? ? ? ? 目录 ? ? ? 学习分析了kernel的thermal后,我们基本了解了thermal框架的基本工作机制,那么在实际的场景中,不同的平台或者OS中可能各有差异,完全可以采用类似的思想,实现一套更加简洁的机制来做定制化实现,同时也避免了开源的风险,步骤如下. 1、首先创建自己的目录和文件分别为core文件、governor文件、sensor文件、clooling文件 2、实现自己的zone_device驱动?? ? ? 样例我们以thermal_sensor.c为例,这个里边是sensor的驱动,负责CPU温度数据的获取。 2.1 结构体
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 结构体
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的逆操作 } |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |