03-单片机商业项目编程,从零搭建低功耗系统设计

一、本文内容

    上一节《02-单片机商业项目编程,从零搭建低功耗系统设计-CSDN博客》引出了伪时间片的概念,这也是再低功耗系统设计中必须使用的程序设计逻辑,本文着重来讲解如何利用伪时间片来设计伪多任务,以及伪时间片多任务内核设计构思。

二、伪时间片多任务

    像ucos、freeRTOS常在单片机中使用的实时操作系统,他们属于真正的多任务,而对于性能较弱的单片机往往也想有类似的结构,那么我们就把每个任务都划分为不同的时间段去执行。比如有个按键检测的任务,它并不需要1ms来检测依次用户的操作,可能100ms检测一次即可,那我们就可以创建一个100ms周期的任务,来专门做按键检测;当然类似的还有液晶屏幕数据的刷新,可能500ms才需要刷新一次等等。

    时间调度要做的事情也很简单,就是不断的看指定时间有没有到,如果时间到了,就以事件的形式向上层传递,上层执行对应的任务,执行结果有必要再以回调的形式反馈给更上层。

三、低功耗伪时间片多任务调度

    通过伪时间片多任务的事件调度功能,如果我们不考虑低功耗,那么哪怕是个初学者,这种事件调度的逻辑也能轻而易举的实现吧;如果考虑低功耗,那么问题就变得也没有很复杂,哈哈哈。

    首先我们设计一个全局变量g_sys_tick=0,从单片机运行开始,就不断的计数,为了方便讲解,我们暂且认为它可以计数到无限大,不用考虑归零的事情,在0时刻,我们要创建3个事件,实际上就是设置3个比较值,当g_sys_tick达到对应比较值,则触发对应的事件去执行对应的任务。

    现在问题来了,g_sys_tick从0~99ms,是谁在给它计数复制,是谁时时刻刻在让if(g_sys_tick==100ms)做比较呢?答案当然就是定时器中断了,而不是让我们的程序去时刻的判断。

    1、从0时刻开始,定时器只需要选择最近的时刻做一个100ms定时,进入休眠状态;

    2、到了100ms,再创建一个140ms定时(即0时刻的那个240ms任务),但此时又来了一个定时600ms任务,则再100+600=700ms处增加一个标记,进入休眠状态;

    3、到了240ms,再创建一个260ms定时(即0时刻的那个500ms任务),进入休眠状态;

    4、到了500ms,再创建一个200ms定时(即100ms时刻的那个600ms任务),进入休眠状态;

    5、永远这么持续下去,实际上定时器每次只做一次定时,担任到点叫醒单片机的任务,其它时间都在睡大觉。

四、总结

    低功耗的任务调度思路就是把本身需要单片机while(1)中时刻判断的定时标记,通过分散在时间条上,逐个定时来实现,从而把空闲的时间让单片机来休眠,达到省电的目的。

    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/9250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Abp框架,EF 生成迁移文件时,自动添加表和字段注释内容

在使用 abp 框架,或者ef 的时候都会遇到一个问题,就是建实体后要将实体描述生成到数据库中,就需要手动去添加 [Comment("注释内容")] 注解,这样相当于手动写两次注释(即使你是 Ctrl C)&#x…

景源畅信电商:抖音小店有哪些比较热门的宣传方法?

抖音小店的热门宣传方法,是许多商家关注的焦点。在数字化营销时代,有效的宣传手段不仅能提升品牌知名度,还能吸引潜在消费者,促进销售。以下是针对抖音小店热门宣传方法的详细阐述: 一、短视频内容营销 作为抖音的核心…

【进程等待】阻塞等待 | options非阻塞等待

目录 waitpid 阻塞等待 options&非阻塞等待 pid_t返回值 阻塞等待VS非阻塞等待 waitpid 回顾上篇: pid_ t waitpid(pid_t pid, int *status, int options); 返回值: 当正常返回的时候waitpid返回收集到的子进程的进程ID;如果设置了…

PSCA电源管理软件栈示例

安全之安全(security)博客目录导读 目录 1、移动通讯系统 2、基础设施系统 本博客就PSCA电源管理软件栈进行举例,主要以移动通讯系统和基础设施系统为例来说明。 1、移动通讯系统 图3.4显示了一个可以在基于Linux的移动设备中实现的电源管理堆栈示例。 在Linux…

使用WPF中的Trigger实现按钮样式动态更改

使用WPF中的Trigger实现按钮样式动态更改 在Windows Presentation Foundation (WPF)中,Trigger 是一种强大的机制,它可以基于控件的属性值来动态更改控件的样式。这篇博客将介绍如何使用Trigger实现按钮在鼠标悬停时样式动态更改的效果。我们将详细讨论为…

Faiss核心解析:提升推荐系统的利器【AI写作免费】

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

STM32使用L9110驱动电机自制小风扇

1.1 介绍: 该电机控制模块采用L9110电机控制芯片。该芯片具有两个TTL/CMOS兼容输入端子,并具有抗干扰特性:具有高电流驱动能力,两个输出端子可直接驱动直流电机,每个输出端口可提供750800mA动态电流,其峰值…

【适用全主题】WordPress原创插件:弹窗通知插件 支持内容自定义

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 适用于所有WordPress主题的弹窗插件 一款WordPress原创插件:弹窗通知插件 支持内容自定义 二、效果展示 1.部分代码 代码如下(示例)&#xff1…

【java.io.IOException: java.lang.IllegalArgumentException: db.num is null】

默认用户名:nacos 密码:nacos解决方法: a)在conf目录下将nacos-mysql.sql脚本创建完成; b)修改application.properties,在内容里添加如下内容 spring.datasource.platformmysql db.num1 db.url.0jdbc:mysql://localho…

有刷电机、无刷电机

阅读引言: 最近在备赛, 自己之前虽然用过电机, 但是发现在一些高要求的应用场景, 发现自己对电机的知识理解得不是很透彻, 所以写下这篇文章。 目录 一、 有刷电机内部原理 二、有刷电机一些关键参数 三、无刷电机内…

机器学习初学者 6 个核心算法!建议收藏,反复观看!

今天再来介绍机器学习算法的基本概念和适用场景! 首先,引用一句英国统计学家George E. P. Box的名言:All models are wrong, but some are useful. 没有哪一种算法能够适用所有情况,只有针对某一种问题更有用的算法。 也就是说&…

STM32理论 —— μCOS-Ⅲ(新)

文章目录 1. 任务调度器1.1 抢占式调度 μCos-Ⅲ全称是Micro C OS Ⅲ,由Micriμm 公司发布的一个基于C 语言编写的第三代小型实时操作系统(RTOS); RTOS 与裸机相比最大的优势在于多任务管理与实时性,它提供了多任务管理和任务间通信的功能&a…

一文玩转Vue3参数传递——全栈开发之路--前端篇(8)

全栈开发一条龙——前端篇 第一篇:框架确定、ide设置与项目创建 第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇:setup语法,设置响应式数据。 第四篇:数据绑定、计算属性和watch监视 第五篇 : 组件…

电脑桌面定时提醒软件 有定时提醒功能的软件有哪些

对于很多上班族来说,在电脑、手机上使用一款定时提醒软件,是非常有必要的。一款定时提醒软件能让我们对即将进行的工作一目了然,防止遗漏或错过重要事务。其次,通过设定提醒,我们可以更好地安排自己的时间,…

基于springboot实现医院药品管理系统项目【项目源码+论文说明】

基于springboot实现医院药品管理系统演示 摘要 身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升,而读书就…

社交媒体数据恢复:新浪微博

当我们在使用新浪微博时,可能会遇到一些意外情况,如误删微博、账号出现问题等。这时,我们需要进行数据恢复。本文将详细介绍如何在新浪微博中进行数据恢复。 首先,我们需要了解新浪微博的数据恢复功能。根据微博的帮助中心&#…

Android11 InputManagerService启动流程分析

InputManagerService在systemserver进程中被启动 //frameworks\base\services\java\com\android\server\SystemServer.java t.traceBegin("StartInputManagerService"); inputManager new InputManagerService(context);//1 t.traceEnd(); //省略 //注册服务 Servi…

socket实现TCP UDP

1、socket通信建立流程 1.1、创建服务端流程 使用 socket 函数来创建 socket服务。 使用 bind 函数绑定端口。 使用 listen 函数监听端口。 使用 accept 函数接收客户端请求。 1.2、创建客户端流程 使用 socket 函数来创建 socket 服务。 使用 connect 函数连接到 socke…

基于springboot+jsp+Mysql的商务安全邮箱邮件收发

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

【强训笔记】day16

NO.1 代码实现&#xff1a; class StringFormat { public:string formatString(string A, int n, vector<char> arg, int m) {string ret;int j0;for(int i0;i<n;i){if(A[i]%){if(i1<n&&A[i1]s){retarg[j];i;}else {retA[i];}}else {retA[i];}}while(j&l…