Chinaunix首页 | 论坛 | 博客
  • 博客访问: 303763
  • 博文数量: 85
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 800
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-18 15:21
文章分类

全部博文(85)

文章存档

2017年(1)

2016年(19)

2015年(55)

2014年(10)

我的朋友

分类: 嵌入式

2014-11-02 16:34:51

在ucos系统中,一个任务通常是一个无限循环。

下面引用一段话:


在ucos II 世界里,任务就是一个大箩筐,框着一个或者好多好多的函数。CPU呢,像个大美女呢,总是从一个大箩筐跳到另一个大箩筐,其实明眼的人都知道,CPU这么跳来跳去为得是什么,为得就是找大帅哥,看到哪个大箩筐里帅哥更帅(优先级更高),CPU就立马跳到那个大箩筐。美女都好色!

我们知道,CPU总是不断地在各个任务间切换,为了下次跳回来, CPU在跳走的同时,要保护好现场,这时我们就需要用到堆栈了。

 所以每当我们创建一个任务,我们都需要给这个任务分配一个堆栈 。

上面的这一段话,生动的描绘了ucos系统是如何执行不同任务的,不同任务之间的切换是通过一个调度函数,OS_Sched (void),触发软件中断,切换执行的任务函数。


要使用ucos系统管理用户的任务,一定要先就是建立任务。有两个函数可以建立, OSTaskCreate()和 OSTaskCreateExt()。后者是前者的扩展。

在整个系统开始任务执行时(即调用OSStart())前,至少需建立一个任务。那么问题来了,这个任务是不是什么地方都能建立?

问1:注意,这个建立不能再中断服务(ISR)中建立。这是为什么呢?

答1:现在还回答不上来。

问2::任务建立的函数做了什么工作呢?

答2:总的来说,主要是建立该任务的堆栈和任务控制块的初始化。什么是任务控制块?见问3。当然在之前需要判断设定的优先级的有效性,包括优先级是否越界(超过最大的设定的优先级数OS_LOWEST_PRIO)和优先级是否已被占用。

问3:什么是任务控制块?包含哪些内容?

答3:任务控制块(Task Control Block)TCB是存储任务信息的一张表,在ucos中是一个结构体定义的,所有的任务的控制块构成一个一个双向链表。包括了有任务任务堆栈STK,优先级信息,任务状态,任务消息,任务事件信息,任务执行延时信息,及其任务链表的上一链结和下一链结的信息等。这些信息都构成了任务的属性。

问4:任务建立函数 OSTaskCreate()的入口参数有哪些?其中的参数*pdata是什么含义?

答4:有以下参数:

1).void (*task)(void *pd):这是一个函数指针,呵呵没有问题吧。函数指针名为为task,指向的函数有有一个形参,这里是void *pd。就是任务代码的指针,平时就是我们任务名,或者说就是函数名作为这个入口参数。

2).void *pdata:这就是任务函数的入口参数指针,在OSTaskCreate函数中再次作为形参,OSTaskCreate函数调用的OSTaskStkInit会将其推入堆栈保存起来。这就是说参数*pdata的存在允许任务函数有形参,极大方便了与全局变量建立连接。

3) OS_STK *ptos:是分配给任务的堆栈的栈顶指针。栈顶ptos和其相对的是栈底pbos,其地址和堆栈增长方向OS_STK_GROWTH有关。

4). INT8U prio:是任务的优先级。

阅读(5051) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~