【发布时间】:2022-01-09 17:33:59
【问题描述】:
如何确保 ISR 内的堆栈对齐? arm C 编译器是否在 ISR 中强制堆栈对齐?
例如,在我的理解中,函数中的局部范围变量被推入堆栈。假设您有一个 3 字节的 char 数组,然后调用了 ISR。在该 ISR 中调用另一个函数,该函数需要 4 字节的堆栈对齐。
ARM 编译器是修复它还是坏了?
我提出这个问题的动机是我在 ISR 中遇到了 fprintf 问题,我认为这可能是堆栈对齐问题。我正在为atsam3x 设备进行编译,但在 SO 问题中没有那么多标签的空间。
【问题讨论】:
-
ISR = 中断服务程序?
-
您使用的是什么 [特定] 处理器和操作系统? [隐藏的] ISR prolog/epilog 代码将负责堆栈对齐。您的问题是 [可能] 您可以不在 ISR 中执行
fprintf。它 [可能] 遇到了与fprintf在 [linux] 信号处理程序中存在的相同问题。见:man signal-safety -
另外,请注意
fprintf相对较慢。 ISR 应该很快以保持尽可能小的延迟。所以,即使你可以,你为什么要在 ISR 中做fprintf?您可能希望 ISR 将它获取的数据存储在环形队列中。基础级代码可以从此队列中提取数据并发出fprintf。我会编辑您的问题并发布更多关于您实际尝试做的事情。 -
当我只使用整数而不是打印浮点数时它似乎有效,所以我认为这可能是字节对齐的问题。据我了解,浮点数在字符串转换之前升级为双精度。 ISR 创建一个字符串,该字符串被复制到队列中进行传输。
-
即使你有一个
char arr[3],一个健全的编译器也不会错位堆栈,看看它的 asm 输出。更可能的问题是试图调用像fprintf这样需要从 ISR 内部获取锁的函数。如果FILE*的锁已经被占用了怎么办?
标签: atsam3x c arm interrupt-handling cortex-m