|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2014-7-28 22:59:28
|
显示全部楼层
不好意思,183楼的回复有误,误导了你.
实际上只支持嵌套一级子函数,原因如下,注释部分:
- //任务内调用子任务
- #define SCHTaskCallSub(SubTaskName) \
- { \
- {SchLc=SCH_CURR_LINE;pCurTCB->TimeCounter=SCH_TASK_RUN;}return;case SCH_CURR_LINE: \ //调用子函数将任务设置为运行状态,然后返回,下次进来直接运行.先返回是为了释放CPU,避免主任务运行一段时间后又接着运行子函数,占用时间过长.
- pCurTCB->TimeCounter = SCH_TASK_RUN; \
- SubTaskName(); \
- if (pCurTCB->TimeCounter != SCH_TASK_RUN) \ //如果子函数没有运行结束,则直接返回,但判断条件是"pCurTCB->TimeCounter != SCH_TASK_RUN",如果再调用一级子函数,又会执行"TimeCounter=SCH_TASK_RUN"
- //则这里主任务就就会判断为第一个子函数已经运行结束(实际上没有运行完).从而导致得不到想要的效果.
- return ; \
- }
复制代码
其实不建议嵌套那么多带等待条件的子函数,最好做法是:主任务利用状态机思想(例程格式就是状态机)将任务分为多个状态,分时执行,从而提高效果,子函数就是各个状态对应要完成的事情(无延时或等待,一次执行到结束).
如你的例子改成下面的格式:
void vTest(void)
{
SCHTaskBegin();
while (1)
{
fun1();//状态1要完成的事务
//延时或等待消息
fun2();//状态2要完成的事务
//延时或等待消息
fun3();//状态3要完成的事务
//延时或等待消息
}
SCHTaskEnd();
} |
|