找回密码
 立即注册
查看: 300|回复: 4

关于I2C中断问题 | 已解决

[复制链接]

该用户从未签到

6

主题

17

回帖

118

积分

注册会员

积分
118
发表于 2023-11-22 19:05:23 | 显示全部楼层 |阅读模式
i2c从机模式下的范例程序中, i2c中断使用了_push_, _pop_, 请问其作用是什么?, 可否不要这三句?
void I2C_Isr() interrupt 24
{
    _push_(P_SW2);
    P_SW2 |= 0x80;
    .....
    .....
    _pop_(P_SW2);
}


回复 送花

使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 170 天

    [LV.7]常住居民III

    14

    主题

    53

    回帖

    778

    积分

    高级会员

    积分
    778
    发表于 2023-11-26 11:18:02 | 显示全部楼层
    _push_和_pop_,在I2C中断处理程序中,它们可能用于保存和恢复中断发生时的系统状态。

    _push_操作通常会将参数推入一个堆栈或队列中,以保存当前的执行上下文(例如CPU的寄存器状态、堆栈指针等)。在中断处理程序中,这可以确保中断处理程序在执行过程中,不会影响到中断发生时的原始执行上下文。

    _pop_操作则从堆栈或队列中弹出一个元素,通常是恢复执行上下文。在中断处理程序中,这可以确保中断处理程序在处理完毕后,可以恢复到中断发生时的状态,以便继续执行原先的程序。

    如果你省略这三句,那么中断处理程序可能会改变原始的执行上下文,这可能会导致在中断处理程序执行完毕后,程序的状态与中断发生时的状态不一致,从而引发错误。

    总的来说,_push_和_pop_在这里的作用是用于保存和恢复中断发生时的系统状态,以避免中断处理程序对原始状态产生影响。因此,除非你有明确的理由和充分的了解,否则通常不建议省略这三句。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:59
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1343

    回帖

    4187

    积分

    论坛元老

    积分
    4187
    发表于 2023-11-26 12:52:03 | 显示全部楼层
    因为I2C寄存器是扩展寄存器,所以在中断里面也要确保扩展寄存器处于开启状态。
    如果在程序初始化时就开启扩展寄存器访问使能,并且后续没有再关闭的话,这三句可以不要。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    6

    主题

    17

    回帖

    118

    积分

    注册会员

    积分
    118
     楼主| 发表于 2023-11-27 09:06:43 | 显示全部楼层
    sujingliang 发表于 2023-11-26 11:18
    _push_和_pop_,在I2C中断处理程序中,它们可能用于保存和恢复中断发生时的系统状态。

    _push_操作通常会将 ...

    学到了学到了
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    6

    主题

    17

    回帖

    118

    积分

    注册会员

    积分
    118
     楼主| 发表于 2023-11-27 09:06:59 | 显示全部楼层
    乘风飞扬 发表于 2023-11-26 12:52
    因为I2C寄存器是扩展寄存器,所以在中断里面也要确保扩展寄存器处于开启状态。
    如果在程序初始化时就开启扩 ...

    感谢感谢
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-18 22:41 , Processed in 0.057919 second(s), 44 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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