而周期性任务的结构如下:
void MyTask (void *pdata) //周期性执行的任务函数
{
进行准备工作的代码
for () //无限循环,也可用 while (1)
{
任务实体代码
OSTimeDly( )
}
}
有四个周期性执行的任务,任务A(优先级=0)、任务B(优先级=1)、任务C(优先级=2)、任务D(优先级=3)
如果每个任务的延时节拍时间OSTimeDly( )设置的不合理,可能会导致永远也执行不到“任务D”
有没有设置“延时节拍时间OSTimeDly( )”的一般方法呢?
1、你调用OSTimeDly或者OSTimeDlyHMSM,意味着该任务CPU使用权会被没收,然而你开启一个定时器之后,该任务还可以使用CPU。2、举例子:如下情景,可以使用软件定时器作超时处理,设备A管理设备B、C、E,设备A向设备BCE设备发送某一消息,如果在T时间内,设备BCE没有回应,设备A将重起并初始化BCE;那么可以在一个任务中,依次向BCE发送消息,并且启动软件动定时器TMRa,TMRb,TMRc,定时器时间到时调用各自的重起并初始化函数;另一方面,如果接收到BCE的消息则停止定时器TMRa,TMRb,TMRc。
3、然而如果用OSTimeDly或者OSTimeDlyHMSM处理上面的场景,可能要多开几个任务管理BCE并增加信号量通知OSTimeDly或者OSTimeDlyHMSM之后,到底是“重起并初始化BCE”还是什么都不做。
4、软件定时器和延时都是基于“系统的节拍”来计时/定时的,虽然软件定时器是在一个高优先级的任务中管理,这个任务也是由“系统节拍中断“中向其发送信号量,因此还是基于“系统的节拍”。
5、没必要去对它们的区别做出一个定义,关键还是去理解它们的应用场合,它们都能解决什么问题。
你把OS_TICKS_PER_SEC设置为50,那说明你的延时钟节拍为20ms.那你需要检查一下系统PLL相关设置是否正确,以及定时器的延时设置是否正确。如果,有问题可以把程序发到我的邮箱corner520@hotmail.com.我可以帮你检查一下。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)