UCOSII到底咋玩

定时器作用仅仅是为了进行计时,控制周期。

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,因此可以轮流执行,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值