任务挂起和恢复实验-动力电池管理系统保护方案
6.2任务挂起和恢复实验6.2.1 OSTaskSuspend()函数有时候有些任务因为某些原因需要暂停运行,但是以后还要运行,因此我们就不能删除掉任务,这里我们可以使用OSTaskSuspend()函数挂起这个任务,以后再恢复运行,函数OSTaskSuspend()的原型如下: void OSTaskSuspend (OS_TCB *p_tcb,OS_ERR *p_err) *p_tcb :指向需要挂起的任务的OS_TCB,可以通过指向一个NULL指针将调用该函数的任务挂起。 *p_err:指向一个变量,用来保存该函数的错误码。我们可以多次调用OSTaskSuspend ()函数来挂起一个任务,因此我们需要调用同样次数的OSTaskResume()函数才可以恢复被挂起的任务,这一点非常重要。 6.2.2 OSTaskResume()函数用来恢复被OSTaskSuspend()函数挂起的任务,OSTaskResume()函数是唯一能恢复被挂起任务的函数。如果被挂起的任务还在等待别的内核对象,比如事件标志组、信号量、互斥信号量、消息队列等,即使使用OSTaskResume()函数恢复了被挂起的任务,该任务也不一定能立即运行,该任务还是要等相应的内核对象,只有等到内核对象后才可以继续运行,OSTaskResume()函数原型如下: void OSTaskResume (OS_TCB *p_tcb,OS_ERR *p_err) *p_tcb :指向需要解挂的任务的OS_TCB,指向一个NULL指针是无效的,因为该任务正在运行,不需要解挂。 *p_err:指向一个变量,用来保存该函数的错误码。 6.2.3实验程序设计例6-2:本实验是在例6-1的基础上完成的,本实验同样设计了3个任务,任务A用于创建其他任务,创建完成以后就删除掉自身,任务B和任务C在LCD上有各自的运行区域,每隔1s他们都会切换一次各自运行区域的背景颜色,而且显示各自的运行次数,任务B运行5次以后挂起任务C,当任务B运行10次以后重新恢复任务C,两个任务运行的过程中还要通过串口打印各自的运行次数,当任务B挂起和恢复任务C以后也要通过串口打印提示信息。答:程序部分代码如下,完整工程请参考我们“例6-2 UCOSIII任务挂起和恢复” //task1任务函数void task1_task(void *p_arg) { u8 task1_num=0; OS_ERR err; CPU_SR_ALLOC(); p_arg = p_arg; POINT_COLOR = BLACK; OS_CRITICAL_ENTER();
5.07MB
文件大小:
评论区