单片机移植说明_第1页
单片机移植说明_第2页
单片机移植说明_第3页
单片机移植说明_第4页
单片机移植说明_第5页
已阅读5页,还剩8页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目摘 uC/OS需要移植选项说 12 目摘 uC/OS需要移植选项说 12 关中 开中 定义堆栈增长方 向量中断注册函数的编 3附 参考资 uC/OS在LPC2200单片机1摘本文详细介绍uC/OS在菲利普ARMLPC2200平台移植过程,主要目的是为了经验积以下内容主要参考周立功等编著uC/OS在LPC2200单片机1摘本文详细介绍uC/OS在菲利普ARMLPC2200平台移植过程,主要目的是为了经验积以下内容主要参考周立功等编著《ARM微控制器基础与实战》,适当修2uC/OS需要移植选项说 任务栈其他数图1ARMOS_STK(*task)(void*pd),voidOS_STK*ptos,{没有使用。作用是避免编译器==图1ARMOS_STK(*task)(void*pd),voidOS_STK*ptos,{没有使用。作用是避免编译器==/*/*获取堆栈指/*pc/*lr/*建立任务环境,ADS1.2使用满递减堆*stk*--*--*--*--*--*--*--*--*--*--*--*--*--*--(OS_STK)==============int)r0,第一个参数使用R0传*--stk/*spsr,允许IRQFIQ中return} int32os_enter_flag=void int32os_enter_flag=void{{}{}}SP!,{R1,R0,CPSRR1,R0,R0,CPSR_c, R0,SP!,{R1,PC void{if(0=={ R0,SP!,{R1,PC void{if(0=={}}SP!,{R0,LR}R0,CPSRR0,R0,#(NoInt)CPSR_c,R0SP!,{R0,PC1=向下,0=#define1 运行优先级高的任务,原UC/OSII说明如下void{调用用户可定义的获取任务的堆栈指针用户恢复堆栈指针=OSTCBHighRdy-OSRunnig=从新任务的堆栈中恢复所有的处理器寄存器从中断指令返回}CPSR_c,#(NoInt|从中断指令返回}CPSR_c,#(NoInt|R5,#1R5,;BR6,[R6];获取新任务堆栈指 OSTCBHighRdy->OSTCBStkPtr,存放在R4R4,;参考上面ARM寄存器压栈图,下面SP指针指向PC的上一个地;恢复出LRSP,R4,LR,[SP,#-;进入管理模式,禁止IRQCPSR_c,#(NoInt|;设置堆栈指针为正SP,;恢复出堆栈中的;恢复;运行新任SP!,SP!,{R0-R12,LR,PC 任务切换,使用软中断swi(0x00)voidswi(0x01)void SP,SP!,{R0-R1指向参数存储位置,因为 任务切换,使用软中断swi(0x00)voidswi(0x01)void SP,SP!,{R0-R1指向参数存储位置,因为SWI软中断允许是取得Thumb状态SWIR0,[LR,#-R0,否取得arm状态SWIr0SWI号,R1;SWIPC,=SP!,{R0-R3,R12, SWI_Exception函数处中断退出任务切换,同时作为OSCtxSw()的后续处理,主要的功能是保存当中断退出任务切换,同时作为OSCtxSw()的后续处理,主要的功能是保存当前任栈,主要是CPSRR0-R12,LRPC,从UC/OS-II书本上描写来看,OSIntCtxSw()是被voidOSIntExit{if((--OSIntNesting|OSLockNesting)=={/*RescheduleonlyifallISRscompleted¬locked=OSPrioHighRdy=(INT8U)((OSIntExitY<<3)if(OSPrioHighRdy!=OSPrioCur){/*NocontextswitchifcurrenttaskishighestreadyOSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];/*Keeptrackofthenumberofcontextswitches/*Performinterruptlevelcontext}}IRQ中断模式,进入OSIntCtxSw()前堆栈结下图为进入OSIntExit()后堆栈IRQ中断模式,进入OSIntCtxSw()后堆栈结目前堆栈指针的地址为SP’,下图为进入OSIntExit()后堆栈IRQ中断模式,进入OSIntCtxSw()后堆栈结目前堆栈指针的地址为SP’,这个时候如果立即进行任务切换,我们必须知道上SP的位置,由于OSIntExit()用C语言编写,我们无法知道编译器的编译结果,那么无从调整SP’到SP的位置,任务切换的时候就不能正确恢复USER状态下的用户堆栈#defineOSIntCtxSw()或者直接RETURN,实际代码我给注释掉出栈位置,恢复出SP来,因为目前是禁止IRQ中断的,所以不会被IRQ中断给打断处理。R2,[SP,R12,[SP,#16]R0,CPSRR1,LRSP!,{R1-SP!,{R4-|CPSR_c,SP,SP,#8CPSR_c,#(NoInt|?…?SP!,{R4-;R2,[R1]SP!,{R2,SP!,{R3保存SP!,{R4-;R2,[R1]SP!,{R2,SP!,{R3保存R4,;OSTCBCur<=;获取新任务堆栈指OSTCBHighRdy->OSTCBStkPtr,存放在R4R4,;参考上面ARM寄存器压栈图,下面SP指针指向PC的上一个地;恢复出LRSP,R4,;17寄存器CPSR,OsEnterSum,R0-LR,[SP,#-;进入管理模式,禁止IRQCPSR_c,#(NoInt|;设置堆栈指针为正SP,;恢复出堆栈中的SP!,{R4,;恢复新任务的;恢复;运行新任R3,R4,SP!,{R0-R12,LR,PC时钟处理,完全可以写成CVICInit() ISR宏定$IRQ_LabelHANDLER;;LR,LR,#4R3,时钟处理,完全可以写成CVICInit() ISR宏定$IRQ_LabelHANDLER;;LR,LR,#4R3,SP!,R2,=OSIntNestingR1,[R2]R1,R1,R1,;MSRCPSR_c,asnarmSP!,{R0-R3,asnarmSP!,{R0-R3,asnarmCPSR_c,#(0x92);processitasnarmCPSR_c,#(NoInt|IRQ32Mode)R0,=OSTCBHighRdyR0,SP!,SPSR_cxsf,LDMEQFDSP!,SP!,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论