定时器作用仅仅是为了进行计时,控制周期。
1)OSInit(); //初始化UCOSII
2)OSTaskCreate(start_task) //创建起始任务
a>创建信号量sem_control和sem_caiji
b>创建任务main_task
创建tmr1自动控制,并开启,周期为5s
tmr2自动采集,并开启,周期为10s,每隔10s采集数据
GUI_task
Modbus_Update();//FreeModbus数据填充更新
usart_task
sem_flag=OSMutexCreate(3,&err)创建485互斥信号量
OSSemPend(sem_caiji,0,&err)请求采集信号量,由软件定时器2周期性释放信号量
tmr2_callback()中释放信号量 ,周期为10s
UpDate();//RS-485请求数据,并更新串口屏
control_task
OSSemPend(sem_control,0,&err);//请求控制信号量,由软件定时器1周期性释放信号量
tmr1_callback()中释放控制信号量 ,周期为5s
layer_control_auto()
c>挂起任务OSTaskSuspend(START_TASK_PRIO)//在OSStart()启动任务调度之前先创建一个任务,并赋予它最高的优先 //级,从而使它成为起始任务,然后在这个起始任务中再创建其他任务。 //如果要使用统计任务,则统计任务的初始化函数也必须在这个起始任务中来调用。
3)
信号量:
信号量用来决定多个任务对某一共享资源的访问权限。比如初始化 OSSemPost的值为3,则最多3个任务占用该共享资源。
当某一个任务想要访问这个资源时。
1、创建信号量,用OSSemCreate函数
OS_EVENT * sem_control处理信号sem_control=OSSemCreate(0)//0代表没有资源可用,等待一个事件或者多个事件的发生
以及OS_EVENT * sem_caiji采集信号sem_caiji=OSSemCreate(0)
2、请求信号量,用 OSSemPend 函数,如果此时OSEventCNT>0,则表示有空闲信号量可以使用,可以申请成功,相应的信号量计数器减1。如果OSEventCNT=0,表示该共享资源已被其他任务占用完,只能等待,等到其他任务解除占用并释放信号量时才能使用。
比如控制任务中:OSSemPend(sem_control,0,&err) //指向信号量指针 0代表永久等待
串口任务中 :OSSemPend(sem_caiji,0,&err)
3、释放信号量,该任务结束占用共享资源时,要用 OSSemPost函数释放信号量。
利用回调函数来释放信号量
void tmr1_callback(OS_TMR *ptmr,void *p_arg)
{
u8 err;
err = OSSemPost(sem_control);//释放控制信号
DEBUG("tmr1 post\r\n");
}
回调函数————————软件定时器(当计数器减到0可以触发某种动作的执行,该动作通过回调函数实现)
创建
OS_TMR * tmr1;//软件定时器1 //自动控制
OS_TMR * tmr2;//软件定时器2 //自动采集
两个任务优先级不同,但是都执行延时操作。都主动放弃CPU,因此可以轮流执行,