OpenEdv-开源电子网

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

任务切换PendSV中断的服务函数求解释!!!求大虾帮我呀!!!!!

[复制链接]

4

主题

20

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-9-25
在线时间
7 小时
发表于 2016-11-25 01:04:44 | 显示全部楼层 |阅读模式
20金钱
一言不合就是上代码。。。。。。。。。。。。。。。。。。。。。。。面对这个汇编反正我是一脸懵逼,于是我就一个个的差了汇编指令,但是我还是没能弄懂,具体的操作流程,
首先得疑问就是,我们在创建任务的时候会分配给任务一个堆栈空间,例如    CPU_STK  TASK1_TASK[START_TASK_SIZE];   这就意味着我们在保护现场的时候,会把寄存器的值保存到这个堆栈对吧?但是我在汇编的函数里并没有看到 ,系统把堆栈保存的时候用到 CPU_STK  TASK1_TASK[START_TASK_SIZE]; 这个东东啊
希望懂的童鞋,大虾,当然还有原子哥,看到了及时帮我解释一下。您的回答决定了我痛苦地时间长短。。。。。。。。
提前说声谢谢!!!!
    CPSID   I                                                   ; Prevent interruption during context switch
    MRS     R0, PSP                                             ; PSP is process stack pointer
    CBZ     R0, PendSVHandler_nosave                     ; Skip register save the first time


        ;Is the task using the FPU context? If so, push high vfp registers.
        TST                R14, #0X10
        IT                EQ
        VSTMDBEQ R0!,{S16-S31}
       
    SUBS    R0, R0, #0x20                                       ; Save remaining regs r4-11 on process stack
    STM     R0, {R4-R11}


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


                                                                ; At this point, entire context of process has been saved
PendSVHandler_nosave
    PUSH    {R14}                                               ; Save LR exc_return value
    LDR     R0, =OSTaskSwHook                                   ; OSTaskSwHook();
    BLX     R0
    POP     {R14}


    LDR     R0, =OSPrioCur                                      ; OSPrioCur   = OSPrioHighRdy;
    LDR     R1, =OSPrioHighRdy
    LDRB    R2, [R1]
    STRB    R2, [R0]


    LDR     R0, =OSTCBCurPtr                                    ; OSTCBCurPtr = OSTCBHighRdyPtr;
    LDR     R1, =OSTCBHighRdyPtr
    LDR     R2, [R1]
    STR     R2, [R0]


    LDR     R0, [R2]                                            ; R0 is new process SP; SP = OSTCBHighRdyPtr->StkPtr;
    LDM     R0, {R4-R11}                                        ; Restore r4-11 from new process stack
    ADDS    R0, R0, #0x20                                     ;Is the task using the FPU context? If so, push high vfp registers.
        TST         R14, #0x10
        IT                 EQ
        VLDMIAEQ R0!, {S16-S31}
       
        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
    END



最佳答案

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

LZ你好,你这个是ucosii吧?ucosii在创建任务的时候是将你所创建的任务所有的堆栈信息包含到你定义的堆栈中的,建议LZ去看下在软件资料里的UCOS学习资料中的 简易OS设计.pdf这个文档,会对你有帮助,里面介绍了任务的堆栈如何存取等,如果需要详细点的资料可以去看邵贝贝的资料,这个是更详细的文档资料,不建议太深究UCOS,能懂得它的内核原理和机制等基本操作就够了,对于初学者来UCOS说会比较好的操作系统学习,是因为资料广,但 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2015-12-26
在线时间
41 小时
发表于 2016-11-25 01:04:45 | 显示全部楼层
LZ你好,你这个是ucosii吧?ucosii在创建任务的时候是将你所创建的任务所有的堆栈信息包含到你定义的堆栈中的,建议LZ去看下在软件资料里的UCOS学习资料中的 简易OS设计.pdf这个文档,会对你有帮助,里面介绍了任务的堆栈如何存取等,如果需要详细点的资料可以去看邵贝贝的资料,这个是更详细的文档资料,不建议太深究UCOS,能懂得它的内核原理和机制等基本操作就够了,对于初学者来UCOS说会比较好的操作系统学习,是因为资料广,但是UCOS在商用时是需要收费的。
回复

使用道具 举报

4

主题

20

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-9-25
在线时间
7 小时
 楼主| 发表于 2016-11-25 09:25:21 | 显示全部楼层
没人来    自己顶....
回复

使用道具 举报

4

主题

20

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-9-25
在线时间
7 小时
 楼主| 发表于 2016-11-25 09:25:33 | 显示全部楼层
来人呐....
回复

使用道具 举报

4

主题

20

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-9-25
在线时间
7 小时
 楼主| 发表于 2016-11-25 09:25:55 | 显示全部楼层
江南皮革厂倒闭了。。。。。。。。。。。。。。。。。。
回复

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3693
金钱
3693
注册时间
2011-5-23
在线时间
2008 小时
发表于 2016-11-25 09:38:43 | 显示全部楼层
线程运行时,[mw_shl_code=c,true] CPU_STK  TASKn_TASK[START_TASK_SIZE]; [/mw_shl_code]
就已经在SP中了,所以切换函数只要把所有寄存器都压入SP即可,并不需要去管哪个任务的栈数组什么的,不管N个任务难道还要一个一个去看?
又cortex-M中断时会自动压一部分寄存器,所以线程切换函数只要压剩余的寄存器即可。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

4

主题

20

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-9-25
在线时间
7 小时
 楼主| 发表于 2016-11-25 12:27:18 | 显示全部楼层
Lester 发表于 2016-11-25 11:07
LZ你好,你这个是ucosii吧?ucosii在创建任务的时候是将你所创建的任务所有的堆栈信息包含到你定义的堆栈中 ...

恩恩是ucosiii   好,我这就去看看您说的这几个文档,多谢!!
回复

使用道具 举报

0

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2015-12-26
在线时间
41 小时
发表于 2016-11-25 13:18:04 | 显示全部楼层
古古怪怪 发表于 2016-11-25 12:27
恩恩是ucosiii   好,我这就去看看您说的这几个文档,多谢!!

ucosii和ucosiii的大部分功能都是一样的,只是ucosiii改进并增加了些操作系统功能,比ucosii任务支持数量多等等。
回复

使用道具 举报

4

主题

20

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-9-25
在线时间
7 小时
 楼主| 发表于 2016-11-25 14:36:24 | 显示全部楼层
aozima 发表于 2016-11-25 09:38
线程运行时,
就已经在SP中 ...

       
CPU_STK  TASKn_TASK[START_TASK_SIZE];
麻烦能在用更通俗的话解释一下么。。。。我的专业是自动化,学的这单片机和操作系统完全是自学,微机原理还没上过,刚大二,如果可以的话真的是万分感谢,,,,,
后面的自动压栈一部分寄存器我查了资料也是知道的,就这一小块,不知道他们运行的时候怎么连起来的、、、
回复

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3693
金钱
3693
注册时间
2011-5-23
在线时间
2008 小时
发表于 2016-11-25 14:46:25 | 显示全部楼层
自己搜 TASK1_TASK 被谁引用了,然后顺路摸下去!
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

4

主题

20

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-9-25
在线时间
7 小时
 楼主| 发表于 2016-11-25 16:17:42 来自手机 | 显示全部楼层
aozima 发表于 2016-11-25 14:46
自己搜 TASK1_TASK 被谁引用了,然后顺路摸下去!

嗯嗯好
回复

使用道具 举报

8

主题

47

帖子

1

精华

高级会员

Rank: 4

积分
673
金钱
673
注册时间
2014-9-17
在线时间
88 小时
发表于 2016-11-27 16:51:48 来自手机 | 显示全部楼层
建议用JLink仿真调试看下PSP,MSP的值与每个任务栈空间地址的值的关系。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-1 22:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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