找回密码
 立即注册
查看: 991|回复: 6

函数被打断,局部变量数组怎么保存

[复制链接]

3

主题

0

回帖

21

积分

新手上路

积分
21
发表于 2025-3-7 14:40:46 | 显示全部楼层 |阅读模式
请问对于如下函数,当test1执行过程中被中断,需要保护现场,其中的20字节数组是怎么保存的。如果是直接入栈,那么数组较大时比如100、1000还是直接入栈吗。

void test1(void)
{
  int a[20] = { 0 } ;
  ..........
}

int main()

{
   ......
   
   while(1)
   {
      .......
      test1();
       .........
   }
}
回复

使用道具 举报 送花

3

主题

2842

回帖

1444

积分

等待验证会员

积分
1444
发表于 2025-3-7 14:43:00 | 显示全部楼层
在函数`test1`执行过程中被中断时,保护现场的关键在于保存当前函数的局部变量和状态。对于20字节的数组,其保存方式取决于具体的处理器架构和编译器实现。通常情况下,编译器会在栈上为局部变量分配空间,并在中断发生时将栈指针(SP)及相关寄存器压栈保存。

具体而言,中断发生时,处理器会自动将程序计数器(PC)和状态寄存器(PSW)等关键寄存器压栈。随后,中断服务例程(ISR)会保存其他可能被修改的寄存器,包括栈指针(SP)。对于局部变量,由于它们已经在栈上分配,中断发生时栈空间会被保留,确保局部变量的值不被破坏。

因此,20字节数组的保存是通过栈空间的保留实现的,中断处理完成后,栈指针恢复,局部变量的值得以保持。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

3

主题

2842

回帖

1444

积分

等待验证会员

积分
1444
发表于 2025-3-7 14:48:00 | 显示全部楼层
在函数执行过程中被中断时,局部变量的保存通常通过栈来实现。对于`test1`函数中的20字节数组,编译器会将其分配在栈帧中。当发生中断时,CPU会自动保存当前寄存器的状态(如程序计数器、栈指针等),并将控制权转移到中断服务例程(ISR)。由于数组是局部变量,其内容已经在栈中,因此无需额外操作。

对于较大数组(如100或1000字节),栈的容量可能成为问题。在这种情况下,建议使用动态内存分配(如`malloc`)或全局/静态数组,以避免栈溢出。此外,可以通过调整栈大小或优化数据结构来减少栈的使用。

总之,局部变量的保存依赖于栈,但对于大数组,需考虑栈容量和内存管理策略。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

已绑定手机

25

主题

644

回帖

4395

积分

论坛元老

积分
4395
发表于 2025-3-9 08:41:19 | 显示全部楼层
理论上就是入栈,对于超大的数组就不清楚了,盛不下他咋整
回复

使用道具 举报 送花

1

主题

17

回帖

3199

积分

论坛元老

积分
3199
发表于 2025-3-9 17:50:42 | 显示全部楼层

局部变量本来就是栈里,谈不上什么入栈。被中断的时候保存现场由中断程序负责,也不是被中断程序负责的,中断程序只需要注意自己使用的寄存器之类的不要改变就可以了。

回复

使用道具 举报 送花

已绑定手机

3

主题

28

回帖

293

积分

中级会员

积分
293
发表于 6 天前 | 显示全部楼层
  1. DELAY10US:                        ;@24.000MHz
  2.         NOP
  3.         PUSH        30H
  4.         MOV                30H,#77
  5. NEXT:
  6.         DJNZ        30H,NEXT
  7.         POP                30H
  8.         RET
复制代码
看一下这个汇编,因为被调用的延时10us函数需要用到地址30H,所以需要将30H地址上之前的内容压栈,即把 30H 地址里的数据保存到当前 SP 指向的堆栈区域
回复

使用道具 举报 送花

已绑定手机

284

主题

490

回帖

2562

积分

金牌会员

积分
2562
发表于 6 天前 | 显示全部楼层
这种情况就不用保护了,什么保护不保护的跟你没关系
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-22 04:07 , Processed in 0.079691 second(s), 78 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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