# FSM_Lite_Pro_Template **Repository Path**: freebsd/FSM_Lite_Pro_Template ## Basic Information - **Project Name**: FSM_Lite_Pro_Template - **Description**: 一个简单的软件框架,设计的初衷还是主要用于8位的单片机,以FSM_Lite为基础改成指针结构体的方式来管理这些状态,代码比Lite会更简洁,不过要求单片机的IDE支持结构体指针才行 FSM_Task_Start(fsm, evt, tick) 1. 指定控制体,设置时间、tick时间片,当tick时间片倒计时完成后将事件设置到控制体的待处理状态 2. FSM_Lite_Pro.h有详细使用示例 - **Primary Language**: C - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2022-07-25 - **Last Updated**: 2022-07-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FSM_Lite_Pro_Template #### 介绍 一个简单的软件框架,设计的初衷主要用于普通的8位单片机,以FSM_Lite为基础改成指针方式来管理这些状态,代码比Lite会更简洁,不过要求单片机的IDE较好的支持指针才行 FSM_Task_Start(taskid, evt, tick) 1. 指定控制体,设置时间、tick时间片,当tick时间片倒计时完成后将事件设置到控制体的待处理状态 2. FSM_Lite_Pro.h有详细使用示例 #### 软件架构 使用一个包含4个变量的结构体来管理任务运行状态 #### 使用说明 ``` #ifndef __FSM_LITE_PRO_H__ #define __FSM_LITE_PRO_H__ #include "stdint.h" #define fsm_sta_t uint8_t #define fsm_time_t uint16_t // 此处定义 用户任务ID typedef enum TaskID_Tag{ FSM_Sys_TaskID = 0, // 系统ID FSM_Uart_TaskID, // 串口ID FSM_Max_TaskID } FSM_TaskID; typedef fsm_sta_t (*fsm_func)(FSM_TaskID id); typedef struct FSM_Lite_T { fsm_sta_t Status; // 处理状态 fsm_sta_t Event; // 设置事件 fsm_time_t nTicks; // 延时tick uint8_t Run; // 运行标志 fsm_func func; // 回调函数 } FSM_TypeDef; void FSM_Task_Init(FSM_TaskID id, fsm_func func); void FSM_Task_Start(FSM_TaskID id, fsm_sta_t evt, fsm_time_t tick); void FSM_Task_Stop(FSM_TaskID id); void FSM_Task_Run(void); void FSM_Timer_Run(void); fsm_sta_t FSM_Evt_Set(FSM_TaskID id, fsm_sta_t evt); fsm_sta_t FSM_Evt_Clr(FSM_TaskID id, fsm_sta_t evt); fsm_sta_t *FSM_GetSta(FSM_TaskID id); /* ********************** 任务使用示例 * * // 事件定义 * #define FSM_Init_Evt 0x01 // 初始状态 * #define FSM_Time_Evt 0x02 // 定时任务 * #define FSM_IDLE_Evt 0x04 // 休眠任务 * #define FSM_User_Evt 0x08 // 用户任务 * #define FSM_All_Evt 0xFF // 所有事件 * * // 应用示例 * fsm_sta_t System_App(FSM_TaskID id) * { * fsm_sta_t *Status = FSM_GetSta(id); * * if (*Status & Sys_Init_Evt) * { * // 延时10 个时钟tick后运行 Sys_Time_Evt 事件 * FSM_Task_Start(id, Sys_Time_Evt, 10); * * Init_Bsp(); * SysTick_Start(); //启动Systick * * // 清除事件状态 * return *Status ^= Sys_Init_Evt; * } * * if (*Status & Sys_IDLE_Evt) * { * Disable_Interrupt(); * * // 清除所有状态 * FSM_Task_Init(id, 0); * * // 关闭外设 | 看门狗 | GPIO | ADC * // 设置唤醒Pin * // 进入休眠 * * // 按键唤醒后... * // 判断唤醒条件, 是否允许唤醒 * if (Flow_Control.BatV_SuperLow_Sta == 0 || USB_IN_Pin) * { * SWDTEN = 1; // 打开看门狗 * // 执行 初始化 任务 * FSM_Task_Start(id, Sys_Init_Evt, 0); * } * else * { * // 条件不允许工作, 继续休眠 * FSM_Task_Start(id, Sys_IDLE_Evt, 0); * } * * // 特殊情况 不清除状态 * return *Status; * } * * return 0; * } * * void main(void) * { * FSM_Task_Init(FSM_Sys_TaskID, System_App); // 初始化任务体 * * // 运行初始化任务 * FSM_Task_Start(FSM_Sys_TaskID, Sys_Init_Evt, 0); * * for ( ; ; ) * { * FSM_Task_Run(); * * // 喂狗 * // CLRWDT(); * } * } * * // 定时器中断 * void SysTick_ISR() interrupt 1 using 1 * { * FSM_Timer_Run(); * } * * * */ #endif ```