请选择 进入手机版 | 继续访问电脑版
快捷导航
本帖最后由 袁绪蝶 于 2017-12-21 09:51 编辑

一、任务管理
1.1 建立任务
建立任务的函数:
OSTaskCreate()
OSTaskCreateExt()

OSTaskCreate()实例:(此代码运行有误!)

1.2 任务堆栈
每个任务都有自己的堆栈空间。
堆栈必须声明为OS_STK类型,并且由连续的内存空间组成。(连续的内存空间组成——数组)
用户可以静态/动态分配堆栈空间。

静态分配堆栈
static OS_STK  TaskStack[stack_size];
或  
OS_STK  TaskStack[stack_size];

动态分配堆栈
OS_STK  *pstk;
pstk = (OS_STK *)malloc(stack_size);
if (pstk != (OS_STK *)0) {            /* 确认malloc()能得到足够地内存空间 */
    Create the task;
}
堆栈向下递减
当OS_CPU.H文件中的OS_STK_GROWTH置为1时,用户需要将堆栈的最高内存地址传递给任务创建函数。
堆栈向上增长
当OS_CPU.H文件中 的OS_STK_GROWTH置为0时,用户需要将堆栈的最低内存地址传递给任务创建函数


1.3 任务删除
任务删除OSTaskDel()
删除任务,是说任务将返回并处于休眠状态,并不是说任务的代码被删除了,只是任务的代码不再被µC/OS-Ⅱ调用。

请求删除任务OSTaskDelReq()
如果任务A拥有内存缓冲区或信号量之类的资源,而任务B想删除该任务,这些资源就可能由于没被释放而丢失。
在这种情况下,用户可以想法子让拥有这些资源的任务在使用完资源后,先释放资源,再删除自己。

1.4 改变任务优先级
OSTaskChangePrio()
在程序运行期间,用户可以通过调用 OSTaskChangePrio()来改变任务的优先级。
µC/OS-Ⅱ允许用户动态的改变任务的优先级。

1.5 挂起任务
挂起任务OSTaskSuspend()
就是任务由就绪态或运行态转变为挂起态;
任务可以挂起自己或其他任务;
不能挂起空闲任务。

挂起前任务状态
——挂起正在运行的任务:
如果挂起调用本函数OSTaskSuspend()的任务,需要调用任务调度函数。
——挂起就绪状态的任务:
从就绪表中移除该任务。
——挂起挂起状态的任务:
要被挂起的任务不在就绪表中,因为它有可能在等待事件的发生或延时的期满;没有检验该位而直接从就绪表中移除。
——现在,OSTaskSuspend()就可以在任务的OS_TCB中设置OS_STAT_SUSPEND标志了,以表明任务正在被挂起。

1.6 恢复任务
恢复任务OSTaskResume()
要恢复的任务必须是存在的,因为用户要需要操作它的任务控制块OS_TCB;
该任务必须是被挂起的。

恢复任务操作:
——通过清除OSTCBStat域中的OS_STAT_SUSPEND位来取消挂起;
——要使任务处于就绪状态的条件:
OS_TCBDly域必须为0
OSTCBStat中任务状态为RDY;
——改变就绪状态时,需调用任务调度函数(任务调度函数:OS_Sched()??)
1.7 获得任务信息
OSTaskQuery()
实际上,OSTaskQuery()获得的是对应任务的OS_TCB中内容的拷贝。
本函数是有用的调试工具。



**************************************************************************************************************************************************
二、延时函数
1 任务延时函数
OSTimeDly()
µC/OS-Ⅱ提供了这样一个系统服务:申请该服务的任务可以延时一段时间,这段时间的长短是用时钟节拍的数目来确定的;
任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态;
只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。

2 按时分秒延时函数

OSTimeDlyHMSM()
用户就可以按小时(H)、分(M)、秒(S)和毫秒(m)来定义时间



3 恢复延时的任务

OSTimeDlyResume()
µC/OS-Ⅱ允许用户结束延时正处于延时期的任务。延时的任务可以不等待延时期满,而是通过其它任务取消延时来使自己处于就绪态。
在这种情况下,等待事件发生的任务会考虑是否终止等待事件。

4 系统时间

OSTimeGet()
获得计数器的当前值;


OSTimeSet()
改变计数器的值。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.

共 0 个关于本帖的回复 最后回复于 2017-12-20 21:29

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2019-2-16 20:15