OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6633|回复: 9

extern用法

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-12-1
在线时间
0 小时
发表于 2014-12-1 18:08:42 | 显示全部楼层 |阅读模式
5金钱
我在sys.h中用了extern long m;在定时器timer.c中long m=0;当在定时器的中断服务函数里m进行累加后,在main()函数里我想直接用m的值,怎么不可以啊?并没有显示累加后的m值!!求指教

最佳答案

查看完整内容[请看2#楼]

volatile long m;volatile ertern long m;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2014-12-1 18:08:43 | 显示全部楼层
volatile long m;volatile ertern long m;
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-12-1
在线时间
0 小时
 楼主| 发表于 2014-12-2 10:17:24 | 显示全部楼层
回复【2楼】as564335sa:
---------------------------------
谢谢,还是没有解决这个问题,要不我发给你代码 你帮我看看下
回复

使用道具 举报

12

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2014-4-6
在线时间
46 小时
发表于 2014-12-2 10:20:55 | 显示全部楼层
你试一试把extern long m;放到main()函数的前面
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-12-1
在线时间
0 小时
 楼主| 发表于 2014-12-2 10:22:19 | 显示全部楼层
但是我这个m变量 ,是用来在定时器中断函数里面 用累加作用的
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-12-1
在线时间
0 小时
 楼主| 发表于 2014-12-2 10:26:17 | 显示全部楼层
还是不行,如果我让定时器在1秒内溢出一万次的话,是不是意味着中断服务函数代码不能写多了
回复

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2014-12-2 12:09:44 | 显示全部楼层
你把long m=0;放定时器了?那一中断进去不清零了,加static
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-12-1
在线时间
0 小时
 楼主| 发表于 2014-12-2 12:33:03 | 显示全部楼层
其实,我就是想测试一个继电器吸合的延时时间,不用定时器的话,也可以做的出来,就是用#include "delay.h"
#include "sys.h"
#include "usart.h"
 int main(void)
 {
  long i=0;
long n=0;
float t1,t2;
delay_init();       
uart_init(9600);  
  
 while(1)
{
  if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==0&i==0)
  {   
  delay_ms(10);
  GPIO_SetBits(GPIOB,GPIO_Pin_0);
    while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)==0)
         {
          i++;
         }
printf("\r\n?????÷?ü?????±\r\n");
    t1=(float)i/10000;
  printf("%f",t1);
      }
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==1&i!=0)
  {
  GPIO_ResetBits(GPIOB,GPIO_Pin_0);
    while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)==1)
   {
    n++;
   }
printf("\r\n?????÷???????±\r\n");
    t2=(float)n/10000;
  printf("%f",t2);
        i=0;
        n=0;  
}
  }
}这里面的i和n能换算成具体时间的吗
好像还需要了解指令周期什么的?
回复

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2014-12-2 12:58:47 | 显示全部楼层
用C语言编写程序的时候,我们经常会遇到这样一种情况:希望在头文件中定义一个全局变量,然后包含到两个不同的c文件中,希望这个全局变量能在两个文件中共用。

  举例说明:项目文件夹project下有main.c、common.c和common.h三个文件,其中common.h文件分别#include在main.c和common.c文件中。现在希望声明一个字符型变量key,在main.c和common.c中公用。

  有人想,既然是想两个文件都用,那就在common.h中声明一个unsigned char key,然后由于包含关系,在main.c和common.c中都是可见的,所以就能共用了。

      想起来确实有道理,但是实际写出来,我们发现编译的时候编译器提示出错,一般提示大概都类似于:Error: L6200E: Symbol key multiply defined (by common.o and main.o).也就是说编译器认为我们重复定义了key这个变量。这是因为#include命令就是原封不同的把头文件中的内容搬到#include的位置,所以相当于main.c和common.c中都执行了一次unsigned char key,而C语言中全局变量是项目内(或者叫工程内)可见的,这样就造成了一个项目中两个变量key,编译器就认为是重复定义。

      正确的解决办法:使用extern关键字来声明变量为外部变量。具体说就是在其中一个c文件中定义一个全局变量key,然后在另一个要使用key这个变量的c文件中使用extern关键字声明一次,说明这个变量为外部变量,是在其他的c文件中定义的全局变量。请注意我这里的用词:定义和声明。例如在main.c文件中定义变量key,在common.c文件中声明key变量为外部变量,这样这两个文件中就能共享这个变量key了。

    (1)main.c文件

  #include "common.h"
  unsigned char key;

 

  (2)common.c文件:

 

  #include "common.h"
  extern unsigned char key;

   其实就是变量定义和变量声明的区别,变量定义使用“数据类型+变量名称”的形式,编译器需要给他分配内存单元的;而变量声明使用“extern 变量类型+变量名称”的形式,是告诉编译器我这个变量将在其他外部c文件中定义,我这里只是在外部用它。编译器就不给他分配内存空间,而等到真正遇到变量定义的时候再给他分配内存空间。
总有一天,要为自由而活
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-12-1
在线时间
0 小时
 楼主| 发表于 2014-12-2 13:02:41 | 显示全部楼层
谢谢你啊!!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 12:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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