RTOS任务

本文介绍了嵌入式系统中任务的基本概念,包括任务的定义、特性及其分类,并通过实例详细阐述了单次执行任务、周期执行任务及事件触发任务的特点与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值