OpenEdv-开源电子网

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

ucosii任务切换的问题

[复制链接]

13

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-6-8
在线时间
2 小时
发表于 2015-7-6 22:46:40 | 显示全部楼层 |阅读模式
5金钱
OSCtxSw
    LDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)
    LDR     R1, =NVIC_PENDSVSET
    STR     R1, [R0]
    BX      LR[/mw_shl_code]


在ucos中,这个汇编代码应该是起到切换任务的作用吧!听说他是通过调用PendSV_Handler这个汇编函数实现任务的切换。

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

    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[/mw_shl_code]


可是我还是不懂,OSCtxSw这个函数怎么就触发PendSV_Handler函数的?

NVIC_INT_CTRL他的宏定义应该是指一个寄存器的地址把,改一下寄存器的值就可以触发中断了?

最佳答案

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

回复【2楼】zuozhongkai: --------------------------------- NVIC_INT_CTRL   EQU     0xE000ED04 他所代表的是一个寄存器的地址,其中不同的位可以引发不同的中断。我这么理解对吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-6-8
在线时间
2 小时
 楼主| 发表于 2015-7-6 22:46:41 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
NVIC_INT_CTRL   EQU     0xE000ED04
他所代表的是一个寄存器的地址,其中不同的位可以引发不同的中断。我这么理解对吗?
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-7-6 22:55:33 | 显示全部楼层
Cortex-M内核中有个寄存器的一个bit(具体哪个寄存器的哪个bit忘了),向这个bit写1就会引发PendSV中断。
开往春天的手扶拖拉机
回复

使用道具 举报

13

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-6-8
在线时间
2 小时
 楼主| 发表于 2015-7-6 23:12:02 | 显示全部楼层

 我刚才查了一下,在cortex权威指南里面找到一个类似的函数

[mw_shl_code=c,true]OSCtxSw LDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch) LDR R1, =NVIC_PENDSVSET STR R1, [R0] BX LR[/mw_shl_code]

而这里面r1被给的值应该是0x10000000,是不是0x10000000代表PendSV,0x20000000代表SysTick?

回复

使用道具 举报

13

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-6-8
在线时间
2 小时
 楼主| 发表于 2015-7-6 23:13:38 | 显示全部楼层
回复【3楼】yzl:
---------------------------------
@zuozhongkai,你说的是上面的那个意思吗?
回复

使用道具 举报

13

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-6-8
在线时间
2 小时
 楼主| 发表于 2015-7-6 23:14:18 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
麻烦看一下2楼呗,是这个意思吗?
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-7-6 23:40:48 | 显示全部楼层
嗯。。。。。。。。
开往春天的手扶拖拉机
回复

使用道具 举报

13

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-6-8
在线时间
2 小时
 楼主| 发表于 2015-7-7 10:14:38 | 显示全部楼层
回复【7楼】zuozhongkai:
---------------------------------
恩......................是什么意思?
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-7-7 11:17:34 | 显示全部楼层
回复【8楼】yzl:
---------------------------------
嗯。。。。。。的意思就是说你在5楼说的是对的。
开往春天的手扶拖拉机
回复

使用道具 举报

13

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-6-8
在线时间
2 小时
 楼主| 发表于 2015-7-7 11:34:49 | 显示全部楼层
回复【9楼】zuozhongkai:
---------------------------------
谢谢了.主要是0xE000ED04 这个寄存器我没有在cortexm3权威指南找到,所以很疑惑.
回复

使用道具 举报

4

主题

20

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-9-25
在线时间
7 小时
发表于 2016-11-25 00:47:54 | 显示全部楼层
    LDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)
    LDR     R1, =NVIC_PENDSVSET
    STR     R1, [R0]
  这三句 是在中断的任务切换函数中,先把PendSV中断悬起,
前提先设置好PendSV中断优先级最低,等待中断时间玩成之后,PendSV 中断开开始执行
这是我的理解
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-27 11:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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