繁体   English   中英

STM32上C中的全局变量

[英]Global variables in C on STM32

我正在一个项目中,需要在主函数中使用'extern'使用在某个文件(例如mylib.c)中声明的一个变量。 所有标头均随附保护字,以避免多个包含。 该变量是一个结构(在mylib.h中定义),其成员仅为浮点数和整数,并在主函数的开头进行了初始化。

进入主回路并进行一些工作后,一些无关的成员将获得随机值。

因此,我从main中的声明中删除了extern,而是将其放在mylib.c中的声明中。 而且有效。

Sim808.h

#ifndef _SIM808_H
#define _SIM808_H
typedef struct{
uint8_t GPRS_Active;

float gsm_latitude;
float gsm_longitude;
}SIM808;
void sendCmd(const char cmd[]);
void sim808_init(void);
void parse_gsm_location(uint8_t* line);
#endif

Sim808.c

#include "sim808.h"
SIM808 sim808;
void parse_gsm_location(uint8_t* line)
{
uint8_t commas=0,index=0;
uint16_t err;
if((err=atoi((const char*)line+12))!=0)
{
    printf("No coordinates received\n");
    if(err==404 || err==601)
        sim808.GPRS_Active=0;

    return;
}
while (line[index]!= '\0' && index <50)
    {
    if(line[index]==',')
    {
        commas++;
        switch (commas)
        {
            case 1:
                sim808.gsm_longitude=atof((const char*)(line+index+1));
                printf("Long:%f\n",sim808.gsm_longitude);   
            break;
            case 2:
                sim808.gsm_latitude=atof((const char*)(line +index+1));
                printf("Longitude%f     Latitude%f\n",sim808.gsm_longitude,sim808.gsm_latitude);
            break;
            case 3:
                sscanf((const char*)(line+index+1),"%4d/%2d/%2d",    (int*)&sim808.gsmDate.year,(int*)&sim808.gsmDate.month,
                    (int*)&sim808.gsmDate.day);
            break;
            case 4:
                sscanf((const char*)(line+index+1),"%2d/%2d/%2d",
                    (int*)&sim808.gsmTime.hours,(int*)&sim808.gsmTime.minutes,(int*)&sim808.gsmTime.seconds);
            break;
        }
    }
        index++;
    }
}

main.c中

#include "sim808.h"
extern SIM808 sim808;

int main(void)
{
  uint8_t response[150];
 //init functions
 while(1)
 {
  if(sim808.GPRS_Active==1)
    {
        sendCmd("AT+CIPGSMLOC=1,1\r\n");
        HAL_UART_Receive(&huart4,response,2,60000);//max response time is 1 min
        HAL_UART_Receive(&huart4,response,150,1000);//we dont need first 2 chars
        parse_gsm_location(response);
        memset((void*)response,0,150);
    }
    else
        sim808_init();
  }
}

如您所见,成员GPRS_Active在我的代码中只能接收1或0。 使用printf,它在第一次迭代后变为242。 有人可以解释吗? 这可以是编译器错误吗? 谢谢。

这是编译器问题的机会很小。 您的变量更有可能被代码的某些部分修改了。 尽量避免使用全局变量,因为它们的作用域最大。

您是否在同名地方使用局部变量?
您是否检查过地图文件或在放置它的调试器中?

您可以使用调试器功能数据监视程序,如果特定地址的数据发生更改,则会中断该监视程序,以帮助您跟踪此问题。

使用全局变量时,请勿在.h文件中声明它们,以避免出现多个包含的问题。 您当然可以找到一些技巧来在.h中进行声明,但是我认为这使事情变得如此复杂。 所以试试这个:

在mylib.c中:

int myGlobalVariable;

在main.c中

extern int myGlobalVariable;

int main(void)
{
    myGlobalVariable = 5;
}

如果仍然有问题,请尝试增加堆栈的大小。 如果堆栈不够大,则可能会被其他数据覆盖。

如果在任何代码中使用memset或memcpy,请确保length参数正确。 memset和memcpy非常危险,您可以轻松地在不需要的地方写一些内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM