移植μC/OS-Ⅱ
自动的保存到堆栈中,所以在用户将寄存器存入堆栈的时候,也必须依照这一顺序。
现在是时候讨论这个问题了: 如果用户的C编译器将pdata参数传递到寄存器中而不是堆栈中该作些什么?用户需要从编译器的文档中找到pdata储存在哪个寄存器中。pdata的内容就会随着这个寄存器的储存被放置在堆栈中。
图 8.4 堆栈初始化(pdata通过寄存器传递)
一旦用户初始化了堆栈,OSTaskStkInit()就需要返回堆栈指针所指的地址[F8.3(4)]。
OSTaskCreate()和OSTaskCreateExt()会获得该地址并将它保存到任务控制块(OS_TCB)中。
处理器文档会告诉用户堆栈指针会指向下一个堆栈空闲位置, 还是会指向最后存入数据的堆栈单元位置。例如,对Intel80x86处理器而言,堆栈指针会指向最后存入数据的堆栈单元位置,而对Motorola68HC11处理器而言,堆栈指针会指向下一个空闲的位置。
8.05.02OSTaskCreateHook()
当用OSTaskCreate()或OSTaskCreateExt()建立任务的时候就会调用OSTaskCreateHook()。该函数允许用户或使用用户的移植实例的用户扩展μC/OS-Ⅱ的功能。
当μC/OS-Ⅱ设置完了自己的内部结构后,会在调用任务调度程序之前调用OSTaskCreateHook()。该函数被调用的时候中断是禁止的。因此用户应尽量减少该函数中的代码以缩短中断的响应时间。
当OSTaskCreateHook()被调用的时候,它会收到指向已建立任务的OS_TCB的指针,这样它就可以访问所有的结构成员了。当使用OSTaskCreate()建立任务时,OSTaskCreateHook()的功能是有限的。但当用户使用OSTaskCreateExt()建立任务时,用户会得到OS_TCB中的扩展指针OSTCBExtPtr),该指针可用来访问任务的附加数据,如浮点寄存器,MMU寄存器,任务计数器的内容,以及调试信息。
只用当OS_CFG.H中的OS_CPU_HOOKS_EN被置为1时才会产生OSTaskCreateHook()的代码。这样,使用用户的移植实例的用户可以在其它的文件中重新定义hook函数。
8.05.03OSTaskDelHook()
当任务被删除的时候就会调用OSTaskDelHook()。 该函数在把任务从μC/OS-Ⅱ的内部任务链表中解开之前被调用。当OSTaskDelHook()被调用的时候,它会收到指向正被删除任务的OS_TCB的指针, 这样它就可以访问所有的结构成员了。 OSTaskDelHook()可以用来检验TCB扩展是否被建立了(一个非空指针)并进行一些清除操作。OSTaskDelHook()不返回任何值。
只用当OS_CFG.H中的OS_CPU_HOOKS_EN被置为1时才会产生OSTaskDelHook()的代码。
8.05.04OSTaskSwHook()
当发生任务切换的时候调用OSTaskSwHook()。不管任务切换是通过OSCtxSw()还是OSIntCtxSw()来执行的都会调用该函数。OSTaskSwHook()可以直接访问OSTCBCur和OSTCBHighRdy,因为它们是全局变量。OSTCBCur指向被切换出去的任务的OS_TCB,而OSTCBHighRdy指向新任务的OS_TCB。 注意在调用OSTaskSwHook()期间中断一直是被禁止的。
因为代码的多少会影响到中断的响应时间,所以用户应尽量使代码简化。OSTaskSwHook()没有任何参数,也不返回任何值。
只用当OS_CFG.H中的OS_CPU_HOOKS_EN被置为1时才会产生 OSTaskSwHook()的代码。
8.05.05OSTaskStatHook()
OSTaskStatHook()每秒钟都会被OSTaskStat()调用一次。用户可以用OSTaskStatHook()来扩展统计功能。例如,用户可以保持并显示每个任务的执行时间,每个任务所用的CPU份额,以及每个任务执行的频率等等。OSTaskStatHook()没有任何参数,也不返回任何值。
只用当OS_CFG.H中的OS_CPU_HOOKS_EN被置为1时才会产生OSTaskStatHook()的代码。
8.05.06OSTimeTickHook()
OSTaskTimeHook()在每个时钟节拍都会被OSTaskTick()调用。实际上,OSTaskTimeHook()是在节拍被μC/OS-Ⅱ真正处理,并通知用户的移植实例或应用程序之前被调用的。OSTaskTimeHook()没有任何参数,也不返回任何值。
只用当OS_CFG.H中的OS_CPU_HOOKS_EN被置为1时才会产生OSTaskTimeHook()的代码。
无论何时建立任务,在分配好和初始化TCB后就会调用该函数,当然任务的堆栈结构也已经初始化好了。OSTaskCreateHook()允许用户用自己的方式来扩展任务建立函数的功能。例如用户可以初始化和存储与任务相关的浮点寄存器,MMU寄存器以及其它寄存器的内容。通常,用户可以存储用户的应用程序所分配的附加的内存信息。用户还可以通过使用OSTaskCreateHook()来触发示波器或逻辑分析仪,以及设置断点。
参数
ptcb是指向所创建任务的任务控制块的指针。
返回值
无
注意事项
该函数在被调用的时候中断是禁止的。 因此用户应尽量减少该函数中的代码以缩短中断
的响应时间。
范例
该例子假定了用户是用
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
