RTOS任务

3. 任务
    3.1 任务定义:任务是一个可执行的程序单元。
    
    3.2 任务特性:动态性,独立性,并发性
    
        3.1.1 动态性:CPU资源并没有一直占用。与裸机的程序模块本质的区别。
            1)就绪态(等待CPU)
            2)运行态(占用CPU)
            3)等待态(释放CPU)
            
        3.1.2 独立性:
            1)单独的个体。逻辑上与其他可执行程序单元(task,isr)平等。
        
        3.1.3 并发性:
            1)感觉每个任务都拥有自己的CPU资源
            2)单CPU系统不可能是真正的并发,因为同一时间只能有一个程序单元运行,故为伪并发


    3.3 任务分类:单次执行的任务,周期执行的任务,事件触发的任务。        
    
        3.3.1 单次执行的任务:
            1)任务创建后只执行一次,执行结束后立即将自己删除。
            2)举例一:启动任务
                void main(void)
                {
                    OSInit();
                    OSTaskCreat(StartTask, NULL, &StartTaskStk[TASK_STK_SIZE - 1], 1);
                    OSStart();
                }
                
                void StartTask(void * pdata)
                {
                    初始化硬件资源        //中断、时钟、外设
                    创建各任务            //采集任务、处理任务、显示任务、通讯任务等
                    创建各种通讯工具    //信号量、消息邮箱、消息队列、事件标志组等
                    
                    删除自己            //OSTaskDel()
                    
                }
                
            【批注】创建启动任务后删除,浪费了系统资源,故一般初始化工作交给一个有实质的用户任务来完成。
            
            
            3)举例二:按键任务检测到发送按键、则创建发送任务,发送任务执行完成在删除自己
            【批注】该任务对实时性要求不高,且该任务为孤立任务(与其他任务没有行为同步、资源同步),否则容易出异常。

        3.3.2 周期执行的任务
            1)举例一:
                void StartTask(void * pdata)
                {
                    初始化

                    while (1) {
                        任务实体代码
                    
                        调用系统延时函数    //OSTimeDlyHMSM();或者OSTimeDly();
                    }
                    
                }        
                
            2)用于执行周期远大于系统节拍时间。
            3)若执行周期只要一个或几个系统节拍,故该任务功能可以发到节拍钩子函数OSTimeTickHook()去做。
            4)若执行周期小于系统节拍或不是系统节拍的整数倍,则该任务功能可以放到定时中断去做。
            
            【批注】多任务系统中,用户任务必须至少一次调用系统服务函数接口,否则低优先级则无法得到运行的机会(高优先级可以通过中断触发后重新任务调度而得到运行)。
        
        
        3.3.3 事件触发的任务
            1)举例一:
                void StartTask(void * pdata)
                {
                    初始化
                    
                    while (1) {
                        获取事件函数        //等待信号量、消息邮箱、消息队列、事件标志组等
                    
                        任务实体代码
                    }
                    
                }    
                
            2)获取事件函数,因获取不到事件而挂起进入等待状态,例如:信号类:OSSemPend(Sem, 0, &err); 消息类:OSMboxPend(Mbox, 0, &err);
            3)该事件由其他可执行程序单元(task、isr)发送,例如:OSSemPost(Sem);

            
            KUI 20170917
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RTOS(Real-Time Operating System)任务调度是实时操作系统中非常重要的一部分,它负责协调多个任务的执行,使得它们能够按照一定的优先级、时间片或其他算法在 CPU 上运行。RTOS 任务调度的实现方式可以分为两种:抢占式和非抢占式。 1. 抢占式任务调度 抢占式任务调度是指当一个优先级更高的任务就绪时,它可以抢占当前正在运行的任务并立即执行。在抢占式任务调度中,每个任务都有一个优先级,调度器会根据任务的优先级来决定其执行顺序。当一个高优先级任务就绪时,调度器会立即抢占当前正在执行的任务并执行高优先级任务。抢占式任务调度实现的关键在于中断处理,当一个中断发生时,调度器会暂停当前正在执行的任务并执行中断服务程序,然后在中断服务程序执行完毕后恢复原来的任务继续执行。 2. 非抢占式任务调度 非抢占式任务调度是指任务只有在自己执行完毕或主动放弃 CPU 时才会被其他任务抢占。在非抢占式任务调度中,每个任务也有一个优先级,但是任务的执行顺序只能由任务本身控制。当一个任务执行完毕或主动放弃 CPU 时,调度器会根据任务的优先级来选择下一个任务执行。非抢占式任务调度实现的关键在于任务的协作,每个任务需要在执行过程中主动让出 CPU,以便其他任务得到执行的机会。 无论是抢占式还是非抢占式任务调度,都涉及到任务的上下文切换,即保存当前任务的上下文,以便在任务再次执行时恢复其状态。上下文切换需要保存任务的 CPU 寄存器、堆栈指针等信息,并修改当前任务的状态(如就绪、阻塞等),然后切换到下一个任务的上下文。任务的上下文切换是一个比较耗时的操作,因此在任务调度的实现中需要尽量减少上下文切换的次数,提高任务的执行效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值