网站大量收购闲置独家精品文档,联系QQ:2885784924

六、嵌入式系统初始化与操作系统的移植解读.ppt

六、嵌入式系统初始化与操作系统的移植解读.ppt

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

关于移植 相对于其他的嵌入式操作系统,uCOS-II的移植虽然是一个很简单的过程,但是,对于不熟悉uCOS-II的开发者,移植还是有一定难度的。 移植要点 定义函数OS_ENTER_CRITICAL和OS_ENTER_CRITICAL。 定义函数OS_TASK_SW执行任务切换。 定义函数OSCtxSw实现用户级上下文切换,用纯汇编实现。 定义函数OSIntCtxSw实现中断级任务切换,用纯汇编实现。 定义函数OSTickISR。 定义OSTaskStkInit来初始化任务的堆栈。 uC/OS的完善 固定的基于优先级的调度,不支持时间片,使用起来不方便。一个任务的基础上增加一个基于时间片的微型调度核 系统时钟中断,没有提供用户使用定时器,可以借鉴linux的定时器加以修改 在对临界资源的访问上使用关闭中断实现,没有使用CPU提供的硬件指令,例如测试并置位。 只是一个实时多任务内核,没有图形用户接口(GUI)、文件系统(FS)和TCP/IP协议栈 谢 谢 各 位 * 中断服务 中断服务程序 关于栈指针调整 栈指针调整 调整堆栈指针(加一个数在堆栈指针上)来完成的。加在堆栈指针上的数必须是明确的,而这个数主要依赖于移植的目标处理器(地址空间可能是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,

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档