一个完整的上下文切换的例子.doc

一个完整的上下文切换的例子.doc

ID:61761004

大小:130.00 KB

页数:7页

时间:2021-03-19

一个完整的上下文切换的例子.doc_第1页
一个完整的上下文切换的例子.doc_第2页
一个完整的上下文切换的例子.doc_第3页
一个完整的上下文切换的例子.doc_第4页
一个完整的上下文切换的例子.doc_第5页
资源描述:

《一个完整的上下文切换的例子.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、下面介绍一个完整的上下文切换的例子连起来(PuttingItAllTogether)在第2节的最后一部分展示了这些积木模块(buildingblocks)和源代码模块(sourcecodemodules)使如何来达到一个在AVR微控制器上进行RTOS上下文切换的目的的。这个例子分几步演示了从一个低的优先级的任务TaskA,切换到高优先级的任务TaskB的。源代码与WinAVRC开发工具兼容。上下文切换-第1步在RTOStick中断发生之前这个例子,以TaskA的执行开始。TaskB先前已经被挂起,所以

2、它的上下文已经被保存到TaskB的stack里面。TaskA的上下文如下图所示: 在每个寄存器里标上(A),表示,这寄存器含有任务A的上下文的正确值。  上下文切换—第2步RTOStick中断发生了 当TaskA将要执行到一个LDI指令的时候,RTOStick发生。当中断发生时,AVR微控制器会在跳入到RTOStickISR之前,自动放置当前的PC到stack里面。上下文切换-第3步RTOStick中断(服务)执行ISR源代码如下。为便于阅读,移除注释。/*Interruptserviceroutin

3、efortheRTOStick.*/voidSIG_OUTPUT_COMPARE1A(void){   vPortYieldFromTick();   asmvolatile("reti");}/*--------------------------------------------------*/voidvPortYieldFromTick(void){   portSAVE_CONTEXT();   vTaskIncrementTick();   vTaskSwitchContext();   

4、portRESTORE_CONTEXT();   asmvolatile("ret");}/*--------------------------------------------------*/SIG_OUTPUT_COMPARE1A()是一个naked函数。所以第一条指令是调用vPortYieldFromTick()..vPortYieldFromTick()也是一个naked函数,所以AVR执行上下文被portSAVE_CONTEXT().明确保存。portSAVE_CONTEXT()将整个A

5、VR执行上下文全部压入TaskA的Stack..示意图如下。TaskA的栈顶指针(StackPointer)现在指向它自己的上下文的顶部。portSAVE_CONTEXT()通过保存栈顶指针的一份拷贝来完成。在上次TaskB挂起时,实时内核已经复制了TaskB的栈顶指针。上下文切换-第4步增加tickcount在TaskA上下文被保存之后再执行vTaskIncrementTick()。这个例子,假定tickcount的增加会引起TaskB准备运行。TaskB比TaskA有更高的优先级,所以vTaskS

6、witchContext()在ISR完成后将处理器交给TaskB.上下文切换-第5步TaskB的栈顶指针被取得TaskB的任务必须被恢复。portRESTORE_CONTEXT要做的第1件事情就是从TaskB被挂起时保存的拷贝里取得TaskB的栈顶指针。TaskB的栈顶指针被载入到处理器的stackpointer.所以现在AVR的栈顶指针就是指向TaskB的上下文。上下文切换-第6步恢复TaskB的上下文portRESTORE_CONTEXT()从TaskB的stack中恢复它的上下文到相应的处理器寄

7、存器。只有PC(programcounter)还留在stack中。 上下文切换-第7步RTOStick退出vPortYieldFromTick()返回到SIG_OUTPUT_COMPARE1A(),在那里,最后一条指令是从中断返回(RETI).  RETI指令假定stack中的下个值就是中断发生时返回地址。当RTOStick中断发生时,AVR自动放置TaskA的返回地址(在TaskA中的下条指令的地址)到stack.。ISR修改stackpointer它指向了TaskB的stack.从而,RETI指令

8、从stack弹出的返回地址是TaskB在挂起前将要立即执行的指令的地址.RTOStick,它中断的是TaskA,然而却返回到了TaskB,这就完成了上下文切换。 ====TheEnd(全文完)====

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。