本帖最后由 tpgf 于 2023-10-17 15:42 编辑
1、概述
在设计MCU裸机程序时候,一般而言需要设计一个1ms的Tick,作为系统时钟。同时在任务调度时候设置好2ms任务,5ms任务,10ms任务等根据实际的需求设计的任务调度。但是会出现一种情况,其中的一个任务占用时间过大,此时就需要将该任务做拆分,通过时间偏差来解决该问题。
2、设计方法
2.1 任务时间标志置位
void SysTime_1mS(void)
{
static uint8 timerTick = 0;
timerTick ++;//中断1ms计时
if((timerTick % 5) == 1)
{
g_SysTimeStatus.BITS.Task5msFlag = 1;
}
if((timerTick % 10) == 4)
{
g_SysTimeStatus.BITS.Task10ms_0Flag = 1;
}
if((timerTick % 10) == 3)
{
g_SysTimeStatus.BITS.Task10ms_5Flag = 1;
}
if((timerTick % 20) == 8)
{
g_SysTimeStatus.BITS.Task20msFlag = 1;
}
if(timerTick >= 200)
{
timerTick = 0;
}
else
{
//do nothing
}
}
2.2 任务时间标志清楚,在任务调度时候清除掉,保证一个周期只进入一次。
int main(void)
{
EcuM_Init();
#if (1 == SEC_ENABLE)
Boot_DebugPort(0);
#endif
StartupHook();
Os_TaskEntry_OsTask_Init();
while (1)
{
if(1 == g_SysTimeStatus.BITS.Task5msFlag)
{
//g_SysTimeStatus.BITS.Task5msFlag = 0;//放置在前面,防止在任务超时时候,任务被跳过
Os_TaskEntry_OsTask_5ms();
g_SysTimeStatus.BITS.Task5msFlag = 0;
}
if(1 == g_SysTimeStatus.BITS.Task10ms_0Flag)
{
g_SysTimeStatus.BITS.Task10ms_0Flag = 0;
}
if(1 == g_SysTimeStatus.BITS.Task10ms_5Flag)
{
g_SysTimeStatus.BITS.Task10ms_5Flag = 0;
Os_TaskEntry_OsTask_10ms();
//g_SysTimeStatus.BITS.Task10ms_5Flag = 0;
}
if(1 == g_SysTimeStatus.BITS.Task20msFlag)
{
//g_SysTimeStatus.BITS.Task20msFlag = 0;
Os_TaskEntry_OsTask_20ms();
g_SysTimeStatus.BITS.Task20msFlag = 0;
}
IdleHook_Core1();
}
return 0;
}
3、设计调度时间表
4、以上,就是针对MCU逻辑设计的任务调度。
————————————————
版权声明:本文为CSDN博主「猴哥取经」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37634871/article/details/133855211
|