任务的创建与运行.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
任务的创建与运行

实验 3. 任务的创建与运行 一,实验目的: 观察和理解uC/OS-II启动的过程、任务的运行; 学习并理解uC/OS-II的两个任务创建函数的使用; 初步理解钩子(Hook)函数的作用; 二,任务函数uC/OS-II提供的任务创建函数 uC/OS-II中任务的主体是任务函数。为了让任务运行,必须首先在系统中创建它。 uC/OS-II提供了两个创建任务的函数,OSTaskCreate()和OSTaskCreateExt()。 OSTaskCreate()函数 函数原型: INT8U OSTaskCreate( void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8Uprio); 参数的含义: void (void *pd) 指向任务体函数的指针 void *pada 外部获取数据。 数据指针,指向传给任务的数据区。通过这个指针任务函数可以从OS_STK *ptos 指向任务堆栈的栈顶(top of )的指针。 INT8U prio 任务的优先级。 OSTaskCreateExt()函数 函数原型 INT8U OSTaskCreateExt( void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8Uprio, INT16U id, OS_STK *pbos, INT32Ustk_size, void *pext, INT16U opt); 参数的意义: INT16U id 任务的ID号。在uC/OS-II中并没有真正被使用到。因为每个优先级的任务只有一个,优先级号就成了实际的任务号。但在实际工程编程时最好填上合适的标记,为以后的升级做好准备。 OS_STK *pbos 指向任务堆栈的栈底(bottom of stack)的指针。 INT32U stk_size 堆栈的大小。以堆栈宽度为单位。 void *pext 指向扩展数据区的指针。 注:尽量使用OSCreateTaskExt()函数来创建任务,因为这个函数具有更强的灵活性。 3. 任务的堆栈 任务的所有变量都是建立在其堆栈上的。在创建任务时,设计者要对任务的内存消耗做出充分的估计,并以此为依据为任务分配适当大小的堆栈。堆栈不足将导致任务奔溃。 在使用堆栈时,必须考虑堆栈的增长方向和栈顶是否已经保存了数据。对于不同的CPU,其堆栈使用的策略是不同的。软件设计者要特别注意这一点。对于大部分情况,例如在我们实验中采用的是Windows环境下的模拟或者以ARM为内核的CPU,堆栈策略是满减栈 (Full Descending)。假设我们为任务分配数组Stack[STK_SIZE]作为其堆栈,那么初始时,其栈顶位置为Stack[STK_SIZE-1],栈底位置为Stack[0]。 三,任务的创建在创建任务时,要按照创建函数的要求,为任务设立各种工作条件,包括指定任务体函数,设计堆栈,指定任务优先级等等。 本实验中包含两个任务,Task1和Task2,他们的函数体如下: void Task1 (void *para) { INT8U id; for (;;) { OS_Printf(This is task 1.\n); OSTimeDly(50); } } void Task2 (void *para) { INT8U id; for (;;) { OS_Printf(This is task 2.\n); OSTimeDly(70); } } 使用OSTaskCreateExt()创建任务的方法示例: err = OSTaskCreateExt((void (*)(void *)) Task1, (void *) 0, (OS_STK *)TaskStk1[TASK_STK_SIZE-1], (INT8U) TASK1_PRIO, (INT16U) TASK1_PRIO, (OS_STK *)TaskStk1[0], (INT32U) TASK_STK_SIZE, (void *) 0, (INT16U) (OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR) ); if(err) OS_Printf(”Task creates error !\n”); 使用OSTaskCreate()创建任务的方法示例: err = OSTaskCreat

您可能关注的文档

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档