uCOSII操作系统移植笔记

uCOSII操作系统移植笔记笔记一:今天粗略的看了一下周立功关于uc/osII在lpc2104上的移植方面的说明,这之中印象最深的应该是irq中断和软中断方面的处理,由于arm芯片的特殊性(拥有7种处理器模式),即每种处理器模式都有自己的堆栈,这样在处理堆栈的时候就会相应的麻烦一些。在响应异常时,该移植计划在初始代码里面比在没有操作系统的初始代码多了irq的处理,移植里面的irq处理多了由汇编语言编写的对任务环境的保存,

大家好,又见面了,我是你们的朋友全栈君。

笔记一:
今天粗略的看了一下周立功关于uc/osII在lpc2104上的移植方面的说明,这之中印象最深的应该是irq中断和软中断方面的处理,由于arm芯片的特殊性(拥有7种处理器模式),即每种处理器模式都有自己的堆栈,这样在处理堆栈的时候就会相应的麻烦一些。
在 响应异常时,该移植计划在初始代码里面比在没有操作系统的初始代码多了irq的处理,移植里面的irq处理多了由汇编语言编写的对任务环境的保存,没操作 系统的中的任务环境的保存都是由在产生irq中断是用c语言声明的__irq关键字来完成了,移植中irq中断不能采用__irq关键字,因为c语言不能 保证堆栈结构,而uc/osII必须要保证堆栈结构。除此之外,相对于没操作系统的初始代码,基本上是没有什么改变。
在uc/osII的任务切换 中,采用了arm里面的软中断指令swi来执行,对于非中断性的任务切换(如挂起和等待信号量的时候)uc/osII是采用了宏os_task_sw() 来执行的,然后联系到osctxsw()函数来完成任务切换,而遇到中断情况时在返回是需要任务切换是则采用了osintctxsw()来执行的,在周立 功的移植当中,他把osctxsw()与osintctxsw()合二为一了,统一采用osintctxsw()来实现。之所以这样搞的原因是任务进行切 换的时候,都必须进入软中断的状态,而对于软中断的异常响应代码已经将任务的环境变量进行了保存,从而也不需要像osctxsw()里面规定的那样对将环 境变量进行保存。
这是我看今天看了移植说明后所理解的东西,当然还得细致的对代码进行分析,特别是osintctxsw()代码的分析,虽然移植的代码大体是遵从了uc/osII的编码规范,但对于arm的多种处理器模式移植代码有特别的改变,以实现cpu时间和ram的利用。

笔记二:
感觉osintctxsw()这个函数需要进行仔细的解读,好多其他函数都与他由关联,而在uc/osII中的原型是没有这样的情况的,我想出现这个现象的原因是由于arm芯片的特殊性(拥有7种处理器模式),这样在处理堆栈的时候就会相应的麻烦一些。
移植的osintctxsw()函数由两个部分,以标号osintctxsw_1作为分界点。
关于osintctxsw_1以下的程序,LPC2100_FAQ.pdf文档里面的第126问作了详细的解释,即实现的是任务的恢复运行。
而 osintctxsw_1以上的程序段的功能如周立功的移植说明里面的解释:前面的关于中断与c语言的接口已经说明,寄存器应当保存到任务的堆栈中,但为 了节省cpu时间和ram的空间,仅在必要的时候才将寄存器保存到任务的堆栈,OSTCBCur->OSTCBStkPtr=SP也是在必要的时候 才执行,这一段代码就是来处理这两件事情的。(即将任务的环境变量由模式堆栈复制到当前任务的任务堆栈中,对照周立功书上374页与378页的两个堆栈图 来理解这部分代码就很清晰明了了)。
理解了以上关于osintctxsw()两个部分代码的解释,也就不难理解为什么有些函数都来引用 osintctxsw()了,就以__OSStartHighRdy中引用osintctxsw_1为例来说明,他在代码的末尾最后引用 osintctxsw_1,就是要实现任务的恢复运行(从新任务堆栈中恢复所有寄存器,执行中断返回指令)。
最后对于osintctxsw()要 注意的是,这个函数的移植并非是简单的ucos中的osintctxsw()原型的声明,因为在移植的代码中,要用到osintctxsw()必须得引用 OS_TASK_SW()宏才可以,这样就引出了在ucos的c代码函数osintexit()时调用osintctxsw()函数该怎么办这个问题了。
周立功的移植是在includes.h中定义一个宏osintctxsw(),由于这个宏在c语言中使用,所以不会与汇编的函数osintctxsw冲突,宏定义如下所示:
#define osintctxsw()
{

 OSEnterSum=0;
 return;
 }
而中断返回时要执行的任务切换这一行为实际上已经在irq异常响应代码中由它来完成了,也就是说移植完成后osintctxsw()起的作用已经不是ucos的作者想起的作用了。
现在感觉有点不明白的是OSEnterSum所起的作用,ucos原型中并不存在这一变量。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136238.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • datagrip激活【最新永久激活】

    (datagrip激活)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html08G05E7DZH-eyJsaWN…

    2022年3月28日
    626
  • 视频编解码基本流程

    视频编解码基本流程视频编解码基本框架

    2022年7月13日
    13
  • STUN协议详解

    STUN协议详解   基于RFC3489标准的stun协议,无法穿越TCP类型NAT,只是适用于在现有NAT类型下的UDP穿越,另一种特殊情况NAT也无法进行穿越,就是对称型NAT,在很多企业中就很多属于对称型NAT,后面会讲到。STUN的发现过程是基于UDP的NAT处理的假设;随着新的NAT设备的部署,这些假设可能会被证明是无效的,当STUN被用来获取一个地址来与位于其在同一NAT后面的对等体通信时,它就不起作用了。当stun服务器的部署不在公共共享地址域范围内时,stun就不起作用。1.定义STUN客户端:产生

    2022年7月17日
    20
  • JAVASCRIPT 上传文件的几种方式「建议收藏」

    JAVASCRIPT 上传文件的几种方式「建议收藏」方法1:使用ajax,通过formdata传参//注意:FormData只兼容到IE10varformData=newFormData();varfile=$(‘.import-file-btn’).get(0).files[0];formData.append(‘file’,file);formData.append(‘id’,id);formData.append(‘name’,name);$.ajax({url:’user/validate_impo

    2022年10月22日
    0
  • 用pywinauto抓取微信公众号

    用pywinauto抓取微信公众号我试图用pywinauto抓取PC端微信中的公众号信息,但是碰到了大坑了。

    2022年5月18日
    76
  • Java安全之RMI协议分析

    Java安全之RMI协议分析0x00前言在前面其实有讲到过RMI,但是只是简单描述了一下RMI反序列化漏洞的利用。但是RMI底层的实现以及原理等方面并没有去涉及到,以及RMI的各种攻击方式。在其

    2021年12月12日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号