|
uC/OS-II中,任务有三种类型:
(1)、单次执行的任务
此类任务在创建后只执行一次,执行结束后即自行删除
void MyTask (void *pdata) //单次执行的任务函数
{
进行准备工作的代码;
任务实体代码;
调用任务删除函数; //调用 OSTaskDel(OS_PRIO_SELF)
}
(2)、周期性执行任务
此类任务在创建后按一个固定的周期来执行,其任务函数的结构如下:
void MyTask (void *pdata) //周期性执行的任务函数
{
进行准备工作的代码;
for (;;) //无限循环,也可用 while (1)
{
任务实体代码;
调用系统延时函数; //调用 OSTimeDly( )或 OSTimeDlyHMSM( )
}
}
(3)、事件触发执行的任务
相关事件发生一次,该任务实体代码就执行一次,故该类型任务称为事件触发执行的任务,其任务函数的结构如下
void MyTask (void *pdata) //事件触发执行的任务函数
{
进行准备工作的代码;
for (;;) //无限循环,也可用 while (1)
{
调用获取事件的函数; //如:等待信号量、等待邮箱中的消息等等。
任务实体代码;
}
}
我现在遇到一个问题,想把前后台这样在段代码移植到uC/OS-II中。
在前后台中,有三个函数,分别实现“输出指令”的计算。
(1)、函数1
用于控制器正常调节时,通过PID控制,计算阀门的输出指令,去控制阀门的开度。
(2)、函数2
当出现异常情况时(检测到某一个开关量信号),立即紧急关闭阀门,即:强制输出指令等于0
同时,必须要强制“输出指令=0”连续维持3秒,才能确保管道中的蒸汽压力不会继续升高。
(3)、函数3
处理报警和报警回差
当(管道中的蒸汽压力 > 报警值),立即紧急关闭阀门,即:强制输出指令等于0
同时,只要(管道中的蒸汽压力 > 报警值),就一直关闭阀门(强制输出指令等于0)
当检测到(管道中的蒸汽压力 < 回差值),就恢复正常调节。
我想把上述前后台三个函数,写到一个任务中,但是好象感觉有点困难, 困惑如下:
(A)、由于正常调节时,需要不停的计算阀门的开度,这时应该使用“周期性执行任务”
但是如何在这个周期性执行任务中如何体现如下两种特殊情况:
(B)、当出现异常情况时(检测到某一个开关量信号),立即紧急关闭阀门,即:强制输出指令等于0 同时,必须要强制“输出指令=0”连续维持3秒。
此时不知道该如何处理。
(C)、 当(管道中的蒸汽压力 > 报警值),立即紧急关闭阀门,即:强制输出指令等于0 , 同时,只要(管道中的蒸汽压力 > 报警值),就一直关闭阀门(强制输出指令等于0) 当检测到(管道中的蒸汽压力 < 回差值),就放弃特殊情况的执行,开始执行函数1.
此时不知道该如何处理。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|