硬汉嵌入式论坛

 找回密码
 立即注册
查看: 822|回复: 8
收起左侧

单片机中断返回,程序的执行路径问题

[复制链接]

3

主题

5

回帖

14

积分

新手上路

积分
14
发表于 2023-6-9 14:27:41 | 显示全部楼层 |阅读模式

      请教个单片机中断处理完毕返回后,程序的执行路径问题。
例如在主函数中写flash,函数如下:

void fmc_program(uint32_t *data, int data_len)
{
    /* unlock the flash program/erase controller */
    fmc_unlock();

    uint32_t address = FMC_USERCUSTOM_START_ADDR;
    /* program flash */
    while(address <= FMC_USERCUSTOM_END_ADDR) {
        if(data_len <= 0)
            break;
        fmc_word_program(address, *data);
        address += 4U;
        data++;
        fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGERR);
        data_len-=4;
    }
    /* lock the main FMC after the program operation */
    fmc_lock();
}


      写的flash数据比较大,在写Flash时,程序在执行address += 4U这一行。
这时产生了中断,中断处理完毕后,这时程序从哪运行?是address += 4U这一行?还是下一行        data++;?还是函数的第一行fmc_unlock();开始执行?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2023-6-9 15:49:27 | 显示全部楼层

回帖奖励 +10 个金币

C代码反映到汇编上,这个有好几条指令。

中断返回后执行的是当前被中断位置的下一条指令。你可以单步调试看汇编部分。
回复

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2023-6-25 13:56:35 | 显示全部楼层
eric2013 发表于 2023-6-9 15:49
C代码反映到汇编上,这个有好几条指令。

中断返回后执行的是当前被中断位置的下一条指令。你可以单步调 ...

硬汉哥,你好,对应到C语言的话,抛开中断重入,只考虑中断返回的情况,会不会出现语句address += 4U 或data++被执行两次的情况?
回复

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2023-6-25 13:59:03 | 显示全部楼层
eric2013 发表于 2023-6-9 15:49
C代码反映到汇编上,这个有好几条指令。

中断返回后执行的是当前被中断位置的下一条指令。你可以单步调 ...

还有从中断返回后,局部变量address 的值,会被初始化初值吗,还是保留原来的值,直到遇到}释放。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2023-6-25 15:36:27 | 显示全部楼层
chenshb 发表于 2023-6-25 13:56
硬汉哥,你好,对应到C语言的话,抛开中断重入,只考虑中断返回的情况,会不会出现语句address += 4U 或d ...

不会。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2023-6-25 15:37:49 | 显示全部楼层
chenshb 发表于 2023-6-25 13:59
还有从中断返回后,局部变量address 的值,会被初始化初值吗,还是保留原来的值,直到遇到}释放。

不会,中断抢占的话,中断里面局部变量会继续开新的栈空间。
回复

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2023-6-25 16:09:00 | 显示全部楼层
eric2013 发表于 2023-6-25 15:37
不会,中断抢占的话,中断里面局部变量会继续开新的栈空间。

也就是中断返回后,原中断局部变量的值是保留的对吧?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2023-6-25 16:10:02 | 显示全部楼层
chenshb 发表于 2023-6-25 16:09
也就是中断返回后,原中断局部变量的值是保留的对吧?

是的,除非栈溢出之类的问题,导致栈数据损坏。
回复

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2023-6-27 13:26:15 | 显示全部楼层
eric2013 发表于 2023-6-25 16:10
是的,除非栈溢出之类的问题,导致栈数据损坏。

硬汉哥好,问个中断重入的情况:比如定时器1毫秒中断,执行第一个1毫秒定时中断,假设任务时间较长,还未退出定时器中断,第2次定时器中断又到了,这时候程序会怎么运行?从第2个定时器中断的IRQHandler起始位置开始运行?开始执行第2个定时器中断,第1个定时器中断永久失效了嘛?
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 10:16 , Processed in 0.286358 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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