同一份代码会有一些轻微改动,在ubuntu下执行可以正常运行,烧录到hi3861开发板中执行就会堆栈溢出,问题出现在sscanf函数上,注释掉就不会溢出,请教堆栈溢出的原因,谢谢
#ifndef __DRIVER_UART_GPS_H
#define __DRIVER_UART_GPS_H
#include <stdio.h>
#include <string.h>
#define GPS_LEN 180 //read GPS data length
/*GPS 原始数据结构体*/
typedef struct __gps_original_struct__
{
unsigned int time; /*GPS 定位时间*/
float latitude; /*纬度*/
float longitude; /*经度*/
char quality; /*GPS质量指示符*/
int satellites; /*卫星数*/
float hdop; /*水平精度因子*/
float altitude; /*海拔高度*/
}GPS_OS;
int driver_read_gps( ); //读取GPS数据
#endif
#include "driver_uart_gps.h"
GPS_OS gps_osdata; // 定义原始数据结构体变量
int driver_read_gps() //读取GPS数据
{
char buff[GPS_LEN]="$GNGGA,075245.00,3155.91710942,N,11848.93259952,E,1,06,2.8,6.5719,M,1.9232,M,,,2.9*4C"; //模拟接收到的GPS数据帧
char *ptr =NULL;
//GPS数据过渡变量
float utc=0; /*GPS 定位时间*/
float lat=0; /*纬度*/
float lon=0; /*经度*/
char qual=0; /*GPS质量指示符*/
int sats; /*卫星数*/
float hor; /*水平精度因子*/
float alt; /*海拔高度*/
printf("buff:%s\n",buff);
printf("bufflen:%ld\n",strlen(buff));
printf("buffsize:%ld\n",sizeof(buff));
if(NULL==(ptr=strstr(buff,"$GNGGA")))
{
printf("location error\n");
memset(buff,0,sizeof(buff));
ptr=NULL;
return -1;
}
printf("ptr:%s\n",ptr);
/*使用sscanf函数为字符串输入,意思是将ptr内存单元的值作为输入分别输出到后面的结构体成员*/
sscanf(ptr,"$GNGGA,%f,%f,N,%f,E,%c,%d,%f,%f,*",&utc,&lat,&lon,&qual,&sats,&hor,&alt);
memset(&gps_osdata,0,sizeof(gps_osdata));
gps_osdata.time=(int )utc;
gps_osdata.latitude=lat;
gps_osdata.longitude=lon;
gps_osdata.quality=qual;
gps_osdata.satellites=sats;
gps_osdata.hdop=hor;
gps_osdata.altitude=alt;
memset(buff,0,sizeof(buff));
return 0;
}
嵌入式系统里,栈空间分配的都比较小,你可以看看如何修改栈空间大小。或者先尝试一下,把函数里占用空间大的变量拿到函数外,做成全局变量,比如函数里定义的buff数组,全局变量不占用栈空间。
似乎sscanf底层实现机层不一样,用了会出错,就一次别用这么长或者干脆别用