精华内容
下载资源
问答
  • STM32全局变量定义和声明

    万次阅读 2020-03-19 17:04:11
    今天在写SysTcik_Handler()这中断函数时,总是报错,明明在开头定义全局变量extern u16 ntime,(ntime–写在stm32f10x_it.c的systick中断函数中)但是编译时总是报错,百度之后才有了解决方法,STM32学习009_...
           STM32全局变量的定义和声明
    

    今天在写SysTcik_Handler()这个中断函数时,总是报错,明明在开头定义的全局变量extern u16 ntime,(ntime–写在stm32f10x_it.c的systick中断函数中)但是编译时总是报错,百度之后才有了解决方法,STM32学习009_全局变量的定义和声明
    之前也注意到过extern变量,但是没有仔细思考过它的使用方法,今天碰到了,一定要把它弄明白,把这个关键字的一般作用弄清楚(仅仅是一般作用,C的博大精深不敢妄谈);
    当你建立一个头文件库时,经常会遇到一个问题,就是在A文件中定义一个temple变量,想把它的值传递给B文件使用,但是A文件操作中函数又不可以带返回参数,比如说中断服务函数,那该怎么办?如果你把temple定义在A中,然后让A.h和B.h包含在includes.h中,然后把includes.h放在A.c和B.c中单个编译是没有问题的,但是链接的时候会出现问题,
    “Symbol temple multiply defined(by A.o and B.o)”
    意思是这个变量被多次定义了!!!
    解决的方法是:
    在A中定义temple变量后,在B中用extern 声明一下就可以了,例如:
    1.在A中定义temple 并且赋值:u16 temp2=0;
    STM32学习009_全局变量的定义和声明
    在这里插入图片描述
    2.在B中声明extern u16 temp2;
    在这里插入图片描述
    STM32学习009_全局变量的定义和声明
    这里只是声明,不再赋值,否则会报错!
    Symbol temp2 multiply defined (by catch_pwm.o and app.o)

    这里要注意变量定义和变量声明的区别:
    变量定义使用“数据类型+变量名称”的形式,编译器需要给它分配内存单元的;
    而变量声明使用“extern 变量类型+变量名称”的形式,是告诉编译器我这个变量将在其他外部C文件中定义,我这里只是在外部用它。编译器就不会给它分配内存空间,而等到真正遇到变量定义时再给它分配内存空间。

    //以下是“聚海”de帖子///
    1、普通变量定义成全局变量
    如果是普通类型,完全可以不用*.h文件,直接在*.c文件中定义,在调用文件处用extern 声明,因为对于普通类型,编译器是可以识别的。比如在一个 my.c文件中,我定义了char name[10];那么在别的文件中只要用extern char name[](由于是声明,一位数组可以省略大小,但不建议用指针,比较指针和数组是两回事)外部声明就可以了,告诉编译器这个变量我已经定义过了,具体怎样,你慢慢找吧。这符合常理,因为char是编译器能自主识别的类型。
    2、自定义结构体类型定义成全局变量
    不同于普通类型,如果不预先通知编译器,编译器是不会识别你自定义的类型的。这个时候,.h文件便出现了。不是定义结构类型不占内存吗?那好,我大结构体的定义放在.h文件中,这样一来,无论你incude无数次,内存都不会被占用的。而且这样还有个好处,在别的文件中可以include这个*.h文件,这样,在这个文件中,编译器就可以识别你的自定义类型了,目的不就达到了? 假如我在global.h中定义了
    typedef struct _POSITION
    {
    int x;
    int y;
    }POSITION;
    那么我可以在一个global.c文件中实现全局变量的定义,不过要include那个*.h文件,比如

    include “global.h”
    POSITION current,;
    这样就定义了cunrrent这个变量,在别的文件中引用这个变量时,只要extern POSITION current;进行声明,然后就可以用了,不过这个文件也还得include “global.h” 因为如果不包含,在这个文件中是不识别POSITION类型的。

    1.如何引用一个已经定义过的全局变量?

    答:extern  可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

    2.全局变量可不可以定义在可被多个.C文件中?为什么?

    答:可以,在不同的C文件中以static形式来声明同名全局变量。  可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

    OVER!

    9

    展开全文
  • 在自己的产品测试中 子机正常模式下运行毫无问题 都正常 ...lcd花屏 肯定是全局变量自己变化了的 是内存泄露或者覆盖问题 串口接收死机 并非子机死机 ,而是串口接收不到数据了。 实验中 接收不到数...

    在自己的产品测试中 子机正常模式下运行毫无问题 都正常

    但是远程主机端 一直发送数据 ,就会导致产品lcd花屏 串口死机

    而且显示lcd花屏 串口后面才死机的的 两者死机间隔时间有长有短 不必深究,通过其他没有接在总线上的子机对比来看 是串口惹的货。

    lcd花屏 肯定是全局变量自己变化了的 是内存泄露或者覆盖问题

    串口接收死机 并非子机死机 ,而是串口接收不到数据了。

    实验中 接收不到数据的现象可以分为下面原因

    1 这里的接收不到数据我们不能单一的理解为串口中断死掉了 这是不可能的(通常情况下)

    2 我们接收中断被发射中断阻挡了即 发送中断 一直在发数据(之前是死循环等待发送完成 而呈现中有看门狗 所以这种情况也很小 不过现在我还是加上超时处理了)

    3 接收中断中接收的 管道形式的buf 一直接收超出了管道值 那么管道没有清空的同时 管道没有继续接收了 算是溢出了吧 同时造成了内存泄露(非常有可能)

    当前修改了修改了接收中断中数据进行初步过滤来处理每时每刻总线上的无用数据。

    当前修改了这个的方面测函数 程序正在测试中 耐心等待吧

    测试了 发现lcd不花屏了 但是某一时刻 还是出现了 “ 串口死掉 ”的现象

    然后我在程序中 估计仍然是接收问题 程序设计中管道接收满了 就不接收了 。即当子机数据只进不出的现象出现时 一段时间后管道就装满了 这之后 就造成了接收的数据丢掉了。当前的措施是管道移动 就是丢掉头上的数据 尾巴上放入新的数据 这样就的现象就是老的数据 你不来取 我就扔掉了。后面的新的数据 依次接入 当前思路是这样的 不知道行不行 待测试中

     

     

    展开全文
  • stm32下了解全局变量、局部变量、堆、栈对分区的了解各区特点stm32下实现对分区的了解 对分区的了解 在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,...

    stm32下了解全局变量、局部变量、堆、栈

    对分区的了解

    在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全局区中高地址分布着.bss段,低地址分布着.data段,其分布图如下:
    在这里插入图片描述

    各区特点

    一、栈区(stack)

    临时创建的局部变量存放在栈区。
    函数调用时,其入口参数存放在栈区。
    函数返回时,其返回值存放在栈区。
    const定义的局部变量存放在栈区。

    2、堆区(heap)

    堆区用于存放程序运行中被动态分布的内存段,可增可减。
    可以有malloc等函数实现动态分布内存。
    有malloc函数分布的内存,必须用free进行内存释放,否则会造成内存泄漏。

    3、全局区(静态区)

    全局区有.bss段和.data段组成,可读可写。

    4、.bss段

    未初始化的全局变量存放在.bss段。
    初始化为0的全局变量和初始化为0的静态变量存放在.bss段。
    .bss段不占用可执行文件空间,其内容有操作系统初始化。

    5、.data段

    已经初始化的全局变量存放在.data段。
    静态变量存放在.data段。
    .data段占用可执行文件空间,其内容有程序初始化。
    const定义的全局变量存放在.rodata段。

    6、常量区

    字符串存放在常量区。
    常量区的内容不可以被修改。

    7、代码区

    程序执行代码存放在代码区。
    字符串常量也有可能存放在代码区。

    stm32下实现对分区的了解

    通过在keil中编程,在串口通信中借助调试助手查看输出
    代码如下:

    #include "delay.h"
    #include "key.h"
    #include "sys.h"
    #include "usart.h"
    #include <stdlib.h>
    int k1 = 1;
    int k2;
    static int k3 = 2;
    static int k4;
    
    
     int main(void)
     { 
      static int m1=2, m2;
      int i = 1;
      char *p;
      char str[10] = "hello";
      char *var1 = "123456";
      char *var2 = "abcdef";
      int *p1=malloc(4);
      int *p2=malloc(4); 
     	u16 t;  
    	u16 len;	
    	u16 times=0;
    	free(p1);
      free(p2);
    	delay_init();	    	 //ÑÓʱº¯Êý³õʼ»¯	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
    	uart_init(115200);	 //´®¿Ú³õʼ»¯Îª115200
    	KEY_Init();          //³õʼ»¯Óë°´¼üÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
    	
     	while(1)
    	{
    			for(t=0;t<len;t++)
    			{ 
    				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//µÈ´ý·¢ËͽáÊø
    			}
    			USART_RX_STA=0;
    			times++;
    			if(times%500==0)
    			{
    	      printf("Õ»Çø-±äÁ¿µØÖ·\r\n");
    				printf("              i=%p\r\n", &i);
    				printf("              p=%p\r\n", &p);
    				printf("             str=%p\r\n", str);
            printf("\n¶ÑÇø-¶¯Ì¬ÉêÇëµØÖ·\r\n");
            printf("                 %p\r\n", p1);
            printf("                 %p\r\n", p2);
            printf("\r\n.bss¶Î");
            printf("\nÈ«¾ÖÍⲿÎÞ³õÖµ k2£º%p\r\n", &k2);
            printf("¾²Ì¬ÍⲿÎÞ³õÖµ k4£º%p\r\n", &k4);
            printf("¾²Ì¬ÄÚ²¿ÎÞ³õÖµ m2£º%p\r\n", &m2);
            printf("\r\n.data¶Î");
            printf("\nÈ«¾ÖÍⲿÓгõÖµ k1£º%p\r\n", &k1);
            printf("¾²Ì¬ÍⲿÓгõÖµ k3£º%p\r\n", &k3);
            printf("¾²Ì¬ÄÚ²¿ÓгõÖµ m1£º%p\r\n", &m1);
            printf("\r\n³£Á¿Çø\n");
            printf("ÎÄ×Ö³£Á¿µØÖ·     £º%p\r\n",var1);
            printf("ÎÄ×Ö³£Á¿µØÖ·     £º%p\r\n",var2);
            printf("\r\n´úÂëÇø\n");
            printf("³ÌÐòÇøµØÖ·       £º%p\n",&main);
    			}
    			delay_ms(10);   
    		}
    	}
    

    效果展示

    在调试助手上可以看到显示的信息
    在这里插入图片描述

    总结

    在stm32下了解全局变量、局部变量、堆、栈等概念,可以清楚的看到地址的变化。

    展开全文
  • 我有很多全局变量或者静态变量都需要存放在外部SDRAM时,如果按上一种方法岂不是定义每个变量都需要指定一个地址?万一自己指定的地址重复了岂不是厄运降来?经过3天的努力,我实现了一种方法,把程序的堆空间完全...
  • 最近在研究怎么把代码编译到自己想要的位置,然后只运行次就自宫,分享一下。 方法: void fun(void) __attribute((section(".ARM.__at_0x8100000"))); 方法二: #pragma arm section code=".ARM.__at_0x8100000...

    最近在研究怎么把代码编译到自己想要的位置,然后只运行一次就自宫,分享一下。
    这个是keil使用的编译器做法。

    方法一:

    void fun(void) __attribute((section(".ARM.__at_0x8100000")));

    方法二:

    #pragma arm section code=".ARM.__at_0x8100000"

    void fun(void)

    {

    }

    #pragma arm section

    定位变量:

    int val attribute((section(".ARM.__at_0x20000000"))) = 0x00;

    21.10.28更新一下大家做个参考,st官方写的,这个是把变量定位到ram指定区域的方法

    在这里插#if defined(__ICCARM__) /*!< IAR Compiler */
    
    #pragma location = 0x30040000
    ETH_DMADescTypeDef
        DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
    #pragma location = 0x30040060
    ETH_DMADescTypeDef
        DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
    #pragma location = 0x30040200
    uint8_t Rx_Buff[ETH_RX_DESC_CNT]
                   [ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */
    
    #elif defined(__CC_ARM) /* MDK ARM Compiler */
    
    __attribute__((at(0x30040000))) ETH_DMADescTypeDef
        DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
    __attribute__((at(0x30040060))) ETH_DMADescTypeDef
        DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
    __attribute__((at(0x30040200))) uint8_t
        Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffer */
    
    #elif defined(__GNUC__) /* GNU Compiler */
    
    ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((
        section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */
    ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((
        section(".TxDecripSection"))); /* Ethernet Tx DMA Descriptors */
    uint8_t            Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] 
        __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */
    入代码片
    
    展开全文
  • 二、STM32的USART串口通信程序实例三、C语言程序里全局变量、局部变量、堆、栈等概念,在ubuntu系统中编程,输出信息进行验证四、stm32的堆、栈、全局变量的分配地址 、基于寄存器与基于固件库的stm32 LED流水灯...
  • stm32xxxx.it.c 有一个按键中断,当每次按键时进行次数统计 把中断采集到的值在main.c函数中进行使用 那么就要在stm32xxxx.it.c中 uint8_t key_num=0; //定义边且赋值 在main.c中 extern uint8_t key_num; ...
  • STM32单片机extern全局变量

    千次阅读 2020-10-27 16:44:14
    当你建立一个头文件库时,经常会遇到一个问题,就是在A文件中定义一个temple变量,想把它的值传递给B文件使用,但是A文件操作中函数又不可以带返回参数,比如说中断服务函数,那该怎么办? 如果你把temple定义在A中...
  • 非 II 或 位操作 符号 作用 & 按位与 I 按位或 ^ 按位异或 ~ 按位取反 位左移 >> 位右移 stm32 中的C语言变量 十六进制 十进制 十六进制 十进制 数据类型 定义语句 占用空间 数值范围 位型 bit 一个字节 0,1 无符号...
  • stm32的堆、栈、全局变量的分配地址 在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全局区中高地址分布着.bss段,低地址分布着.data段。 总的...
  • STM32关于堆栈,局部变量全局变量内存分配的问题 开发环境:IAR for ARM 8.30.1 MCU:STM32F103RCT6 以一个简单的bootloader程序为例,先来看看map文件中的内存分配: ***************************************...
  • STM32 静态全局变量值不正常问题

    千次阅读 2020-06-17 00:39:37
    今天在调试按键驱动的过程中,使用Systick 定时器中断中每10ms 调用一次按键检测程序,在按键检测程序中按下时有一个定时器计时,具体程序如下所示。 void buttonScan(void) { static u8 sLastButtonState = ...
  • 项目使用STM32L051C8T6,遇到一个奇怪问题:当增加全局变量或将全局数组增大(仅是从7个数组元素增加到10个)或将某段代码定义为函数进行调用时,程序都会100%死机(不是偶尔死机),有时某个全局变量的值还被莫名...
  • ...想通过它实现的一个功能是,通过两个按键控制一个RGB灯的闪烁开始和停止。两个按键通过外部中断上升沿检测,贴一下最开始的代码。 void KEY1_IRQHandler(void){ //确保是否...
  • 哈佛和冯诺依曼,从STM32的const全局变量说起

    千次阅读 多人点赞 2017-07-22 13:22:01
      昨天在STM32程序中,把全局变量定义成const属性时,发现它所处的位置是在STM32内置的FLASH而非内置的SRAM中。顿时让我觉得十分奇怪,程序不都必须在RAM中运行?即使在静态常量区不也应该放在SRAM中?   ...
  • stm32变量定义

    千次阅读 2016-07-05 23:06:23
    、最近在玩stm32,用库(V3.5.0)开发,被 stm32变量定义搞的晕头转向,决心将其弄清楚。  在 stdint.h 文件里,我们可以清楚的看到:   typedef signed char int8_t; typedef signedshort int int16_t; ...
  • 第9章 STM32F407重要知识点数据类型,变量和堆栈 本章教程为大家介绍数据类型,变量和堆栈的相关知识。 目录 第9章 STM32F407重要知识点数据类型,变量和堆栈 9.1 初学者重要提示 9.2 数据类型 9.2.1 ANSI C和...
  • 补充:今天突然发现还有一种情况,变量一个.h文件里定义后,在另外的一个.h文件里做extern声明后也可以,后来发现,这两个.h文件都没有自己的.c文件以及都是在工程文件的同层路径而不是在模块的文件里面。...
  • STM32 keilC 局部变量和全局变量

    千次阅读 2013-05-15 22:48:05
    keil C中的局部变量是放在栈中,而栈大小在启动文件中设置好了的,所以在写函数的局部变量的时候不应该定义大的数组,不然栈不够装,就会就会导致局部变量的地址和全局变量的地址重叠。
  • 一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全局区中高地址分布着.bss段,低地址分布着.data段。 1、栈区(stack) 临时创建的局部变量存放在...
  • STM32 内存分配解析及变量的存储位置

    千次阅读 多人点赞 2020-04-09 00:41:54
    内存映射 在一些桌面程序中,整个内存映射...因此在一些嵌入式系统中,比如常用的STM32来讲,内存映射被划分为闪存段(也被称为Flash,用于存储代码和只读数据)和RAM段,用于存储读写数据。 STM32 的 Flash 和 RAM 地...
  • 一个函数内部定义变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使 用它们,在此函数以外是不能使用这些变量的,这称为局部变量。 使用局部变量注意以下问题:  不同函数中可以使用相同...
  • 文章目录、前言二、将变量定义到指定的内存2.1、将变量定义到DTCM内存2.2、将变量定义到RAM_D1内存三、STM32CubeIDE实用技巧之ld链接文件解读3.1、内存(MEMORY)3.2、段(Section)四、细节补充 、前言 在实际...
  • 使用STM32做机器人相关的应用,很经常遇到的一个情况就是希望能够实时的观察单片机中的变量,从而更直观的判断数据或算法的正确性,例如使用STM32+IMU做小车或无人机的姿态估计。 一个被广泛使用的方法是利用串口:...
  • SW4STM32 全局定义

    2017-12-29 08:20:00
    /*******************************************************************************... * SW4STM32 全局定义 * 说明: * 在解读B-L475E-IOT01程序的时候找不到USE_WIFI的宏定义,于是想应该是在哪里进行了宏...
  • STM32堆和栈及变量的存储理解 ...关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的。 那么,在赤裸裸的单片机下的堆和栈是...刚接手STM32时,你只编写一个 int main() { while(1); } BUILD://Prog...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,795
精华内容 2,718
关键字:

stm32定义一个全局变量