海思HI35xx平台CPU温度监测
前言
随着芯片的集成度提高,芯片内部的晶体管数量也不断增多,产生的热量也难以通过小小芯片封装散发出去(常用封装材料有塑料、陶瓷、玻璃、金属,CPU一般采用金属材料封装),高温是会对芯片的性能产生极其有害影响的。研究表明,芯片温度每升高1℃其运行可靠性降低3.8%,而芯片温度每下降10%其寿命增加50%,而在电子设备失效统计中也有超过50%是由于过热导致的。大数据后起之秀贵州,就凭借着优越的温和气候条件吸引了众多科技公司在那部署数据中心,这也充分表明散热对设备的稳定运行的影响。
CPU芯片温度的检测模块给产品设计散热提供了可能,在多变的产品应用场景中,需要提供智能散热设计,在节能的同时又能够提升产品工作的稳定性。以常规的风冷散热为例,通过检测CPU工作的温度,来获取产品工作的热环境,并配套以PWM风冷风扇转速调节,以保证产品工作在比较良好的热环境中。海思HI35xx平台系列的CPU也提供相应的温度检测模块,安防监控领域中有不少设备是暴露在户外的工作环境,这对散热设计提供了更苛刻的要求,基于CPU内部自带温度监测单元可以减少不必要的温度传感器外设设计,既能节约成本,又大大方便了开发设计的过程。
芯片内部温度检测单元
海思CPU芯片内部集成了温度传感器,温度的检测范围为-40~125℃,支持设置温度上下限阈值报警输出。作为芯片工作的热环境晴雨表,内部温度传感器提供了单次采集模式和循环采集模式两种选择,其中循环采集模式需要用户设定采集周期,它由一个8位的寄存器配置,采集周期设置范围为2ms~512ms。此外,该单元还提供了8个温度数据寄存器,用于记录最近8次采集到的温度值,可以方便了解温度变化的趋势,在实际应用中可以利用此温度变化梯度进行温度PID调节。
海思CPU温度采集单元软件开发分为驱动程序部分和用户态软件开发,其中驱动程序部分主要是与硬件交互,实现底层数据采集转换工作,而用户态则主要是程序应用逻辑控制设计。用户态程序设计流程如下:
1.设置温度采集模式
2.设置温度采集周期
3.设置温度报警上限阈值
4.设置温度报警下线阈值
5.使能启动温度采集
6.读取CPU温度值
7.读取温度报警上限标志
8.读取温度报警下限标志
应用实例源码
/************************************************************************************************
*****Describe: This program is writen to get HI35xx CPU Chip Temperature. *****
*****Email: lishuangliang@outlook.com *****
*****Author: shuang liang li *****
*****Date: 2018-10-18 *****
*************************************************************************************************/#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/reboot.h>
#include <sys/ioctl.h>
#include <signal.h>
#include "Hi_Tsensor.h"#ifdef debugprintf#define debugpri(mesg, args...) fprintf(stderr, "[HI Serial print:%s:%d:] " mesg "\n", __FILE__, __LINE__, ##args)
#else#define debugpri(mesg, args...)
#endif#define HITSENSORDEV "/dev/hi_tsensor"
int hifd;void Hi_Tsensor_sigsegv(int dummy)
{if(hifd > 0)close(hifd);fprintf(stderr, "Hi Tsensor Caught SIGSEGV, Abort!\n");fclose(stderr);abort();
}void Hi_Tsensor_sigterm(int dummy)
{if(hifd > 0)close(hifd);fprintf(stderr, "Hi Tsensor Caught SIGTERM, Abort!\n");fclose(stderr);exit(0);
}void Hi_init_signals(void)
{struct sigaction sa;sa.sa_flags = 0;sigemptyset(&sa.sa_mask);sigaddset(&sa.sa_mask, SIGSEGV);sigaddset(&sa.sa_mask, SIGTERM);sigaddset(&sa.sa_mask, SIGPIPE);sa.sa_handler = Hi_Tsensor_sigsegv;sigaction(SIGSEGV, &sa, NULL);sa.sa_handler = Hi_Tsensor_sigterm;sigaction(SIGTERM, &sa, NULL);sa.sa_handler = SIG_IGN;sigaction(SIGPIPE, &sa, NULL);
}int GetCurTemperature(int fd, float *tempera)
{float tmp;Hi_Tsensor_info hitsensor;//读取当前CPU温度值memset(&hitsensor,0,sizeof(Hi_Tsensor_info)); if(ioctl(fd, GET_TEMPER, &hitsensor) != 0){debugpri("GET_TEMPER,value %d,error\r\n",hitsensor.value);return -1;}debugpri("tmp %04x\n",hitsensor.value );tmp = ((hitsensor.value - 125)/806.0)*165-40;*tempera = tmp;printf("Hisi CPU current Temperature: %3.2f degree\n",tmp);//读取温度上限报警memset(&hitsensor,0,sizeof(Hi_Tsensor_info)); if(ioctl(fd, GET_OVERUP, &hitsensor) != 0){debugpri("GET_OVERUP,value %d,error\r\n",hitsensor.value);return -1;}if(hitsensor.value)printf("Hisi CPU current Temperature OVERUP\n");//读取温度下限报警memset(&hitsensor,0,sizeof(Hi_Tsensor_info)); if(ioctl(fd, GET_OVERDN, &hitsensor) != 0){debugpri("GET_OVERDN,value %d,error\r\n",hitsensor.value);return -1;}if(hitsensor.value)printf("Hisi CPU current Temperature OVERDOWN\n");return 0;
}int main(int argc, char **argv)
{int ret = 0, i;float temperature;Hi_Tsensor_info hitsensor;Hi_init_signals();hifd = open(HITSENSORDEV,O_RDWR);if(hifd <= 0){ printf("open %s error\n",HITSENSORDEV);return -1;} //设置采集模式为循环采集memset(&hitsensor,0,sizeof(Hi_Tsensor_info));hitsensor.value = 1;if(ioctl(hifd, SET_MODE, &hitsensor) != 0){debugpri("SET_MODE,value %d,error\r\n",hitsensor.value);return -1;}//设置采集周期为16msmemset(&hitsensor,0,sizeof(Hi_Tsensor_info));hitsensor.value = 16;if(ioctl(hifd, SET_PERIOD, &hitsensor) != 0){debugpri("SET_PERIOD,value %d,error\r\n",hitsensor.value);return -1;}//设置温度报警上限阈值为85摄氏度memset(&hitsensor,0,sizeof(Hi_Tsensor_info));hitsensor.value = 85;hitsensor.value = (int)(((hitsensor.value+40)/165.0)*806+125);//温度值转换if(ioctl(hifd, SET_OVERUP, &hitsensor) != 0){debugpri("SET_OVERUP,value %d,error\r\n",hitsensor.value);return -1;}//设置温度报警下限阈值为5摄氏度memset(&hitsensor,0,sizeof(Hi_Tsensor_info));hitsensor.value = 5;hitsensor.value = (int)(((hitsensor.value+40)/165.0)*806+125);//温度值转换if(ioctl(hifd, SET_OVERDN, &hitsensor) != 0){debugpri("SET_OVERDN,value %d,error\r\n",hitsensor.value);return -1;}//启动温度采集memset(&hitsensor,0,sizeof(Hi_Tsensor_info));hitsensor.value = 1;if(ioctl(hifd, SET_START, &hitsensor) != 0){debugpri("SET_START,value %d,error\r\n",hitsensor.value);return -1;}while(1){GetCurTemperature(hifd,&temperature); sleep(1);system("clear");printf("HiTsensor device detecting...\n");} if(hifd > 0)close(hifd);return 0;
}
样例运行效果图:
总结
海思芯片内部温度检测单元给我们提供了一个窗口了解芯片运行的热环境,方便进行散热设计,提高产品运行的稳定性。驱动源码与应用样例源码已经由云托管,点此下载。原创不易,转载说明出处。
海思HI35xx平台CPU温度监测相关推荐
- 海思HI35xx平台软件开发快速入门之H264解码实例
前言 H264视频编码技术诞生于2003年,至今已有十余载,技术相当成熟,它的优势在于有高的视频的压缩率,利用帧间和帧内预测(Estimation).变换(Transform)和反变换.量化(Quan ...
- 海思HI35xx平台软件开发快速入门之背景知识
前言: 安防领域最近几年可谓暗流涌动,作为安防业的双寡头,大华股份与海康威视凭借行业的东风,两家公司的成长速度异常强劲,在国际市场上已经和应用厂家进行厮杀. 2015年两家公司双双晋升"全球 ...
- 海思HI35xx平台软件开发快速入门之视频分辨率
前言 在海思HI35xx平台软件开发过程中常常遇到一些音视频相关的专业知识,为了能够灵活应对这些问题,我们必须对相关知识有所理解.这里结合海思HIMMP媒体处理系统相关应用对视频分辨率知识进行梳理,以 ...
- 海思HI35xx语音识别方案
前言 语音识别是智能化应用的一个重要分支,也是语音交互功能的基础.语音识别基于神经网络算法,借助大数据进行模型训练,据科大讯飞相关数据报道,它们已经能够实现98%以上的准确识别率,同时支持多种外语及国 ...
- 《海思Hi35xx开发日记——之No.1》
前言:由于公司的战略转变,我也由原来的Android开发转向到海思HI35xx平台的开发.海思Hi35xx是一个专门提供媒体处理的平台架构,它提供的音视频软件HIMPP API使得下游厂商能够快速开发 ...
- 海思Hi3559A平台移植 opencv4.0.0
原文:https://blog.csdn.net/xclshwd/article/details/85257117 海思Hi3559A平台移植 opencv4.0.0 2018年12月26日 09:5 ...
- 海思3559A平台4GB LPDDR配置方案
注: 还有一篇关于 [海思3559av100平台 8GB LPDDR4内存适配 & 分配] https://blog.csdn.net/jzwjzw19900922/article/detai ...
- 海思系列平台编译器安装及配置
海思系列平台编译器安装及配置 针对平台:hisi3559A / hisi3516DV300 / hisi3519A / hisi3531 / hisi3516AD / hisi3516CV300 / ...
- mac如何启用cpu虚拟化_Turbo Boost Switcher Pro for mac(cpu温度监测工具)
Turbo Boost Switcher Pro for mac是应用在mac上的一款电池cpu温度监测工具,安装它,您的Mac电池将最多续航25%*,并根据使用情况将CPU温度降低到25ºC,包括由 ...
最新文章
- maven java jar_在maven中引入本地jar包的方法
- 【BZOJ】1706: [usaco2007 Nov]relays 奶牛接力跑
- Java基础17:Java IO流总结
- MathCAD求解方程组
- 交叉渡线道岔规格_交叉渡线道岔选择基本原则
- TCP和UDP,HTTP和HTTPS
- This project references NuGet package(s) that are missing on this computer
- python简单代码恶搞-一个可以套路别人的python小程序实例代码
- 央行发布洗钱风险自评估指引 12月31日前更新制度
- 使用工具(JD-GUI和APKIDE)反编译JAR的方法
- Vagrant启动报错
- SAP MM 固定资产采购订单
- 个人日记-《学习究竟是什么》读后感-2020/6/21
- 如何把pdf翻译成中文?
- 【计算机算法】递归——打印旋转方阵(正转及逆转)
- mysql占用cpu特别高的解决_mysql占用CPU过高的解决办法
- Js的Mixin 模式
- STM32物联网项目-双极性步进电机
- expand linux,整理一下linux系统expand 命令
- 操作系统 --- 虚拟文件系统
热门文章
- python出现invalid argument什么意思_python程序运行后提示IOError: [Errno 22] Invalid argument 急啊!!!!...
- 《破碎的残阳,我们逆光》连载小说- HashMap剖析
- C语言 用空格作判断,C语言菜鸟基础教程之判断
- Android 天气APP(十四)修复UI显示异常、优化业务代码逻辑、增加详情天气显示
- python新年祝福代码_如何编写逼格很高的新年祝福短信?
- 使用多线程批量处理数据
- 电脑编程技巧与维护杂志社供稿一篇
- 卖家付出佣钱的付出宝账户
- WIN7局域网共享文件因权限不足无法访问
- poi导出excel xls