概述
在工作和学习中,我们对单片机的裸机开发使用不需要快速响应,只需要每隔一段时间执行一次程序时,我们就可以考虑这种基于时间片+状态机的裸机框架进行软件开发。
时间片
通过系统滴答定时器设定每隔一段时间产生滴答中断,然后有几个任务设置几个软件定时器,达到一段时间就将任务运行状态值1。
状态机
通俗的话讲,就是设置不同的状态,达到什么状态的执行什么指令。这里引用ChatGPT的解释:
状态机(State machine)是一种数学模型,也是一种计算机编程中常用的工具,用于描述对象在不同状态下的行为。
一个状态机通常由一组状态、一组输入事件和一组输出动作组成。在任何时刻,状态机都处于其中一个状态,当发生某个输入事件时,状态机会根据当前状态以及输入事件来执行某个输出动作,并切换到一个新的状态。
一个简单的例子是一个自动售货机。在这个状态机中,可能有以下几种状态:等待,接受硬币,选择产品,出售产品等。输入事件可以是硬币的投入,产品的选择等,输出动作可以是产品的出售,硬币的退回等。
状态机可以用来描述许多计算机系统中的行为,例如编译器、网络协议、游戏等。在编程中,状态机通常被实现为一个状态转移表或者状态转移图,用来控制程序的行为。
使用状态机的好处包括代码结构清晰、易于理解和调试,同时可以避免复杂的 if/else 嵌套结构。
框架介绍
我学习的是B站上嵌入式阿勇的方法,还是比较清晰的,在此基础上做出了一定的修改。
整体文件框架如图,用的是STM32F103芯片。
CORE文件夹内存放系统文件、启动文件、软件接口标准文件
Libraries文件夹内放标准外设文件
SYSTICK文件夹内放系统滴答定时器的头文件和函数文件
BSP文件夹内放硬件驱动,比如LED、按键等
APP内放各种软件驱动,比如IIC、CAN、串口等
USER文件夹内存放主函数、中断函数、任务函数
程序架构如图
主函数
主函数代码如下:
/*
****************** STM32F10x ******************
*@文件名 :main.c
*@作者 :
*@库版本 :V3.5.0
*@文件版本 :V1.0
*@日期 :2023.04.24
*@摘要 :
*************************************************
*/
/*------------------------------------------------
更新日志:
2023.04.24 V1.0 初始版本
------------------------------------------------*/
/********************包含的头文件**********************/
#include "stm32f10x.h" // Device header
#include "bsp.h"
#include "app.h"
#include "task.h"
/************************************************
函数名:main 形参:无 返回值:无
功能说明:主函数
************************************************/
int main(void)
{
bsp_Init();
app_Init();
while(1)
{
task_run();
}
}
硬件初始化bsp相关函数
硬件初始化程序如下,bsp就是板级支持包,所有硬件相关初始化函数在这个文件下调用。
/*
****************** STM32F10x ******************
*@文件名 :bsp.c
*@作者 :GeHaiGuang
*@库版本 :V3.5.0
*@文件版本 :V1.0
*@日期 :2023.04.24
*@摘要 :bsp源文件
*************************************************
*/
/*------------------------------------------------
更新日志:
2023.04.24 V1.0 初始版本
------------------------------------------------*/
/********************包含的头文件**********************/
#include "bsp.h"
#include "systick.h"
#include "bsp_key.h"