- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
基于嵌入式实时操作系统的程序设计技术+周航慈.pdf
第四章 任务设计
在基于实时操作系统的应用程序设计中,任务设计是整个应用程序的基础,其他软件设
计工作都是围绕任务设计来展开,任务设计就是设计“任务函数”和相关的数据结构。
4.1 任务函数的结构
在用户任务函数中,必须包含至少一次对操作系统服务函数的调用,否则比其优先级低
的任务将无法得到运行机会,这是用户任务函数与普通函数的明显区别。任务函数的结构按
任务的执行方式可以分为三类:单次执行类、周期执行类和事件触发类,下面分别介绍其结
构特点。
4.1.1 单次执行的任务
此类任务在创建后只执行一次,执行结束后即自行删除,其任务函数的结构如下:
程序清单L4-1 单次执行任务函数的结构
void MyTask (void *pdata) //单次执行的任务函数
{
进行准备工作的代码;
任务实体代码;
调用任务删除函数; //调用 OSTaskDel(OS_PRIO_SELF)
}
单次执行的任务函数由三部分组成:第一部分是“进行准备工作的代码”,完成各项准
备工作,如定义和初始化变量、初始化某些设备等等,这部分代码的多少根据实际需要来决
定,也可能完全空缺。第二部分是“任务实体代码”,这部分代码完成该任务的具体功能,
其中通常包含对若干系统函数的调用,除若干临界段代码(中断被关闭)外,任务的其它代
码均可以被中断,以保证高优先级的就绪任务能够及时运行。第三部分是“调用任务删除函
数”,该任务将自己删除,操作系统将不再管理它。
单次执行的任务采用“创建任务函数”来启动,当该任务被另外一个任务(或主函数)
创建时,就进入就绪状态,等到比它优先级高的任务都被挂起来时便获得运行权,进入运行
状态,任务完成后再自行删除,“启动任务”就是一个例子。
采用“启动任务”后,主函数就可以简化为三行,只负责与操作系统有关的事情,即初
始化操作系统、创建“启动任务”、启动操作系统,使主函数的内容固定下来,与具体的应
用系统无关。真正启动系统所需要的准备工作由“启动任务”来完成,它的内容与具体的系
- 1 -
统密切相关。主函数和“启动任务”的示意代码如下:
程序清单L4-2 使用启动任务
void main (void) //主函数
{
OSInit (); //初始化操作系统
OSTaskCreate(TaskStart,(void *)0,&TaskStartStk[TASK_STK_SIZE-1],1);//创建启动任务
OSStart (); //启动操作系统,开始对任务进行调度管理
}
void TaskStart(void *pdata) //启动任务
{
pdata = pdata;
系统硬件初始化; // 时钟系统、中断系统、外设等等
创建各个任务; //如键盘任务、显示任务、采样任务、数据处理任务、打印任务等等
创建各种通信工具; //如信号量、消息邮箱、消息队列等等
OSTaskDel (OS_PRIO_SELF); //删除自己
}
在“启动任务”中完成与系统硬件有关的各种初始化工作,然后创建各个实质任务和所
需要的各种通信工具,至此系统才真正完成准备工作,“启动任务”的使命也就结束了,最
后将自己删除。为了保证“启动任务”能够连续运行,必须将“启动任务”的优先级选择为
最高。否则,当“启动任务”创建一个优先级高于自己的任务时,刚刚创建的任务就会立即
进入运行状态,而与这个任务关联的其它任务可能还没有创建,它使用的通信工具也还没有
创建,系统必然出错。“启动任务”调用的“自我删除”函数会进行任务调度操作,从而使
系统开始运行各个实质任务。
由于“启动任务”不是用户系统的实质任务,又占用高优先级资源和任务资源,故不常
用。更常用的方法是将“启动任务”所完成的操作交给一个用户系统的实质任务来完成。这
时,主函数和有启动功能的任务函数的示意代码如下:
程序清单L4-3 以用户任务代替启动任务
void ma
文档评论(0)