OpenEdv-开源电子网

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

OSCtxSw OSIntCtxSw汇编代码相同,怎么体现出区别的?

[复制链接]

4

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-8-16
在线时间
6 小时
发表于 2016-8-16 13:45:54 | 显示全部楼层 |阅读模式
1金钱
  OSCtxSw OSIntCtxSw汇编代码相同,怎么体现出区别的?
osctxsw()需要保存出口状态。
osintctxsw()不需要。
但是汇编代码都一样,为什么?


OSCtxSw
        PUSH    {R4, R5}
        LDR     R4, =NVIC_INT_CTRL      ;´¥·&#162endSVÒì³£ (causes context switch)
        LDR     R5, =NVIC_PENDSVSET
        STR     R5, [R4]
        POP     {R4, R5}
        BX      LR

OSIntCtxSw
        PUSH    {R4, R5}
        LDR     R4, =NVIC_INT_CTRL      ;´¥·&#162endSVÒì³£ (causes context switch)
        LDR     R5, =NVIC_PENDSVSET
        STR     R5, [R4]
        POP     {R4, R5}
        BX      LR
        NOP


最佳答案

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

在不支持pendsv的芯片上面有差异。 在M系列上面,所有切换都当成统一由pendsv实现。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3693
金钱
3693
注册时间
2011-5-23
在线时间
2008 小时
发表于 2016-8-16 13:45:55 | 显示全部楼层
在不支持pendsv的芯片上面有差异。

在M系列上面,所有切换都当成统一由pendsv实现。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-8-16
在线时间
6 小时
 楼主| 发表于 2016-8-16 15:07:54 | 显示全部楼层
aozima 发表于 2016-8-16 14:39
在不支持pendsv的芯片上面有差异。

在M系列上面,所有切换都当成统一由pendsv实现。

你好,OSCtxSw OSIntCtxSw这两个函数都在临界区里,这两个函数需要触发pendsv中断处理函数。临界区不是不能产生中断了吗?
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-8-16
在线时间
6 小时
 楼主| 发表于 2016-8-16 15:24:58 | 显示全部楼层
是又在什么地方打开中断啦吗?
捕获.JPG
回复

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3693
金钱
3693
注册时间
2011-5-23
在线时间
2008 小时
发表于 2016-8-16 15:30:15 | 显示全部楼层
gxg0504 发表于 2016-8-16 15:07
你好,OSCtxSw OSIntCtxSw这两个函数都在临界区里,这两个函数需要触发pendsv中断处理函数。临界区不是不 ...

名称就叫pend呀,在这里触发当然是不会背执行。

等所有ISR都执行完了,才轮到pend
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-8-16
在线时间
6 小时
 楼主| 发表于 2016-8-16 15:44:52 | 显示全部楼层
aozima 发表于 2016-8-16 15:30
名称就叫pend呀,在这里触发当然是不会背执行。

等所有ISR都执行完了,才轮到pend

就是说调度器函数  中的任务切换函数OS_TASK_SW(); 在临界区中,PendSV中断不响应,当退出临界区时Pendsv才进行任务切换工作,这样理解对吗?

void  OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3u                           /* Allocate storage for CPU status register     */
    OS_CPU_SR  cpu_sr = 0u;
#endif



    OS_ENTER_CRITICAL();
    if (OSIntNesting == 0u) {                          /* Schedule only if all ISRs done and ...       */
        if (OSLockNesting == 0u) {                     /* ... scheduler is not locked                  */
            OS_SchedNew();
            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
            if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy     */
#if OS_TASK_PROFILE_EN > 0u
                OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task      */
#endif
                OSCtxSwCtr++;                          /* Increment context switch counter             */
                OS_TASK_SW();                          /* Perform a context switch                     */
            }
        }
    }
    OS_EXIT_CRITICAL();
}
回复

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-12-7
在线时间
3 小时
发表于 2016-12-2 22:19:47 | 显示全部楼层
没看懂为什么这俩相同?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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