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

一、引言

    这是关于《单片机商业编程之从零搭建低功耗系统》的第一篇章,个人善忘,平常项目设计当中的一些思路,以前年轻的时候习惯性的录制成视频,也算是当作是自己的笔记,无奈现在喉咙实在扛不住,因此先尝试用文章的形式写出来试试。

    单片机编程本身并不复杂,由于资源受限,往往最求代码执行效率和代码使用效率优先;在较弱性能的单片机上,平常使用实时操作系统的机会也少,很多时候都是自己写的一个简单框架能够满足大部分应用需求,那么简单的框架怎样才算是比较实用呢,这虽然没有统一的标准,但是却可以借鉴优秀的框架,以前也喜欢研读像ucos、ucgui、lwip、ble相关的内核或者协议栈,会使得自己受益良多,然后将其框架思维做尽量的简化应用于单片机项目中,使得项目编程效率大大提高。对于低功耗系统设计的思路,主要参考了低功耗蓝牙的系统而总结出来的。

    既然是从零开始,那么就从最基本的开始讲起,逐渐实现完整的低功耗系统,注意是一个系统,从结构上类似我们的平常的freeRTOS这些,但是它并不是真正的系统,只是用起来看似规范很多,这样既能够保障占用单片机资源最少,又能保障使用规范,使得移植更方便。

二、本文内容

   本文主要讲解面向事件编程的逻辑,这也是低功耗设计最关键的编程思维。何为事件,即所有触发需要执行的代码的条件,都是事件,比如某个按键按下算一个事件、按键抬起也算一个事件,一个定时器定时事件到达是一个事件,接收到一个串口数据或者接收到一整包串口数据都算一个事件。

三、事件详解

    单片机编程实际就是根据某个条件,然后执行某些动作,这个条件可能是某个按键,也可能是某个定时任务。

    在没有达到这个条件的时候,单片机一般都是空闲的,而我们大部分做法就是在mian的while(1)中不断的去轮询是不是有某个条件达到,举个最最简单的例子就是定时器的t_flg是否满足条件,满足就执行指定动作。而这些空闲阶段单片机在死循环中快速执行,就等于单片机时时刻刻在消耗电流,使得达不到低功耗的要求。

#include "stdint.h"

uint8_t t_flag = 0;

int main(void)
{
	main_init();
	
	while (1)
	{
		if(t_flag)
		{
			t_flag = 0;
			//执行指定任务
			//...
		}
	}
}

void timer_interrupt(void)
{
	t_flag = 1;	//100ms中断
}

    对于t_flag=1而言,它就是一个事件,那么100ms内,在while(1)中可能有99.9%的时间都是浪费的,那么怎样把99.9%的能量都节约起来呢?我们只要设定定时器唤醒单片机,然后让单片机进入休眠即可,这样单片机平常只处于休眠中断,在timer中断来临的那一刻,它才进入中断设置t_flag=1,然后while(1)才继续往下执行,就达到了节约99%+的能量。

#include "stdint.h"

uint8_t t_flag = 0;

void set_wakeup_condition(void)
{
	//设定定时器中断唤醒单片机
	//...
}

void mcu_sleep_and_wait_wakeup(void)
{
	//单片机进入休眠状态
	//...
}

int main(void)
{
	main_init();
	
	while (1)
	{
		set_wakeup_condition();
		mcu_sleep_and_wait_wakeup();
		if(t_flag)
		{
			t_flag = 0;
			//执行指定任务
			//...
		}
		
	}
}

void timer_interrupt(void)
{
	t_flag = 1;	//100ms中断
}

四、总结

    事件编程起始很好理解,而且我们一直都在用,只是要使得事件编程写法更规范,那么我们可以用函数进行封装,利用宏定义进行规范定义,就使得可读性更强,后续章节会慢慢使其更规范。

下一节:02-单片机商业项目编程,从零搭建低功耗系统设计-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux下的I2C通信

I2C通信: 一.硬件初识: IIC(inter-intergrated-Circu):内部集成总线 四线通讯:SCL,SDA,GND,VCC,串行,半双工 I2C 总线是同步,串行,半双工通信总线。 I2C 总线由时钟线 SDA 和 SCL 两根信号线构成。并且都有上拉电阻。确保总线空闲状态为高电平。 I2C 总线支持多…

四川古力未来科技抖音小店:安全便捷购物新体验

在这个数字化快速发展的时代,网络购物已经成为人们生活中不可或缺的一部分。四川古力未来科技抖音小店以其高度的安全性,为广大消费者提供了一个值得信赖的购物平台。在这里,我们可以享受到安全便捷的购物体验,畅游科技的海洋。 一…

java回调机制

目录 一、简介二、示例2.1 同步回调2.2 异步回调2.3 二者区别 三、应用场景 一、简介 在Java中,回调是一种常见的编程模式,它允许一个对象将某个方法作为参数传递给另一个对象,以便在适当的时候调用该方法。 以类A调用类B方法为例: 在类A中…

CTF-reverse,逆向分析,对“左移4或右移4,即(x<<4) | (x >>4)的加密探讨

博主在刷题过程中遇上这样一个有意思的加密(如下图),苦苦思索其逆向运算,被硬控了很久,也没搜到什么资料来解释这个问题(也许是太简单??蒟蒻博主怀疑人生……) 经过博主不…

2024最新版JavaScript逆向爬虫教程-------基础篇之无限debugger的原理与绕过

目录 一、无限debugger的原理与绕过1.1 案例介绍1.2 实现原理1.3 绕过debugger方法1.3.1 禁用所有断点1.3.2 禁用局部断点1.3.3 替换文件1.3.4 函数置空与hook 二、补充2.1 改写JavaScript文件2.2 浏览器开发者工具中出现的VM开头的JS文件是什么? 一、无限debugger的…

正点原子Linux学习笔记(七)在 LCD 上显示 png 图片

在 LCD 上显示 png 图片 21.1 PNG 简介21.2 libpng 简介21.3 zlib 移植下载源码包编译源码安装目录下的文件夹介绍移植到开发板 21.4 libpng 移植下载源码包编译源码安装目录下的文件夹介绍移植到开发板 21.5 libpng 使用说明libpng 的数据结构创建和初始化 png_struct 对象创建…

win11个性化锁屏界面怎么关闭?

win11个性化锁屏界面关闭方法对于win11用户来说,关闭个性化锁屏界面是一个常见问题。本文将由php小编苹果详细介绍如何执行此操作,分步指导并提供操作截图。继续阅读以了解具体步骤。 win11个性化锁屏界面关闭方法 第一步,点击底部Windows图…

企信通_企信通短信群发平台

现代社会,随着互联网技术的快速发展,传统的营销方式已经无法满足企业对于市场开拓和客户沟通的需求。群发作为一种高效、低成本的营销手段,逐渐成为了众多企业的首选。而在众多群发平台中,嘀迈信息企信通公司凭借其稳定可靠的服务…

GM EPUB Reader Pro for Mac:专业电子书阅读工具

GM EPUB Reader Pro是一款适用于Mac的专业EPUB阅读软件。它为用户提供了优质的阅读体验和丰富的功能。 GM EPUB Reader Pro支持EPUB格式,这是一种广泛使用的电子书格式,常用于小说、教育书籍、期刊等。您可以通过该软件打开和阅读EPUB文件,享…

提取网页元数据的Python库之lassie使用详解

概要 Lassie是一个用于提取网页元数据的Python库,它能够智能地抓取网页的标题、描述、关键图像等内容。Lassie的设计目的是为了简化从各种类型的网页中提取关键信息的过程,适用于需要预览链接内容的应用场景。 安装 安装Lassie非常简单,可以通过Python的包管理器pip进行安…

WPS二次开发系列:一文快速了解WPS SDK功能场景

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 目录 SDK功能介绍 功能详解: 打开文档…

Windows系统完全卸载删除 Node.js (包含控制面板找不到node.js选项情况)

1.打开cmd命令行窗口,输入npm cache clean --force 回车执行 2.打开控制面板,在控制面板中把Node.js卸载 移除之后检查环境变量是否也移除:点击Path,点击编辑。 把环境变量中和node有关的全部移除,然后点击确定。 3.重…

WEB基础--JDBC基础

JDBC简介 JDBC概述 数据库持久化介绍 jdbc是java做数据库持久化的规范,持久化(persistence):把数据保存到可掉电式存储设备(断电之后,数据还在,比如硬盘,U盘)中以供之后使用。大多数情况下,特别是企业级…

Gartner发布准备应对勒索软件攻击指南:勒索软件攻击的三个阶段及其防御生命周期

攻击者改变了策略,在某些情况下转向勒索软件。安全和风险管理领导者必须通过提高检测和预防能力来为勒索软件攻击做好准备,同时还要改进其事后应对策略。 主要发现 勒索软件(无加密的数据盗窃攻击)是攻击者越来越多地使用的策略。…

SpringBoot启动流程分析之创建SpringApplication对象(一)

SpringBoot启动流程分析之创建SpringApplication对象(一) 目录: 文章目录 SpringBoot启动流程分析之创建SpringApplication对象(一)1、SpringApplication的构造方法1.1、推断应用程序类型1.2、设置Initializers1.3、设置Listener1.4、推断main方法所在类 流程分析…

Seata之XA 模式的使用

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Seata 是一款开源的…

计算机专业,求你别再玩了,我都替你们着急

明确学习目标和方向:确定自己希望在计算机领域的哪个方向深入发展,如前端开发、后端开发、数据库管理、人工智能等。根据目标方向,制定详细的学习计划,确保所学知识与未来职业方向相匹配。 【PDF学习资料文末获取】 扎实基础知识…

变配电工程 变配电室智能监控系统 门禁 视频 环境 机器人

一、方案背景 要真正了解无人值守配电房的运行模式,我们必须对“无人值守”这一概念有准确的理解。它并不意味着完全没有工作人员管理,而是通过技术设备和人机协作来确保配电房的正常运行。 利用变配电室智能监控系统,可以实时获得配电室各…

【优选算法】—Leetcode—11—— 盛最多水的容器

1.题目 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#…

滑动窗口详解

目录 一、滑动窗口的特定步骤: 二、题目解析 1、⻓度最⼩的⼦数组---点击跳转题目 3、最⼤连续 1 的个数 III----点击跳转题目 4、将 x 减到 0 的最⼩操作数----点击跳转题目 5、⽔果成篮----点击跳转题目 滑动窗口是双指针算法中细分的一种,它由暴…