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博客

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

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

相关文章

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第一周) - 自然语言处理介绍和线性分类

自然语言处理介绍和线性分类 1. 自然语言处理介绍2. 线性二分类3. 情感分析和基础特征提取 3.1. 情感分析3.2. 特征提取3.3. 文本预处理 4. 学习的基础-梯度下降算法5. 感知机6. 逻辑回归7. 情感分析8. 感知机和逻辑回归 1. 自然语言处理介绍 自然语言处理的目标是什么 能够解…

(2024,KAN,MLP,可训练激活函数,样条函数,分层函数)Kolmogorov–Arnold 网络

KAN: Kolmogorov–Arnold Networks 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 1. 简介 2. KAN 2.1 KA 表示定理 2.2 KAN 架构 2.3 KAN 的逼近能力和缩放定律 2.4 对于…

国产操作系统下使用dpkg命令管理软件包 _ 统信 _ 麒麟 _ 中科方德

往期好文:国产操作系统下Chrome的命令行使用 | 统信 | 麒麟 Hello,大家好啊!在Linux系统中,dpkg是Debian包管理系统的基础命令工具,它允许用户安装、卸载、查询和管理软件包。在国产操作系统如统信UOS和麒麟KOS、中科方…

字节码基础

基本概念 java中的字节码,英文bytecode。是java代码编译后的中间代码格式。JVM需要读取并解析字节码才能执行相应的任务。java字节码是JVM的指令集。JVM加载字节码格式的class文件。校验之后通过JIT编译器转换成本机机器代码执行。 java字节码简介 1、java byteco…

阿里云部署ChatGLM-6B及ptuning微调教程

一、模型部署 1.进入阿里云人工智能平台PAI。 2.申请免费试用。 3.打开交互式建模 PAI-DSW。 4.新建实例。 5.填写配置。 6.实例准备完成后点击打开。 7.打开实例后点击Teminal。 8.在Teminal中依次输入以下命令并执行。 apt-get update apt-get install git-lfs git lfs ins…

SQLite利用事务实现批量插入(提升效率)

在尝试过SQLite批量插入一百万条记录,执行时长高达20多分钟后,就在想一个问题,这样的性能是不可能被广泛应用的,更不可能出现在真实的生产环境中,那么对此应该如何优化一下呢? 首先分析一下批量插入的逻辑 …

React Router DOM BrowserRouter

是 React Router DOM 库中的一个核心组件,它用于在 React 应用程序中设置路由,并允许你使用 HTML5 的 history API 来管理 URL。BrowserRouter 使用浏览器提供的 history API 来跟踪和管理 URL 的变化,这使得你可以在不刷新整个页面的情况下改…

蓝桥杯-地宫取宝

X 国王有一个地宫宝库,是 nm 个格子的矩阵,每个格子放一件宝贝,每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或向下行走。 走过某个格子时,如果那个…

网络工程师----第二十四天

计算机基础 第一章:概述 互联网的组成: (1)边缘部分:由所有连接在互联网上的主机组成。这部分是用户直接使用的,用来进行通信(传送数据、音频或视频)和资源共享。 (2…

Python大数据分析——Logistic回归模型

Logistic回归模型 概念理论分析模型评估混淆矩阵ROC曲线KS曲线 函数示例 概念 之前的回归的变量是连续的数值变量;而Logistics回归是二元离散值,用来解决二分类问题。 理论分析 上式中的hβ(X)也被称为Loqistic回归模型,它是将线性回归模型…

2-1 EXTI外部中断(gd32)

中断的概念 中断硬件结构/软件结构 EXTI中断 EXTI硬件结构 注:EXTI线在同一时刻只能连接一个GPIO口,如果我们先连接了PA0,然后又连接了PB0那么此时PA0这个IO口就失去作用。 中断触发函数 中断优先级 中断优先级 数值越小优先级越高,抢占优先级…

247 基于matlab的梁的振型仿真

基于matlab的梁的振型仿真。利用有限元理论,求二维梁的固有频率和振型。短边固定,给定长度、横截面积,弹性模量及材料密度已知。并对比理论计算结果进行分析。各参数自己设定。程序已调通,可直接运行。 247 梁的振型仿真 固有频率…

iOS 让APP支持横竖屏

代码示例 Appdelegate添加属性(在Appdelegate.m中添加该属性) /** 是否允许横屏属性*/ property (nonatomic,assign)BOOL isAllowRotation; 设置可以支持的方向(在AppDelegate.m中添加) - (UIInterfaceOrientationMask)appli…

Unity2D 模拟手柄实现玩家移动

1,创建控制器UI 2,挂载脚本 3,脚本编写 基本要素 [Tooltip("玩家游戏体")]public Rigidbody2D player;[Tooltip("玩家速度")]public float speed 1f;[Tooltip("玩家动画")]public Animator animator;public …

企业级复杂前中台项目响应式处理方案

目录 01: 前言 02: 响应式下navigtionBar实现方案分析 数据 视图 小结 03: 抽离公用逻辑,封装系列动作 04: PC端navigationBar私有逻辑处理 05: 分析 navigationBar 闪烁问题 06: 处理 navigationBar 闪烁问题 07: category数据缓存,覆盖…

Android 13 系统自定义安全水印

效果 源码实现 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java public final void showSafeModeOverlay() {View v LayoutInflater.from(mContext).inflate(com.android.internal.R.layout.safe_mode, null);WindowManager.Layout…

程序员工作中常见问题,你遇到过几个?

在赛博朋克2077玩后感中,我提到,即便是在严谨的机制下,依然可能出现让人匪夷所思或是贻笑大方的问题。 那么今天,就以后端程序员的视角,盘点下从设计开发到上线的常见问题,看看大家中过几个。 01 设计与开…

问题与解决:大华视频后台播放报错

大华播放器接到BI系统后,实时监控视频后台播放一段时间后,报错如下: The play() request was interrupted because video-only background media was paused to save power. 在谷歌浏览器下,直接用代码运行系统,视频在…

python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解

这篇文章主要介绍了python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 JDBC Request 这个 Sampler 可以向数据…

MySQL存储过程简介

MySQL存储过程作为数据库服务器端的预编译SQL代码集合,不仅能够提高执行效率,还能实现复杂的业务逻辑,增强数据处理的灵活性。 # 一、存储过程概述 存储过程(Stored Procedure)是数据库中的一组为了完成特定功能的SQ…