我正在为他们的 ARM 系列微控制器评估飞思卡尔的 Kinetis Design Studio。我正在看一个例子 作为我第一个“闪烁 LED”项目的基础。当使用在我的主程序和 ISR(例如计数器)之间共享的变量时,我通常会在 main.c 中定义一个 volatile 全局变量,并将其作为 ISR 中的 extern 引用。他们的例子正好相反,他们也没有使用 volatile 关键字。我从来没有见过这样做的。这有优势吗?顺便说一句,无论哪种方式,我的程序都可以正常工作。
问问题
424 次
2 回答
4
缺失volatile
是一个错误(尽管很常见),它本身应该是一个质量警告。选择在何处实例化全局是任意的,但从内聚的角度来看,将与中断相关的数据与中断一起保存是有意义的。也就是说,使用全球数据本身就表明质量和实践存在问题。
使用数据封装的更好模式是:
中断.c
...
volatile static int counter = 0 ;
void interruptHandler()
{
counter++ ;
}
int interruptCounter{ return counter } ;
...
中断.h
...
extern int interruptCounter() ;
...
主程序
#include "interrupt.h"
...
int icount = interruptCount() ;
...
于 2015-06-11T22:26:52.017 回答
1
我不知道codewarrior套件。然而,一般来说,volatile
它告诉编译器变量在程序代码给出的正常控制流之外发生了变化。
从历史上看,嵌入式编译器对于不使用“易失性”和/或实施一些策略来支持不了解优化和“忘记”的没有经验的程序员是相当宽容的volatile
。然而,这将导致代码优化不佳,特别是对于 ARM 平台(HC08&Co MCU 的问题较小,因为无论如何都必须从内存中加载每个变量)。
虽然 CW 可能仍然那么宽容,但像 gcc 这样高度优化代码的编译器并没有那么宽容,而且优化得更加激进。例如,如果您忘记volatile
了此类编译器或设置了障碍,您可能会得到一个空的主循环。
即使您的代码目前运行良好,一旦您启用优化或更改次要(可能不相关)方面,这可能会改变。
一位长期嵌入式开发人员的建议非常好:使用volatile
. 尽量少用且经过深思熟虑(可以在此处找到更多详细信息),但要使用它!
于 2015-06-11T21:32:06.893 回答