- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
六、嵌入式系统初始化与操作系统的移植[精选]
关于栈指针调整 栈指针调整 调整堆栈指针(加一个数在堆栈指针上)来完成的。加在堆栈指针上的数必须是明确的,而这个数主要依赖于移植的目标处理器(地址空间可能是16,32或64位),所用的编译器,编译器选项,内存模式等等。另外,处理器状态字可能是8,16,32甚至64位宽,并且OSIntExit()可能会分配局部变量。有些处理器允许用户直接增加常量到堆栈指针中,而有些则不允许。在后一种情况下,可以通过简单的执行一定数量的pop(出栈)指令来实现相同的功能。一旦堆栈指针完成调整,新的堆栈指针会被保存到被切换出去的任务的OS_TCB中 OSIntCtxSW的实现 OSIntCtxSw()的原型 void OSIntCtxSw(void) { 调整堆栈指针来去掉在调用: OSIntExit(), OSIntCtxSw()过程中压入堆栈的多余内容; 将当前任务堆栈指针保存到当前任务的OS_TCB中: OSTCBCur-OSTCBStkPtr = 堆栈指针; 调用用户定义的OSTaskSwHook(); OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; 得到需要恢复的任务的堆栈指针: 堆栈指针 = OSTCBHighRdy-OSTCBStkPtr; 将所有处理器寄存器从新任务的堆栈中恢复出来; 执行中断返回指令; } OSIntCtxSW ();中断级的任务切换函数(1) OSIntCtxSw LDR sp, =IRQStack ;FIQ_STACK Sub r7,sp,#4 mrs r1, SPSR ; 得到暂停的 PSR orr r1, r1, #0xC0 ; 关闭 IRQ, FIQ. msr CPSR_cxsf, r1 ; 转换模式 (应该是 SVC_MODE) ldr r0, [r7] ; 从IRQ堆栈中得到IRQs LR (任务 PC) sub r0, r0, #4 ; 当前PC地址是(saved_LR - 4) STMFD sp!, {r0} ; 保存任务 PC STMFD sp!, {lr} ; 保存 LR sub lr, r7 ,#52 ; 保存 FIQ 堆栈 ptr in LR (转到 nuke r7) ldmfd lr!, {r0-r12} ; 从FIQ堆栈中得到保存的寄存器 STMFD sp!, {r0-r12} ;在任务堆栈中保存寄存器 OSIntCtxSW ();中断级的任务切换函数(2) ;在任务堆栈上保存PSR 和任务 PSR MRS r4, CPSR bic r4, r4, #0xC0 ; 使中断位处于使能态 STMFD sp!, {r4} ; 保存任务当前 PSR MRS r4, SPSR STMFD sp!, {r4} ; SPSR ; OSPrioCur = OSPrioHighRdy // 改变当前程序 LDR r4, addr_OSPrioCur LDR r5, addr_OSPrioHighRdy LDRB r6, [r5] STRB r6, [r4] ; 得到被占先的任务TCB LDR r4, addr_OSTCBCur LDR r5, [r4] STR sp, [r5] ; 保存sp 在被占先的任务的 TCB OSIntCtxSW ();中断级的任务切换函数(3) ; 得到新任务 TCB 地址 LDR r6, addr_OSTCBHighRdy LDR r6, [r6] LDR sp, [r6] ; 得到新任务堆栈指针 ; OSTCBCur = OSTCBHighRdy STR r6, [r4] ; 设置新的当前任务的TCB地址 LDMFD sp!, {r4} MSR SPSR, r4 LDMFD sp!, {r4} BIC r4, r4, #0xC0 ; 必须退出新任务通过允许中断 MSR CPSR, r4 LDMFD sp!, {r0-r12, lr, pc} 测试uCOS-II(1) /*任务定义*/ OS_STK SYS_Task_Stack[STACKSIZE]= {0, }; //system task刷新任务堆栈 #define SYS_Task_Prio 1 void SYS_Tas
您可能关注的文档
最近下载
- 教师资格证初中数学教案汇总.pdf VIP
- 海外留学生体育活动参与情况与身体素质的研究教学研究课题报告.docx
- 教科版新版科学三年级上册《8.天气的影响》教案.docx VIP
- 如何设计护理研究方案.pptx VIP
- 英语演讲技巧与实践 课件 Chapter1 Understanding Public Speaking.pptx
- 低空与低空经济分析与研究.pptx VIP
- 成长英语教师用书 进阶篇PPTUnit 7.pptx VIP
- 农村宅基地培训.pptx VIP
- 变电站设备巡视检查及验收培训课件[1].ppt VIP
- 《保险基础与实务》(徐昆第4版) 课件 第二章 保险原则与保险合同.pptx
文档评论(0)