首页 > 其他分享 >嵌入式软件通用框架

嵌入式软件通用框架

时间:2024-03-31 17:55:19浏览次数:24  
标签:tTaskInfo task gs 框架 void 任务 嵌入式软件 通用 app

前言

一个好的软件架构,能让代码逻辑更好的理解是如何运行的。在最开始写代码的时候,我总是一股脑的从头写道尾,想到什么功能就写上去。如今工作这么久了,重新审视一下自己的以前的代码和现在的在公司里写的代码,既可以发现:以前的代码很多功能上会出现相关干扰的风险。

常用三种架构

应用程序的架构大致有三种:

1、简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用程序即可。

2、时间片轮询法,此方法是介于顺序执行与操作系统之间的一种方法。

3、操作系统,此法应该是应用程序编写的最高境界。

本篇主要介绍时间片轮询法,适用于大多低端设备,在个人的一些DIY产品上使用也是刚好可以的。

时间片轮询法

介于前后台顺序执行法操作系统之间的一种程序架构设计方案。该设计方案需能帮助嵌入式软件开发者更上一层楼,在嵌入式软件开发过程中,若遇到以下几点,那么该设计方案可以说是最优选择,适用于程序较复杂的嵌入式系统;

  • 目前的需求设计需要完全没有必要上操作系统。
  • 任务函数无需时刻执行,存在间隔时间(比如按键,一般情况下,都需要软件防抖,初学者的做法通常是延时10ms左右再去判断,但10ms极大浪费了CPU的资源,在这段时间内CPU完全可以处理很多其他事情)
  • 实时性有一定的要求。

该设计方案需要使用一个定时器,一般情况下定时1ms即可(定时时间可随意定,但中断过于频繁效率就低,中断太长,实时性差),因此需要考虑到每个任务函数的执行时间,建议不能超过1ms(能通过程序优化缩短执行时间则最好优化,如果不能优化的,则必须保证该任务的执行周期必须远大于任务所执行的耗时时间),同时要求主循环或任务函数中不能存在毫秒级别的延时。

钩子函数实现方式

#include "app_task.h"
#include "bsp_mpu6050.h"  
#include "elog.h"
#define TAG "app_task"

static void app_task_test(void);

/**
 * @brief 任务函数相关信息结构体定义.
 */
typedef struct
{
    uint8_t m_runFlag;         /*!< 程序运行标记:0-不运行,1运行 */
    uint16_t m_timer;          /*!< 计时器 */
    uint16_t m_itvTime;        /*!< 任务运行间隔时间 */
    void (*m_pTaskHook)(void); /*!< 要运行的任务函数 */
} app_task_type_t;

#define APP_TASKS_MAX 2 // 定义任务数目

/** 任务函数相关信息 */
static app_task_type_t gs_tTaskInfo[APP_TASKS_MAX] = {
    // {0, 1, 1, NULL},       // 任务     1ms
    // {0, 10, 10, NULL},     // 任务     10ms
    // {0, 20, 20, NULL},     // 任务     20ms
    {0, 500, 500, app_task_test},       // 任务     500ms
    {0, 1000, 1000, MPU6050_test_demo}, // 任务     1000ms
};

static void app_task_test(void)
{
    elog_i(TAG,"app_task_test");
}

/**
  * @brief      任务函数运行标志处理.
  * @note       该函数由1ms定时器中断调用
  * @param      None.
  * @return     None.
  */
void TASK_Remarks(void)
{
    uint8_t i;
    for (i = 0; i < APP_TASKS_MAX; i++)
    {
        if (gs_tTaskInfo[i].m_timer)
        {
            gs_tTaskInfo[i].m_timer--;
            if (0 == gs_tTaskInfo[i].m_timer)
            {
                 gs_tTaskInfo[i].m_timer = gs_tTaskInfo[i].m_itvTime;
                 gs_tTaskInfo[i].m_runFlag = 1;
            }
        }
   }
}

/**
  * @brief      任务函数运行处理.
  * @note       该函数由主循环调用
  * @param      None.
  * @return     None.
  */
void TASK_Polling(void)
{
    uint8_t i;
    for (i = 0; i < APP_TASKS_MAX; i++)
    {
        if (gs_tTaskInfo[i].m_runFlag)
        {
            gs_tTaskInfo[i].m_pTaskHook();         // 运行任务
            gs_tTaskInfo[i].m_runFlag = 0;         // 标志清0
        }
    }  
}

这里使用的一种C语言的高级用法[钩子函数],这也是一种高级的代码编写技巧。

总结

对于其他两种方式,这里也不过多说明,总体上来说在轻量级设备中,这总方式可以不用占用过多资源即可实现的一种软件架构。详细文章可以参考:嵌入式软件开发常用的三种架构你知道吗? (qq.com)

标签:tTaskInfo,task,gs,框架,void,任务,嵌入式软件,通用,app
From: https://www.cnblogs.com/tangwc/p/18107001

相关文章

  • 基于Springboot框架高校学校自习室教室座位预约系统设计与实现(安装部署+源码+文档)
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • 【QT+QGIS跨平台编译】045:【netcdf3+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
    点击查看专栏目录文章目录一、NetCDF3介绍二、文件下载三、文件分析四、pro文件五、编译实践一、NetCDF3介绍  NetCDF(NetworkCommonDataForm)是一种用于存储科学数据的文件格式和库。NetCDF3是NetCDF的旧版本,通常指的是NetCDF版本3.x。  以下是......
  • 解析两大Java框架:Spring与Spring Boot的区别
    Spring框架基本介绍Spring是一个开源的Java平台,它最初是为了解决企业级应用开发的复杂性而创建的。作为一个全面的编程和配置模型,Spring提供了一个框架,让开发者可以构建轻量级、松耦合的应用。SpringBoot基本介绍SpringBoot是基于Spring的一个框架,设计理念是简化新Sp......
  • (七)Rust 通用的编程概念
    变量与可变性在Rust语言中,声明变量是使用let关键字,而且变量默认是不可改变的,一旦值被绑定在一个名称上,就不能给这个变量重新赋值,如果重新赋值的话,就会在编译的时候报错。这是Rust提供给我们的众多优势之一,让我们可以充分利用Rust提供的安全性和简单并发性来编写代码......
  • I2C系统框架(1)
    学习资料:韦东山第三期 i2c_adapter:nr:第几路i2c总线xfer:读写操作structi2c_adapter{structmodule*owner;unsignedintclass;/*classestoallowprobingfor*/conststructi2c_algorithm*algo;/*thealgorithmt......
  • 安卓UI框架布局设计
    文章目录一、AndroidSDK中最常用的布局类1.1框架布局1.2线性布局-LinearLayout1.3相对布局(RelativeLayout)1.4网格布局二、UI布局2.1View视图2.2ViewGroup布局管三、再说明Android布局的类型3.0两种方式定义布局(1)在XML中声明UI元素(2)在运行时实例化布......
  • 人工智能伦理与法律:大模型的责任归属与监管框架研究
    人工智能伦理与法律:大模型的责任归属与监管框架研究1.背景介绍随着人工智能技术的飞速发展,特别是大模型的广泛应用,人工智能伦理和法律问题日益凸显。大模型,如深度学习、自然语言处理等,在提供便利的同时,也带来了诸如数据隐私、算法偏见、责任归属等伦理和法律问题。本文旨......
  • Spring Boot框架中的JDK动态代理实践及其应用场景
    引言在Java编程中,JDK动态代理是一种强大的设计模式,它允许我们在运行时动态地创建并实现代理类,从而对目标对象的行为进行增强或控制。这种机制主要由Java标准库java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口提供支持。在诸如SpringBoot这样的企业级开......
  • gRPC框架
    读了songguojun大佬的一篇文章gRPC框架详解,总结一下关于gRPC的知识点RPC是什么RPC是远程调用,是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议,简单的理解就是一个节点请求另一个节点提供的服务。RPC只是一套协议,基于这套协议规范来实现的框架称为RPC框架......
  • debian12 linux root能用lightdm登陆xfce桌面,普通用户不能用lightdm登陆xfce桌面,闪
    Fn+Ctrl+F3,进入tty,发现登陆普通用户后再使用startxfce4可以直接进桌面下面参照https://forums.opensuse.org/t/normal-user-can-not-login/50756http://linux.it.net.cn/m/view.php?aid=6499有多种办法原因可能是用在自己账户下命令行sudostartx导致~/.Xauthority文件......