找回密码
 立即注册
查看: 1800|回复: 15

怎样在中断返回时,返回到主程序中的某个位置。

[复制链接]
  • TA的每日心情
    无聊
    2024-2-14 08:42
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    4

    主题

    19

    回帖

    218

    积分

    中级会员

    积分
    218
    发表于 2023-3-24 09:50:53 | 显示全部楼层 |阅读模式
    本帖最后由 main 于 2023-4-6 15:26 编辑

    怎样在中断返回时,返回到主程序中的某个位置。而不是被中断的地方。
    有这个想法是因为这种情况:

    比如,有低功耗的需求,放在了在某个函数里面:


    if(满足低功耗条件)
    {
        //配置中断
        ...
        EA = 1;           <--必须提前允许相关的中断和总中断,否则唤醒不了了。
        ...                    <--如果这时候进入中断,而中断处理结果是:不能“马上”进入掉电模式,怎么办!!!
        ...
        NOP(4);
        //进入掉电模式
        PCON | = 2;  <--进入掉电模式,等待外部触发。
        NOP(4);
        ...
    }

    上述的概率虽然很小,但应该是会必然出现的。
    所以,想用修改中断中的RETI返回--提前修改堆栈和SP--返回到某个安全的地方,比如主程序中的某个位置。
    可能设计到C和汇编的混合编程,能否给出一个KEIL环境的范例?



    -------------------我看帖子还能编辑,再画个图表达一下,上面的描述太罗嗦,可能高手们没有意识到这是个问题(在低功耗的某些特定应用上)------------------
    无标题.png

    不用这种方式--修改SP--没其他办法能够很好的解决。

    回复 送花

    使用道具 举报

  • TA的每日心情
    无聊
    2024-2-14 08:42
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    4

    主题

    19

    回帖

    218

    积分

    中级会员

    积分
    218
     楼主| 发表于 2023-3-24 10:46:53 | 显示全部楼层
    虽然解决不了问题,但可以参考一下: ch.png

    该用户从未签到

    551

    主题

    9441

    回帖

    1万

    积分

    管理员

    积分
    13983
    发表于 2023-3-24 11:01:50 | 显示全部楼层
    映像以前课程设计时,干过

    CLR  EA
    POP ?
    POP ?
    //先把应该返回的地址清了

    MOV  DPTR ,#到哪
    然后
    PUSH  DP ?
    PUSH DP ? 啥
    //瞒天过海的放上你的去处


    RETI   
    //清中断优先级,到目标地

    2级中断优先级就得模仿2次这样,要清可能挂在那的中断优先级

    15年不干具体的技术,全忘了


  • TA的每日心情
    无聊
    2024-2-14 08:42
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    4

    主题

    19

    回帖

    218

    积分

    中级会员

    积分
    218
     楼主| 发表于 2023-3-24 11:11:29 | 显示全部楼层
    神农鼎 发表于 2023-3-24 11:01
    映像以前课程设计时,干过
    POP ?
    POP ?

    是的,甚至不用POP,因为你不知道,现在堆到哪一层了,
    直接改堆栈,改SP。然后让蛋骗鸡RETI到想去的地方。
    ----
    这个必开中断,才能唤醒掉电模式,我想,可能算是MCS51/STC考虑不周。但这种编程可以弥补过去。就是在C环境里,有点麻烦了。

    该用户从未签到

    46

    主题

    3020

    回帖

    6807

    积分

    超级版主

    积分
    6807
    发表于 2023-3-24 14:23:24 | 显示全部楼层
    汇编时代,做过,是为了做RTOS,但是现在不建议这样做,可能会让你的程序存在极大隐患的。当然想研究是可以的,可以参考我们的FREE-RTOS的底层切换任务部分程序。
    进入睡眠模式,我都建议放在主程序大循环最后位置,进入点掉模式省电,跟中断返回没有关系。
  • TA的每日心情
    无聊
    2024-2-14 08:42
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    4

    主题

    19

    回帖

    218

    积分

    中级会员

    积分
    218
     楼主| 发表于 2023-3-24 17:54:13 来自手机 | 显示全部楼层
    梁工 发表于 2023-3-24 14:23
    汇编时代,做过,是为了做RTOS,但是现在不建议这样做,可能会让你的程序存在极大隐患的。当然想研究是可以 ...

    实际也很有必要啊,不是为了研究才提出这个问题。

    如果不用这种方法,怎样才能做到 正确的处理随时到来的外部触发引起的一系列处理流程,而且能避免错误的进入掉电模式,导致上述流程被中断。

    举个例子,外部触发是一个'解析-处理-回应'的一系列流程的开始,在一楼例子中这个位置发生了外部触发,进入中断处理程序,打开了定时器串口准备好了一切,想大干一场,结果中断返回到一楼例子中这个地方后,掉电了。

    低功耗是必须要的,解码处理是随时发生的,常规编程方式没法同时解决啊。

    我一个项目遇到了这个需求,虽然出问题概率不高,紧要程度也不大,但要追求完美也要解决这问题呀。

    点评

    不明白你为什么会“错误的进入掉电模式”? 单片机退出中断会回到被中断的地方继续执行代码,不会跑到别的地方去,那样还了得。  详情 回复 发表于 2023-3-24 23:31

    该用户从未签到

    46

    主题

    3020

    回帖

    6807

    积分

    超级版主

    积分
    6807
    发表于 2023-3-24 23:31:13 | 显示全部楼层
    main 发表于 2023-3-24 17:54
    实际也很有必要啊,不是为了研究才提出这个问题。

    如果不用这种方法,怎样才能做到 正确的处理随时到来 ...

    不明白你为什么会“错误的进入掉电模式”?
    单片机退出中断会回到被中断的地方继续执行代码,不会跑到别的地方去,那样还了得。

    该用户从未签到

    37

    主题

    80

    回帖

    451

    积分

    中级会员

    积分
    451
    发表于 2023-3-26 08:15:45 | 显示全部楼层
    C语言虽然可以,”goto 你想去的地方“,详细你可以百度,但是这个指令在C语言里用容易跑飞,汇编比较可靠
  • TA的每日心情
    无聊
    2024-2-14 08:42
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    4

    主题

    19

    回帖

    218

    积分

    中级会员

    积分
    218
     楼主| 发表于 2023-3-27 09:40:03 | 显示全部楼层
    梁工 发表于 2023-3-24 23:31
    不明白你为什么会“错误的进入掉电模式”?
    单片机退出中断会回到被中断的地方继续执行代码,不会跑到别 ...

    我是说在项目逻辑方面,“错误”的进入了掉电模式,而导致无法进一步做处理。
    对于单片机而言,这不算“错误”。

    问题是,处理此类问题(低功耗+实时被唤醒后做后续系列动作)。因单片机内部处理的相关逻辑(必须先开中断才能进入掉电模式等待外部唤醒),单纯用C不能做到完美符合项目逻辑。
  • TA的每日心情
    无聊
    2024-2-14 08:42
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    4

    主题

    19

    回帖

    218

    积分

    中级会员

    积分
    218
     楼主| 发表于 2023-3-27 09:48:07 | 显示全部楼层
    sky999 发表于 2023-3-26 08:15
    C语言虽然可以,”goto 你想去的地方“,详细你可以百度,但是这个指令在C语言里用容易跑飞,汇编比较可靠 ...

    对于单片机而言,GOTO,不会导致任何错误。不会跑飞。任何语句都有跑飞的概率,至于goto不一定比其他语句概率大。

    对于人,goto 会让“人”头晕,而编出错误项目逻辑的代码。

    所以这种跑飞(用goto语句),是指人脑跑飞。
    ------------------------------------------------------------
    单片机受到干扰的跑飞,和goto并没有什么关系。
    汇编可靠?我觉得也未必。

    点评

    虽然我用单片机超过30年,但还是能力、水平有限,看不懂你的描述,太高深。 我用C语言,基本不用goto。  详情 回复 发表于 2023-3-27 12:05
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-16 06:56 , Processed in 0.085705 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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