1

我正在为他们的 ARM 系列微控制器评估飞思卡尔的 Kinetis Design Studio。我正在看一个例子 作为我第一个“闪烁 LED”项目的基础。当使用在我的主程序和 ISR(例如计数器)之间共享的变量时,我通常会在 main.c 中定义一个 volatile 全局变量,并将其作为 ISR 中的 extern 引用。他们的例子正好相反,他们也没有使用 volatile 关键字。我从来没有见过这样做的。这有优势吗?顺便说一句,无论哪种方式,我的程序都可以正常工作。

4

2 回答 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 回答