第一次提交

This commit is contained in:
2026-04-09 10:14:20 +08:00
commit e325a77b42
584 changed files with 279711 additions and 0 deletions

248
App/sys.c Normal file
View File

@@ -0,0 +1,248 @@
/**
* @auther whlphlg
* @brief sys.c<><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>йؿ<D0B9><D8BF><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD>
* uwTick <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8> HAL_GetTick() <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>uwTick(ֻ<><D6BB>)<29><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>uwTick<63><6B>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* uwTick ÿ<><C3BF>1ms<6D><73><EFBFBD><EFBFBD>һ<EFBFBD>Σ<EFBFBD>ֻҪ#include "main.h"<22><><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>uwTick<63><6B><EFBFBD><EFBFBD>hal<61><6C><EFBFBD>Դ<EFBFBD><D4B4>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>
* @changedate 2020.09.13
*/
//<2F>û<EFBFBD>include
#include "at32a423.h"
#include "systick.h"
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>include<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#include "sys.h"
#include "task.h"
typedef struct
{
uint8_t enable_flag; // <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ񱻿<C7B7><F1B1BBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>񲻱<EFBFBD><F1B2BBB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD> (<28><><30><CEAA><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>)
uint16_t interval_time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD>ʱ<EFBFBD><CAB1> (<28><>λms)
uint32_t last_time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> (<28><>λms)
uint8_t ready_flag; // <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><30><CEAA><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>)
uint32_t out_time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱֹͣ<CDA3><D6B9><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>ʱ<EFBFBD><CAB1> (<28><>λms)
int32_t usage_tick; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>δ<EFBFBD><CEB4><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>VAL(CNT)<29>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>sys.c<><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD> System_RunTask())
float usage_time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC>λΪus<75><73><EFBFBD><EFBFBD>λΪus<75><73><EFBFBD><EFBFBD>λΪus<75><73> (<28><><EFBFBD><EFBFBD><E3B7BD><EFBFBD><EFBFBD>sys.c<><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD> System_RunTask())
float usage_percent; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC>cpu<70>İٷֱ<D9B7> (<28><><EFBFBD><EFBFBD><E3B7BD><EFBFBD><EFBFBD>sys.c<><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD> System_RunTask())
void (*f)(void); // ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>еĺ<D0B5><C4BA><EFBFBD> (<28><>֪<EFBFBD><D6AA><EFBFBD><EFBFBD>ôָ<C3B4><D6B8>sys.c<><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD> System_Init())
}TaskStruct;
TaskStruct task_structs[TASK_NUMBER]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľṹ<C4BD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/**
* @auther whlphlg
* @brief ϵͳ<CFB5><CDB3>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>enable_flag,interval_time,task_priority,f<><66><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD>0
* @changedate 2020.09.13
*/
void System_TaskInit()
{
task_structs[TASK1].enable_flag=1;
task_structs[TASK1].interval_time=500;
task_structs[TASK1].f=task1;
task_structs[TASK2].enable_flag=1;
task_structs[TASK2].interval_time=10000;
task_structs[TASK2].f=task2;
task_structs[TASK3].enable_flag=1;
task_structs[TASK3].interval_time=500;
task_structs[TASK3].f=task3;
task_structs[TASK4].enable_flag=1;
task_structs[TASK4].interval_time=5;
task_structs[TASK4].f=task4;
task_structs[TASK5].enable_flag=1;
task_structs[TASK5].interval_time=5;
task_structs[TASK5].f=task5;
}
/**
* @auther whlphlg
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD> usage_time,usage_percent,<2C>ʹ˺<CDB4><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ε<EFBFBD>total_usage_time
* @changedate 2020.09.13
*/
int32_t total_usage_tick; // <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ˺<C7B4><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD>tick<63><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>debug
float total_usage_time; // <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ˺<C7B4><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD>ʱ<EFBFBD><CAB1>(<28><>λus)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>debug
int32_t total_usage_tick_max_in1s; // total_usage_tick <20><>ij1<C4B3><31><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>ֵ
float total_usage_time_max_in1s; // total_usage_time <20><>ij1<C4B3><31><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>ֵ
void System_TaskRun()
{
int64_t total_begin_tick = SysTick->VAL - get_system_tick()*(SysTick->LOAD+1); // ˼·ͬ<C2B7><CDAC><EFBFBD><EFBFBD> begin_tick
for(uint8_t i=0;i<TASK_NUMBER;i++)
{
if(task_structs[i].ready_flag)
{
task_structs[i].ready_flag--;
// <20><><EFBFBD><EFBFBD> begin_tick <20>Ĺ<EFBFBD>ʽ = <20><> >0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> - <20><>------ <0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-------<2D><> (begin_tick < 0)
int64_t begin_tick = SysTick->VAL - get_system_tick()*(SysTick->LOAD+1);
task_structs[i].f(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> usage_tick <20>Ĺ<EFBFBD>ʽ = <20><>ʼ<EFBFBD><CABC>tick - <20><>---------------<2D><><EFBFBD>ڵ<EFBFBD>tick--------------<2D><>(<28><><EFBFBD><EFBFBD>tick<63><6B><EFBFBD>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʼ<EFBFBD><CABC>tick > <20><><EFBFBD>ڵ<EFBFBD>tick)
task_structs[i].usage_tick = begin_tick - (SysTick->VAL - get_system_tick()*(SysTick->LOAD+1));
// <20><><EFBFBD><EFBFBD> usage_time <20>Ĺ<EFBFBD>ʽ = <20><>-----------usage_tick----------<2D><> / <20><>1ms<6D><73>tick<63><6B><EFBFBD><EFBFBD>--<2D><> * 1000(<28><>λ<EFBFBD><CEBB><EFBFBD>㣬1ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1000us)
task_structs[i].usage_time = (float)task_structs[i].usage_tick / (SysTick->LOAD+1) * 1000.f;
// <20><><EFBFBD><EFBFBD> usage_percent <20>Ĺ<EFBFBD>ʽ = <20><>-----<2D><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>(<28><>λHz)-----<2D><> * <20><>---<2D><><EFBFBD>񵥴<EFBFBD><F1B5A5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>(<28><>λs)----<2D><> * 100(<28><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>%,<2C><><EFBFBD><EFBFBD>*100)
task_structs[i].usage_percent = 1000.f/task_structs[i].interval_time * task_structs[i].usage_time/1000000.f * 100;
}
}
total_usage_tick = total_begin_tick - (SysTick->VAL - get_system_tick()*(SysTick->LOAD+1)); // ˼·ͬ<C2B7><CDAC><EFBFBD><EFBFBD> usage_tick
total_usage_time = (float)total_usage_tick / (SysTick->LOAD+1) * 1000.f; // ˼·ͬ<C2B7><CDAC><EFBFBD><EFBFBD> usage_time
if(total_usage_tick_max_in1s < total_usage_tick)
{
total_usage_tick_max_in1s = total_usage_tick;
}
if(total_usage_time_max_in1s < total_usage_time)
{
total_usage_time_max_in1s = total_usage_time;
}
}
/**
* @auther whlphlg
* @brief ϵͳ<CFB5><CDB3><EFBFBD>£<EFBFBD>ÿ<EFBFBD><C3BF>1ms<6D>ӵδ<D3B5><CEB4><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>жϽ<D0B6><CFBD><EFBFBD>һ<EFBFBD><D2BB> (<28><>stm32f4xx_it.c<><63> System_Update()<29><EFBFBD><EFB1BB><EFBFBD><EFBFBD>)
* ͨ<><CDA8>uwTick,enable_flag,stop_time<6D><65>ֵ<EFBFBD><D6B5>ȷ<EFBFBD><C8B7>ready_flag<61><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD>last_time,stop_time
* ÿ<><C3BF>1000ms<6D><73><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> total_usage_tick_max_in1s <20><> total_usage_time_max_in1s
* @changedate 2020.09.15
*/
void System_TaskUpdate()
{
for(uint8_t i=0;i<TASK_NUMBER;i++)
{
if(task_structs[i].out_time != 0)
{
if(task_structs[i].out_time == 1)
{
Task_InCallback(i); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>лָ<D0BB><D6B8><EFBFBD><EFBFBD>ָ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
}
task_structs[i].out_time--; //<2F><><EFBFBD><EFBFBD> out_time
}
// ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7> ready_flag <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> last_time
if(task_structs[i].enable_flag &&
task_structs[i].out_time == 0 &&
task_structs[i].interval_time<=(get_system_tick()-task_structs[i].last_time))
{
task_structs[i].ready_flag++;
task_structs[i].last_time=get_system_tick();
}
}
if(get_system_tick()%1000 == 0) // ÿ<><C3BF>1000ms<6D><73><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> total_usage_tick_max_in1s <20><> total_usage_time_max_in1s
{
total_usage_tick_max_in1s = total_usage_tick;
total_usage_time_max_in1s = total_usage_time;
}
}
/**
* @auther whlphlg
* @brief <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣһ<CDA3><D2BB>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
* @changedate 2020.09.13
*/
void System_TaskOut(uint8_t task_number,uint32_t stop_time)
{
task_structs[task_number].out_time = stop_time;
Task_OutCallback(task_number);
}
/**
* @auther whlphlg
* @brief <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>رգ<D8B1><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
* @changedate 2020.09.13
*/
void System_TaskDisable(uint8_t task_number)
{
task_structs[task_number].enable_flag = 0;
Task_DisableCallback(task_number);
}
/**
* @auther whlphlg
* @brief <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
* @changedate 2020.09.13
*/
void System_TaskEnable(uint8_t task_number)
{
task_structs[task_number].enable_flag = 1;
Task_EnableCallback(task_number);
}
/**
* @auther whlphlg
* @brief ϵͳǿ<CDB3><C7BF>ͣ<EFBFBD><CDA3>
* @changedate 2020.09.14
*/
void System_AllTaskDisable()
{
while(1)
{
for(uint8_t i=0;i<TASK_NUMBER;i++)
{
task_structs[i].enable_flag = 0;
}
}
}
/**
* @auther whlphlg
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD>ʼ<EFBFBD><CABC>
* @changedate 2021.04.15
*/
void System_SoftWatchDogInit(SoftWatchDogStruct *dog,uint32_t time_load,uint8_t default_state)
{
dog->state = default_state;
dog->time_load = time_load;
dog->time_cnt = dog->time_load;
}
/**
* @auther whlphlg
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>ι<EFBFBD><CEB9>
* @changedate 2021.04.15
*/
void System_SoftWatchDogFeed(SoftWatchDogStruct *dog)
{
dog->state = 1;
dog->time_cnt = dog->time_load;
}
/**
* @auther whlphlg
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>״̬
* @changedate 2021.04.15
*/
void System_SoftWatchDogUpdate(SoftWatchDogStruct *dog)
{
if(dog->time_cnt > 0)
{
dog->time_cnt--;
dog->state = 1;
}
else
{
dog->time_cnt = 0;
dog->state = 0;
}
}
/**
* @auther whlphlg
* @brief <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>״̬
* @changedate 2021.04.15
*/
uint8_t System_GetSoftWatchDogState(SoftWatchDogStruct *dog)
{
return dog->state;
}