uc/os-II 分析 (3)

10 篇文章 1 订阅
10 篇文章 0 订阅

3.uc、os-II管理调度函数

1)任务的创建

任务是由控制块来管理的,因此任务的创建就是创建一个控制块,并通过控制块来把任务代码和任务堆栈关联起来形成一个完整的任务。并把新创建的任务进入就绪状态,引入一次任务调度。

用函数OSTaskCreate()创建任务,函数原型:

INT8U    OSTaskCreate(  void (*task)(void  *pd),     //指向任务的指针

  void *pdata,      //传递给任务的参数

OS_STK  *ptos,               //指向任务堆栈栈顶的指针

  INT8U  prio);               // 任务的优先级

函数的工作过程:先判断优先级是否合法,合法则初始化任务堆栈,获得并初始化任务控制块,成功对任务计数器加1, 执行任务调度,如果失败则放弃任务。


用函数OSTaskCreateExt()创建任务,函数原型:

INT8U   OSTaskCreateExt(  void  (*task)( void * *pd),   //指向任务的指针

    void  *pdata,                        //  传递给任务的参数

    OS_STK  *ptos,                 //  指向任务堆栈栈顶的指针

  INT8U  prio,     //  任务的优先级

INT16U  id,      //  任务的标识

OS_STK  *pbos,     //  任务堆栈栈底的指针

INT32U   stk_size,     //任务堆栈的容量

void *pext,    //指向附加数据域的指针

INT16U   opt   // 用于设定操作选项

);

可以通过函数OSTaskCreateExt()来创建任务更加灵活,但是也会增加一些额外的开销。


任务创建完成以后,该任务就会在任务就绪表处于就绪状态,需要使用OSStart()进行任务调度;


2)创建任务的一般方法:

任务一种是在调用OSStart()之前调用,一种是在任务中进行创建;

必须在OSStart()之前创建一个最高级的任务,成为起始任务1,在这个起始任务1中再创建其他各任务2;注意:不允许在中断任务中创建任务2。统计任务可以在任务2

中调用;

3) 任务的挂起

uc/os-II 中用户任务可以通过调用系统函数OSTaskSuspend()来挂起自身或除空闲任务之外的其他任务。该任务必须用OSTaskResume()来恢复。

函数原型:  INT8U     OSTaskSuspend(INT8U  prio);

挂起自身:prio必须为OS_PRIO_SELF;

函数调用成功时,返回信息OS_NO_ERR;出错会返回OS_TASK_SUSPEND_IDLE, OS_PRIO_INVALID,OS_TASK_SUSPEND_PRIO等。

4).恢复任务

函数原型:INT8U   OSTaskResume(INT8U  prio);   prio:待恢复任务的优先级别;


5)任务优先级的修改

任务的优先级不是一成不变的,在程序运行过程中,任务可以调用函数OSTaskChangePrio()来改变任务的优先级别:

函数OSTaskChangePrio()原型:

INT8U   OSTaskChangePrio(INT8U   oldprio,      //  任务现在的优先级别

INT8U   newprio);       //要修改的优先级别

6)任务的删除

删除一个任务,就是把任务置于睡眠状态。做法:把被删除任务的任务控制块从任务控制块链表中删除,并归还给空任务控制块链表,任务在任务就绪表中把该任务就绪状态位置0,那么该任务就不会被调度器调用了。

函数的

INT8U   OSTaskDel(INT8U  prio);

注意:  提出删除请求的任务只负责提出请求,删除工作由被删除任务自己来完成。

请求任务和删除任务之间的通信,必要用OSTaskDelReq(INT8U  prio);


7) uc/os-II的初始化

通过调用OSInit()来对自身环境进行初始化。对所有全局变量和数据结构初始化,同时创建空闲任务OSTaskIdle,并赋予最低的优先级和永远的就绪状态。对数据结构的初始化,主要是创建包括空任务控制块链表在内的5个空数据缓冲区。同时,为了可以快速第查询任务控制块链表中的各个元素,初始化函数OSInit()还要创建一个数组OSTCBPrioTbl[OS_LOWEST_PRIO + 1],在该数组中按照任务优先级的顺序把任务控制块的指针存放在对应的元素中。


8)任务的启动

通过调用OSStart()来启动任务管理。前提条件是调用该函数之前至少创建一个用户任务。




思考:linux为多进程并发运行,多线程也是并发进行,一般不能确定谁先指向;

uc/os-II是按照优先级顺序执行,创建任务先后顺序先后执行,还是按照优先级的先后运行过程中调度任务?对于进程管理中的同步和互斥是在什么样的场景下?如何来操作完成?

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值