关于uc/os-II的任务切换时压栈的问题

[复制链接]
 楼主| 530991163 发表于 2011-11-26 07:44 | 显示全部楼层 |阅读模式
大家好:
         我最近在学习UCOS,我用的freescale的16位单片机,想请教一下当任务切换时,被剥夺CPU使用权的任务的状态(即任务CPU状态和寄存器值)是怎么压入该任务的任务堆栈中的,我看代码中只是将堆栈指针保存了一下,因为uc/os实际上是通过软中断指令来进行任务的切换,当CPU执行软中断指令时,当前任务状态被压入默认的一个堆栈中去了,怎么才能将这个堆栈设为任务堆栈呢?这块我还不是太明白,理解可能不正确,请大家指教~~谢谢了~~
wjvictor 发表于 2012-2-27 17:35 | 显示全部楼层
期待中?
delin17 发表于 2012-2-28 12:41 | 显示全部楼层
我印象中是压入当前任务堆载,然后再切到要最高优先任务中堆栈,弹出该任务上次保存的状态。
delin17 发表于 2012-2-28 12:43 | 显示全部楼层
具体细节看那个切换函数。
  1. OSPendSV
  2.         IF OS_CRITICAL_INT_PRIO > 0                                            ;  disable interupt 禁能中断
  3.                     MRS R3, BASEPRI
  4.             LDR R1, =OS_CRITICAL_INT_PRIO
  5.                         MSR BASEPRI, R1
  6.                 ELSE
  7.                 MRS     R3, PRIMASK
  8.                 CPSID   I
  9.                 ENDIF


  10.                 MRS     R0, PSP                                                 ;  PSP is process stack pointer
  11.                                                                         ;  PSP是任务的堆栈指针
  12.         CBZ     R0, OSPendSV_nosave                                     ;  skip register save the first
  13.                                                                         ;  time第一次跳过保存

  14.         SUB     R0, R0, #0x20                                           ;  save remaining regs r4-11 on
  15.                                                                         ;  process stack 保存r4-r11
  16.         STM     R0, {R4-R11}

  17.         LDR     R4, =OSTCBCur                                           ;  OSTCBCur->OSTCBStkPtr = SP;
  18.         LDR     R4, [R4]
  19.         STR     R0, [R4]                                                ;  R0 is SP of process being
  20.                                                                         ;  switched outR0是被切换开的任务
  21.                                                                         ;  的堆栈指针
  22. OSPendSV_nosave
  23.         PUSH    {R14}                                                   ;  need to save LR exc_return
  24.                                                                         ;  value保存LR返回值

  25.         LDR     R0, =OSTaskSwHook                                       ;  OSTaskSwHook();
  26.         BLX     R0
  27.         POP     {R14}

  28.         LDR     R4, =OSPrioCur                                          ;  OSPrioCur = OSPrioHighRdy
  29.         LDR     R5, =OSPrioHighRdy
  30.         LDRB    R6, [R5]
  31.         STRB    R6, [R4]

  32.         LDR     R4, =OSTCBCur                                           ;  OSTCBCur  = OSTCBHighRdy;
  33.         LDR     R6, =OSTCBHighRdy
  34.         LDR     R6, [R6]
  35.         STR     R6, [R4]

  36.         LDR     R0, [R6]                                                ;  SP = OSTCBHighRdy->OSTCBStkPtr;
  37.         LDM     R0, {R4-R11}                                            ;  restore r4-11 from new process
  38.                                                                         ;  stack 从新任务的堆栈恢复r4-r11
  39.         ADD     R0, R0, #0x20
  40.         MSR     PSP, R0                                                 ;  load PSP with new process SP
  41.                                                                         ;  从新任务的堆栈恢复PSP

  42.         ORR     LR, LR, #0x04                                           ;  ensure exception return uses
  43.                                                                         ;  PSP确保返回后使用PSP

  44.                 IF OS_CRITICAL_INT_PRIO > 0                                     ;  restore interrupts 恢复中断
  45.                     MSR         BASEPRI,  R3
  46.                 ELSE
  47.                         MSR     PRIMASK, R3
  48.                 ENDIF

  49.             BX      LR                                                      ; exception return will restore
  50.                                                                         ;  remaining context
  51.                                                                         ;  返回时会恢复剩下的上下文
  52.         NOP
mdcy278 发表于 2012-2-28 13:07 | 显示全部楼层
在压栈以前已经把任务堆栈的指针赋给了SP寄存器吧。看贝贝的书上是这么说的。
zhaigch 发表于 2012-3-2 21:47 | 显示全部楼层
具体的压栈过程是要自己写汇编代码来实现的!UCOS里只是调用调度函数!如LS所说,被切换的任务,把自己的数据存储下来,然后把新任务的堆栈块指针给SP。。。从而来实现任务的切换!好像是这样的,好久不看那个了!LZ自己再看看书上的源代码!
denghaibo 发表于 2012-3-7 19:22 | 显示全部楼层
是压入当前任务栈,再切换的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:比较无助~~

25

主题

116

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部