关于STM32的CPU的使用率~裸机不带系统
1. 如果你不跑操作系统,CPU肯定一直都是100%使用的,哪怕你里面是延时等待,CPU也是一直在执行空语句nop,因为STM32里面是有一个CPU。
2.对于stm32总是百分百。只是有多少时间空闲,多少时间干活!
3.
楼主的意思是实际CPU用来干正事的时间,在整个时间里的比例,打个比方,如果工作50mS,再等待200mS,完成一个大循环,那么CPU的使用率就是20%。
如果楼主的程序是以大循环方式做的,那么在进入等待前把一个IO口拉低,等待结束,开始工作,把IO口拉高,那么占空比就是使用率,当然这是在各种中断不是很频繁,而且中断里处理的事情很少的情况下有用,我经常这么估算MCU的速率富余度的,然后据此设置一个合适的MCU工作频率,降低不仅仅是CPU的功耗那一点点电能,如果是线性降压,整个功耗下降很多的,发热就低了,而且工作频率下降,CPU稳定性也会增强。 |
4. 首先,我们知道Cortex有几种内核的低功耗工作状态,Sleep, Stop, Standby
这里我用到的是Sleep状态,即设计程序时,当程序的任务处理完后,使单片机进入WFE或WFI的Sleep状态:
使用操作系统时,直接在空闲任务中添加__WFI();或__WFE();即可
裸机程序时,设计程序结构为大main循环为中断或事件触发的形式,即main循环等待队列中的任务,当队列为空时,执行__WFI();或__WFE();。添加队列的操作在串口、按键、计时器中断中进行,等等。
然后,我们采用的是外设的低功耗状态,即STM32的外设可以在内核进入低功耗状态后,手动或自动停止外设的时钟,当退出低功耗状态时手动或自动恢复外设始终。
由于我这方法是在F4上面实现的,采用F1实现时,会显得臃肿一些,大家理解啥意思就行了,采用F4时会方便很多。
这是F1的外设低功耗特性,可见,外设在内核进入低功耗状态时,外设时钟只能手动打开和关闭。
这是F4的外设低功耗特性,可见,外设在内核进入低功耗状态时,外设时钟可以自动关闭。
在使用F4时,我们就可以采用如TIM6和TIM7两个计时器
配置如下
- void tim6_init(void)
- {
- TIM_TimeBaseInitTypeDef TIM_InitStructure;
- RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM6, ENABLE );
- RCC_APB1PeriphClockLPModeCmd(RCC_APB1Periph_TIM6, DISABLE);
- TIM_DeInit(TIM6);
- TIM_InitStructure.TIM_Prescaler = 180;
- TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_InitStructure.TIM_Period = 65535;
- TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_InitStructure.TIM_RepetitionCounter = 0;
- TIM_TimeBaseInit(TIM6, &TIM_InitStructure);
- TIM_SetCounter(TIM6, 0);
- TIM_ITConfig(TIM6, TIM_IT_Update, DISABLE);
- TIM_Cmd(TIM6, ENABLE);
- }
- void tim7_init(void)
- {
- TIM_TimeBaseInitTypeDef TIM_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB2PeriphClockCmd (RCC_APB2Periph_SYSCFG, ENABLE);
- RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM7, ENABLE);
- RCC_APB1PeriphClockLPModeCmd(RCC_APB1Periph_TIM7, ENABLE);
- TIM_DeInit(TIM7);
- TIM_InitStructure.TIM_Prescaler = 180;
- TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_InitStructure.TIM_Period = 65535;
- TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_InitStructure.TIM_RepetitionCounter = 0;
- TIM_TimeBaseInit(TIM7, &TIM_InitStructure);
- TIM_SetCounter(TIM7, 0);
- TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);
- NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- TIM_Cmd(TIM7, ENABLE);
- }
复制代码
TIM7中断代码如下:
- void TIM7_IRQHandler(void)
- {
- TIM7->SR = ~TIM_IT_Update;
- CPU_TICK_USAGE = TIM6->CNT;
- TIM6->CNT = 0;
- }
复制代码
计算CPU使用率(%)如下:
- CPULoad = (float)CPU_TICK_USAGE*100.0f/65535.0f
复制代码
当采用F1时,那就需要在每个中断的入口处,手动添加代码,使能TIM6时钟
并在每个__WFE();或__WFI();前手动添加代码,关闭TIM6时钟
在每个__WFE();或__WFI();后手动添加代码,使能TIM6时钟
当然,采用F1时,不用__WFE();或__WFI();而只用while循环也是一样的。
5.
围观,个人觉得既然是裸机,就没必要考虑CPU的使用率了 |
6.
在一般的应用中还是可以采用的,如现在我做的变频器项目,可以通过查看CPU的使用率考虑算法的复杂性,并根据CPU使用率确定最高的采样频率和PWM周期,同时确定CPU主频选取的是否合适。按我的感觉是,CPU使用率为75~85%时最合适。 |
关于STM32的CPU的使用率~裸机不带系统相关推荐
- 芯片,SOC和MCU区别;裸机和带系统
结论: (以上这是一个典型的soc包括进去的东西) (这是常见的soc,一般很多外面都有一个壳子,这个就是个壳子,东西都在里面,就是上图的那些东西,等于一个完整的单片机,当然也可以增或者减少) 注意邮 ...
- c# 获取进程cpu的使用率 简单试验
1.概要 想了解程序的效率,和运行的风险,准备观察一个CPU和内存的占用率. 2.代码 using System; using System.Diagnostics; using System.Thr ...
- 迅为RK3568开发板Linux_NVR_SDK系统开发-查看NPU/GPU/CPU频率使用率
iTOP-RK3568 开发板烧写 Linux_NVR_SDK 镜像,在串口终端输入以下命 令查看 NPU/GPU/CPU 频率使用率. 1 输入以下命令挂载 debug,只有挂载 debug 才可以 ...
- Linux环境下用Java获取CPU的使用率
在Java编程过程中希望知道CPU的使用率,以便决定是否加载任务.首先用google搜了一下,Windows环境可以用JNI通过API函数 getProcessCPUTime()来得到,并有人给出了源 ...
- Linux | Centos下几种CPU查看使用率的常用命令
文章目录 一.top 1.1 常用参数 二.free 三.vmstat 3.1 常用参数 3.2 获取信息 四.mpstat 4.1 安装 4.2 获取信息 一.top top命令是Linux下常用的 ...
- 【cpu_loading】/proc/stat统计cpu的使用率
参考:http://www.blogjava.net/fjzag/articles/317773.html 基于目前正在开发的手机 proc伪文件系统 /proc文件系统是一个伪文件系统,它只存在内存 ...
- python电脑配置要求cpu-Python限制内存和CPU使用量的方法(Unix系统适用)
问题 你想对在Unix系统上面运行的程序设置内存或CPU的使用限制. 解决方案 resource 模块能同时执行这两个任务.例如,要限制CPU时间,可以像下面这样做: import signal im ...
- 基于STM32+华为云IOT设计的酒驾监控系统
1. 前言 随着人们生活水平的提高,为了减少和杜绝车的现象越来越多,所引发的交通事故也引起了人们的重视,为了减少和杜绝酒后驾车导致事故发生,当前设计了一种安装在驾驶室内,能根据具体功能进行鉴别酒精浓度 ...
- 毕业设计 STM32单片机的畜牧养殖场管理与检测系统 - 物联网
基于STM32单片机的畜牧养殖场管理与检测系统 由 STM32F103C8T6单片机最小系统+定时模块+DHT11温湿度感应模块+OLED显示模块+键盘模块+气味传感器模块+继电器*4. 采用STM3 ...
最新文章
- Uva1627 Team them up!
- js原生选项卡(自动播放无缝滚动轮播图)二
- html语言把字变大,css怎么让字体变大?
- LeetCode 1298. 你能从盒子里获得的最大糖果数(BFS)
- 【数据库系统】大学模式
- Linux驱动(7)--最简单的驱动HelloWorld
- SpringBoot实战(十):统一异常处理
- POJ 1751 Highways (kruskal)
- 程序员面试 IT 公司,这些地方你要注意!
- Android应用程序开发以及背后的设计思想深度剖析(2)
- 根据excel生成mysql数据库,根据excel生成数据库脚本
- Win7+MATLAB2017a+虚拟光驱
- JavaWeb网上商城项目中用户注册,使用MailServer和FoxMail搭建本地邮件服务器
- mysql 关键字 desc_mysql数据库表字段使用DESC等关键字报错及解决方法
- (日常)Dell R740 XD 服务器安装GPU显卡记录
- 祖冲之究竟是如何算出圆周率的?
- web前端简介 | 什么是前端
- 阿里巴巴Java开发手册github地址
- 【C语言】函数递归(详解)
- 4.vue常见指令v-for的基本使用