搜索
bottom↓
回复: 2

UCOS中断级任务切换的小疑问

[复制链接]

出0入0汤圆

发表于 2010-9-24 17:10:38 | 显示全部楼层 |阅读模式
在 王田苗 主编的《嵌入式系统设计与实例开发》中,关于UCOS移植到44b0的OSInitCtxSw()代码

;程序里的注释是书本里的,括号里的问题是我的疑问

OSIntCtxSw
    ADD    R7, SP, #16      ;保存寄存器指针---(这时R7=SP+16不是已经指向了PC的地址吗?)
    LDR    SP, =IRQStack    ;FIQ_STACK        (sp重新回到栈底,用于下一次的中断保存入栈,
                                                到这里已经不用IRQ堆指针了,传递参数的工作交给了R7)
    MRS    R1, SPSR         ;得到暂停的SPSR
    ORR    R1, R1, #OxC0    ;关闭IRQ, FIQ
    MSR    CPSR_cxsf, R1    ;转换模式( SVC_MODE )

    LDR    R0, [R7, #52]    ;从IRQ堆栈中得到IRQ's LR (任务 PC)---(为什么这里还要加上52?)

    SUB    R0, R0, #4       ;当前PC地址是(saved_LR-4 )
    STMFD  SP!, {R0}        ;保存任务PC
    STMFD  SP!, {LR}        ;保存LR
    MOV    LR, R7           ;保存FIQ堆栈ptr in LR
    LDMFD  LR!, {R0-R12}    ;从FIQ堆栈中得到保存的寄存器
    STMFD  SP!, {R0-R12}    ;在任务堆栈中保存寄存器
    MRS    R4, CPSR
    BIC    SP!, {R0-R12}
    ……
    ……
    接下来是执行新的任务
    ……
    ……
   ————————————————————————————————————————————————
    这里的程序,应该是把IRQ堆栈中保存的任务寄存器值取出来,再保存到任务堆栈中,然后执行新的任务。

    中断发生后,依次保存的: PC(R15)、R14_IRQ、R13_IRQ、R12、R11……R0( SPSR与CPSR不是很清楚), 这时SP->R0。当执行第一句
        ADD R7, SP, #16
后,由于44b0堆栈是从上往下长的, 所以R7应该指向了PC,但下面
        LDR    R0, [R7, #52]    ;从IRQ堆栈中得到IRQ's LR (任务 PC)---(为什么这里还要加上52?)
为什么还要加上52???
   

     是我理解错了,还是书本问题!!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-9-24 19:09:04 | 显示全部楼层
52 / 4 好像是13,寄存器帧的偏移,从那里开始装入下个任务的工作寄存器,忘得差不多了

出0入0汤圆

发表于 2010-9-24 22:27:00 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-2 01:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表