TASK(OsTask_BSW)
{
/* Box: Implicit Buffer Initialization begin */
/* Box: Implicit Buffer Initialization end */
/* Box: Implicit Buffer Fill begin */
/* Box: Implicit Buffer Fill end */
/* Box: BSWImpl1_Xcp begin */
if ( Rte_RECount_OsTask_BSW_divby500_0 == ((VAR(uint16, AUTOMATIC))0U) )
{
Xcp_EventChannel_500msRstr();
}
/* Box: BSWImpl1_Xcp end */
{
/* Box: BSWImpl4_BSWIMPL_Can begin */
Can_MainFunction_Write();
/* Box: BSWImpl4_BSWIMPL_Can end */
}
{
/* Box: BSWImpl4_BSWIMPL_Can begin */
Can_MainFunction_Read();
/* Box: BSWImpl4_BSWIMPL_Can end */
}
/* Box: BSWImpl14_CanSM begin */
if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
{
CanSM_MainFunction();
}
/* Box: BSWImpl14_CanSM end */
/* Box: BSWImpl3_Com begin */
if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
{
Com_MainFunctionTx();
}
/* Box: BSWImpl3_Com end */
{
/* Box: BSWImpl4_BSWIMPL_Can begin */
Can_MainFunction_BusOff();
/* Box: BSWImpl4_BSWIMPL_Can end */
}
{
/* Box: BSWImpl13_CanTp begin */
CanTp_MainFunction();
/* Box: BSWImpl13_CanTp end */
}
/* Box: BSWImpl12_MemIf begin */
if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
{
MemIf_Rb_MainFunction();
}
/* Box: BSWImpl12_MemIf end */
/* Box: BSWImpl1_Xcp begin */
if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
{
Xcp_MainFunction();
}
/* Box: BSWImpl1_Xcp end */
/* Box: BSWImpl10_BSWIMPL_BswM begin */
if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
{
BswM_MainFunction();
}
/* Box: BSWImpl10_BSWIMPL_BswM end */
/* Box: BSWImpl11_EcuM begin */
if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
{
EcuM_MainFunction();
}
/* Box: BSWImpl11_EcuM end */
/* Box: BSWImpl9_CanNm begin */
if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
{
CanNm_MainFunction();
}
/* Box: BSWImpl9_CanNm end */
{
/* Box: BSWImpl8_Dcm begin */
Dcm_MainFunction();
/* Box: BSWImpl8_Dcm end */
}
/* Box: BSWImpl1_Xcp begin */
if ( Rte_RECount_OsTask_BSW_divby250_0 == ((VAR(uint8, AUTOMATIC))0U) )
{
Xcp_EventChannel_250msRstr();
}
/* Box: BSWImpl1_Xcp end */
{
/* Box: BSWImpl7_Dem begin */
Dem_MainFunction();
/* Box: BSWImpl7_Dem end */
}
/* Box: BSWImpl6_NvM begin */
if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
{
NvM_MainFunction();
}
/* Box: BSWImpl6_NvM end */
/* Box: BSWImpl1_Xcp begin */
if ( Rte_RECount_OsTask_BSW_divby100_0 == ((VAR(uint8, AUTOMATIC))0U) )
{
Xcp_EventChannel_100msRstr();
}
/* Box: BSWImpl1_Xcp end */
/* Box: BSWImpl5_BSWIMPL_FiM begin */
if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
{
FiM_MainFunction();
}
/* Box: BSWImpl5_BSWIMPL_FiM end */
{
/* Box: BSWImpl4_BSWIMPL_Can begin */
Can_MainFunction_Mode();
/* Box: BSWImpl4_BSWIMPL_Can end */
}
/* Box: BSWImpl3_Com begin */
if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
{
Com_MainFunctionRx();
}
/* Box: BSWImpl3_Com end */
/* Box: BSWImpl2_ComM begin */
if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
{
ComM_MainFunction_ComMChannel_Can_Network_Channel();
}
/* Box: BSWImpl2_ComM end */
/* Box: BSWImpl1_Xcp begin */
if ( Rte_RECount_OsTask_BSW_divby1000_0 == ((VAR(uint16, AUTOMATIC))0U) )
{
Xcp_EventChannel_1kmsRstr();
}
/* Box: BSWImpl1_Xcp end */
/* Box: Implicit Buffer Flush begin */
/* Box: Implicit Buffer Flush end */
if ( Rte_RECount_OsTask_BSW_divby10_0 != ((VAR(uint8, AUTOMATIC))0U) )
{
Rte_RECount_OsTask_BSW_divby10_0--;
}
else
{
Rte_RECount_OsTask_BSW_divby10_0 = ((VAR(uint8, AUTOMATIC))9);
}
if ( Rte_RECount_OsTask_BSW_divby100_0 != ((VAR(uint8, AUTOMATIC))0U) )
{
Rte_RECount_OsTask_BSW_divby100_0--;
}
else
{
Rte_RECount_OsTask_BSW_divby100_0 = ((VAR(uint8, AUTOMATIC))99);
}
if ( Rte_RECount_OsTask_BSW_divby250_0 != ((VAR(uint8, AUTOMATIC))0U) )
{
Rte_RECount_OsTask_BSW_divby250_0--;
}
else
{
Rte_RECount_OsTask_BSW_divby250_0 = ((VAR(uint8, AUTOMATIC))249);
}
if ( Rte_RECount_OsTask_BSW_divby500_0 != ((VAR(uint16, AUTOMATIC))0U) )
{
Rte_RECount_OsTask_BSW_divby500_0--;
}
else
{
Rte_RECount_OsTask_BSW_divby500_0 = ((VAR(uint16, AUTOMATIC))499);
}
if ( Rte_RECount_OsTask_BSW_divby1000_0 != ((VAR(uint16, AUTOMATIC))0U) )
{
Rte_RECount_OsTask_BSW_divby1000_0--;
}
else
{
Rte_RECount_OsTask_BSW_divby1000_0 = ((VAR(uint16, AUTOMATIC))999);
}
TerminateTask();
} /* OsTask_BSW */
假如我把很多Runable放到同一个Task中去调度, 虽然它们确实可以按不同周期调度, 但是这样做有什么缺点?
-
它们是需要按顺序执行的,比如EcuM_MainFunction();
和CanNm_MainFunction()执行周期都是10ms, 那么Rte_RECount_OsTask_BSW_divby10_0-- == 0时
EcuM_MainFunction()先于CanNm_MainFunction()执行,如果EcuM_MainFunction()中有的步骤依赖于CanNm_MainFunction(),需要CanNm_MainFunction()先执行呢?所以这些Runable放置的positon需要仔细考虑。 -
如果CanNm_MainFunction()中在等待某个状态或者返回结果, 或者说比如获取互斥量(需要等待时间或者需要阻塞), 那么整个Task就被阻塞了(等待N个ticks或者直接从就绪链表中移除, 不再参与调度),后面的Runable不能继续执行。这样的话就不能发挥RTOS的优势之一,即多任务切换, 合理利用CPU。
比如CanNm_MainFunction()中有类似
freertos - xSemphrWait(&sem, MAX_DELAY)这种操作,
如果这步没有获取到信号量, TASK将永远阻塞, 让出CPU使用权, 其他TASK仍然可以被调度,只有其他TASK或中断调用xSemphrSend(&sem)就会将这个阻塞的TASK重新加入就绪链表(如果它优先级高于当前正在运行的TASK,它会立即被调度),
所以从合理利用CPU使用率的角度,也不太应该把多个Runables放到同一个TASK。
当然也可在一个TASK中所有Runable中没有需要阻塞和等待的操作(如CanNm_MainFunction()等等),那么上述第二点就不存在。但总归来说还是应仔细考虑Runables和TASK的mapping