yanshanbao 发表于 2012-3-8 22:55:43

第七天 UC/OS-II的学习

第七天
任务管理 主要是:应用程序中建立程序、删除任务、改变任务的优先级、挂起和恢复任务、获得任务的信息。
1.        建立任务 OSTaskCreate()
1.1        任务可以再多任务调度刚开始时建立,也可以在其他任务运行的时候建立。
1.2        在启动之前,即OSStart()函数之前,必须建立一个任务。
1.3        任务不能由ISR建立。OStaskCreate()函数代码如下:
1.4        建立任务函数传递四个参数 task :任务代码的指针
Pdata : 当任务开始执行时传递给任务的参数的指针
Ptos : 分配给任务的堆栈的栈顶指针
Prio : 分配给任务的优先级
              如:OSTaskCreate(Task1,(void*)0,&Task1Stk,3); //传递task1, 无参数指针,栈顶指向Task1Stk, 优先级是3.
1.5        MCS-51单片机堆栈是从下往上涨的,所以OS_STK_GROWTH = 0;
1.6        OSTaskStkInit()函数完成建立堆栈的任务。
2.        建立任务 OSTaskCreateExt()
2.1        需要9个参数。id 优先级标号 未来扩展
Pbos : 指向任务栈底的指针,用于堆栈的检验
Stk_size : 指定堆栈队员的数目
Pext : 指向用户附加的数据域的指针
Opt:设定OSTaskCreateExt()的选项,是否允许堆栈检验、将堆栈清零、是否要进行浮点操作等。
3.        任务堆栈
3.1        堆栈必须声明为OS_STK类型,由连续的内存空间组成。可以静态分配(如:         static OS_STK MYTaskStack; 或者 OS_STK MYTaskStack;),也可动态分配。 (用 malloc() 函数分配,但是会产生内存碎片)
3.2        注意堆栈的增长方向,在创建时OSTaskCreate()时,堆栈的起始地址是不同的。
4.        检验堆栈 OSTaskStkChk()
4.1        在堆栈检验时,要求在任务建立的时候堆栈中存储的是0,即被清零。
4.2        UC/OS-II需要知道堆栈栈底和堆栈的大小。 都存在了OS_TCB中。
5.        删除堆栈 OSTaskDel()
5.1        不能删除空闲任务。不能再ISR中删除一个任务。
5.2        参数是优先级。
6.        请求删除任务 OSTaskDelReq()
用于删除一个占有系统资源的任务。在删除任务之前需要先施放任务占用的系统资源。
7.        改变任务的优先级 OSTaskChangePrio()
7.1        允许用户动态改变优先级。但不能改变空闲任务的优先级。
8.        挂起任务 OSTaskSuspend()【suspend是悬浮 暂停的意思】
8.1 被挂起的任务只能通过调用OSTaskResume()函数来恢复。
9.恢复任务OSTaskResume()
10.获得任务的信息 OSTaskQuery()
10.1 获得的是对应任务的OS_TCB中内容的拷贝。
10.2 是有用的 调试工具。不要试图改变里面的指针。

燕山大学 电气工程学院 09级检测技术与仪器

Mentor 发表于 2012-3-8 22:58:23

真羡慕楼主这么坚持! 我学习的就没这么顺利!  


打算学习UCOS中!  顶起! 

fbihjp 发表于 2012-3-9 00:07:19

顶一下

zhikai_wu 发表于 2012-3-9 08:19:21

不错

leijiayou 发表于 2012-3-9 08:34:09

顶!!!

bravejt1 发表于 2012-4-7 15:00:33

精神可嘉,坚持就是胜利,而且总结也很好。
问下楼主,我在一个任务(非需要删除的)中执行OSTaskSuspend(INT8U prio),再执行OSTaskResume(INT8U prio)能使任务恢复,但是先执行OSTaskDel (INT8U prio)再执行OSTaskResume(INT8U prio)却不行,能帮忙解释下吗?
页: [1]
查看完整版本: 第七天 UC/OS-II的学习