可以再c文件中 volatile uint8 Timer_1S,Timer_5S,Timer_10S,Timer_20S,Timer_40S;
在头文件中 extern volatile uint8 Timer_1S,Timer_5S,Timer_10S,Timer_20S,Timer_40S;
然后ISR的c文件中包含头文件,然后变量直接用就好了 extern 是声明,不是定义。所以只做extern volatile uint8 Timer_1S;然后就用Timer_1S=1; 不可以的。
中断的为何必须加volatile,得先知道volatile有什么作用。volatile是告诉编译器每次使用变量时都要重新读取该变量值,而不是使用缓存值。
所以当中断与主程序共享变量时,要使用volatile。因为主程序不知道该变量何时会被中断改变,只好每次都读取。
但是在你的代码中,没有看到哪个主程序使用了中断变量i。这种情况下,volatile没有必要,虽然也没有坏处。 本帖最后由 xizi 于 2013-1-11 03:19 编辑
百度百科举的例子与你的代码情况不一样,你的代码不会有两个地址问题。百度百科举的例子是数组,你的代码是单一变量。
首先说,“这俩次声明比如Timer_1S岂不是俩次......”证明你没有理解“定义”与“声明”的差别。
c文件中 volatile uint8 Timer_1S; 这是定义。
头文件中 extern volatile uint8 Timer_1S; 这是声明。
是一次定义,一次声明。不存在两次“声明”。
“定义”发生地址分配;而“声明”不发生地址分配,是表明该地址已经在别处发生了地址分配,请到其定义处去找变量。
语法上区分是,没有extern就是定义,有extern 就是声明。
然后说,数组与指针问题比较复杂。百度百科举的例子我也不是完全理解。
说的很详细,不错!!!! 学习一下....
页:
[1]