OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4073|回复: 4

STM32 ucosii 双堆栈初始化问题

[复制链接]

2

主题

8

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-12-21
在线时间
3 小时
发表于 2017-12-22 09:03:47 | 显示全部楼层 |阅读模式
5金钱
请大神帮忙解答一下 为什么在OSStartHighRdy中MSP初始化的地址是OS_CPU_ExceptStkBase ;而PSP初始化地址是0?
OSStartHighRdy
    LDR     R0, =NVIC_SYSPRI14                                  ; Set the PendSV exception priority
    LDR     R1, =NVIC_PENDSV_PRI
    STRB    R1, [R0]

    MOVS    R0, #0                                              ; Set the PSP to 0 for initial context switch call
    MSR     PSP, R0

    LDR     R0, =OS_CPU_ExceptStkBase                           ; Initialize the MSP to the OS_CPU_ExceptStkBase
    LDR     R1, [R0]
    MSR     MSP, R1   

    LDR     R0, =OSRunning                                      ; OSRunning = TRUE
    MOVS    R1, #1
    STRB    R1, [R0]

    LDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)
    LDR     R1, =NVIC_PENDSVSET
    STR     R1, [R0]

    CPSIE   I                                                   ; Enable interrupts at processor level

OSStartHang
    B       OSStartHang  

最佳答案

查看完整内容[请看2#楼]

MSP 可以不用初始化.系统硬件自动搞定了. PSP 初始化为0,是用来区别,是不是第一次切换任务, 因为第一次切换任务,无上一次任务来保存.不然,要保存上一个任务到栈. PendSV_Handler CPSID I ; Prevent interruption during context switch MRS R0, PSP ; PSP is process stack pointer CBZ R0, OS_CPU_PendSVHandler_nosave ; Skip register save the first time 这里会判断 PSP 是不 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

50

主题

1804

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6656
金钱
6656
注册时间
2016-5-29
在线时间
909 小时
发表于 2017-12-22 09:03:48 | 显示全部楼层
MSP 可以不用初始化.系统硬件自动搞定了.
PSP 初始化为0,是用来区别,是不是第一次切换任务,
因为第一次切换任务,无上一次任务来保存.不然,要保存上一个任务到栈.
PendSV_Handler
    CPSID   I             ; Prevent interruption during context switch
    MRS     R0, PSP      ; PSP is process stack pointer
    CBZ     R0, OS_CPU_PendSVHandler_nosave  ; Skip register save the first time 这里会判断 PSP 是不是0,是0直接跳到OS_CPU_PendSVHandler_nosave  执行.
  ;保存一下现场
    SUBS    R0, R0, #0x20    ; Save remaining regs r4-11 on process stack
   STM     R0, {R4-R11}

   LDR     R1, =OSTCBCur     ; OSTCBCur->OSTCBStkPtr = SP;
   LDR     R1, [R1]
   STR     R0, [R1]                                            ; R0 is SP of process being switched out
           
    OS_CPU_PendSVHandler_nosave

    LDR     R0, =OSTCBCur                                       ; OSTCBCur  = OSTCBHighRdy;
    LDR     R1, =OSTCBHighRdy
    LDR     R2, [R1]
    STR     R2, [R0]
    LDR     R0, [R2]                                            ; R0 is new process SP; SP = OSTCBHighRdy->OSTCBStkPtr;
    LDM     R0, {R4-R11}                                        ; Restore r4-11 from new process stack
    ADDS    R0, R0, #0x20
    MSR     PSP, R0                                             ; Load PSP with new process SP
    ORR     LR, LR, #0x04                                       ; Ensure exception return uses process stack
    CPSIE   I
    BX      LR                                                  ; Exception return will restore remaining context
     ALIGN
    END
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-12-22 09:26:59 | 显示全部楼层
MSP 用于系统栈(中断入栈..) ,PSP用于线程栈(函数调用..)
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-12-21
在线时间
3 小时
 楼主| 发表于 2017-12-22 10:57:02 | 显示全部楼层
lanlzp 发表于 2017-12-22 09:26
MSP 用于系统栈(中断入栈..) ,PSP用于线程栈(函数调用..)

1.那为什么PSP初始化为0?
2.为什么正点原子的有的例程  在OSStartRdy里面没有初始化msp??[img]C:\Users\aircraft\Desktop\捕获.PNG[/img]
捕获.PNG
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-12-21
在线时间
3 小时
 楼主| 发表于 2017-12-22 19:20:10 | 显示全部楼层
操作系统 发表于 2017-12-22 09:03
MSP 可以不用初始化.系统硬件自动搞定了.
PSP 初始化为0,是用来区别,是不是第一次切换任务,
因为第一次切 ...

谢谢耐心解答
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-2 04:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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