1085|43

3049

帖子

0

资源

纯净的硅(中级)

程序跑飞的问题

 

我用STM32F103VCT6写程序。

 

有一下一段代码:

void Window0_Wy(void)
{
	char s[8],j,i=0;
	float ShiftValue0;						//位移值

	switch(SP_Read.WyBdDs.Uint)
	{
		case 1:
			if(Encoder.Uint<SP_Read.Encoder_Sample[0].Uint)
				ShiftValue0=0.0;
			else if(Encoder.Uint<SP_Read.Encoder_Sample[1].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[0].Uint)) * \
								SP_Read.Encoder_Xsh1[0].Float;
			else
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[1].Uint)) * \
								SP_Read.Encoder_Xsh1[0].Float+(float)(SP_Read.WyBzz[0].Uint);
			break;
		case 2:
			if(Encoder.Uint<SP_Read.Encoder_Sample[0].Uint)
				ShiftValue0=0.0;
			else if(Encoder.Uint<SP_Read.Encoder_Sample[1].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[0].Uint)) * \
								SP_Read.Encoder_Xsh1[0].Float;
			else if(Encoder.Uint<SP_Read.Encoder_Sample[2].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[1].Uint)) * \
								SP_Read.Encoder_Xsh1[1].Float+((float)SP_Read.WyBzz[0].Uint);
			else 
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[2].Uint)) * \
								SP_Read.Encoder_Xsh1[1].Float+((float)SP_Read.WyBzz[1].Uint);
			break;
		case 3:
			if(Encoder.Uint<SP_Read.Encoder_Sample[0].Uint)
				ShiftValue0=0.0f;
			else if(Encoder.Uint<SP_Read.Encoder_Sample[1].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[0].Uint)) * \
								SP_Read.Encoder_Xsh1[0].Float;
			else if(Encoder.Uint<SP_Read.Encoder_Sample[2].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[1].Uint)) * \
								SP_Read.Encoder_Xsh1[1].Float+((float)SP_Read.WyBzz[0].Uint);
			else if(Encoder.Uint<SP_Read.Encoder_Sample[3].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[2].Uint)) * \
								SP_Read.Encoder_Xsh1[2].Float+((float)SP_Read.WyBzz[1].Uint);
			else 
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[3].Uint)) * \
								SP_Read.Encoder_Xsh1[2].Float+((float)SP_Read.WyBzz[2].Uint);
			break;
		case 4:
			if(Encoder.Uint<SP_Read.Encoder_Sample[0].Uint)
				ShiftValue0=0.0f;
			else if(Encoder.Uint<SP_Read.Encoder_Sample[1].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[0].Uint)) * \
								SP_Read.Encoder_Xsh1[0].Float;
			else if(Encoder.Uint<SP_Read.Encoder_Sample[2].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[1].Uint)) * \
								SP_Read.Encoder_Xsh1[1].Float+((float)SP_Read.WyBzz[0].Uint);
			else if(Encoder.Uint<SP_Read.Encoder_Sample[3].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[2].Uint)) * \
								SP_Read.Encoder_Xsh1[2].Float+((float)SP_Read.WyBzz[1].Uint);
			else if(Encoder.Uint<SP_Read.Encoder_Sample[4].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[3].Uint)) * \
								SP_Read.Encoder_Xsh1[3].Float+((float)SP_Read.WyBzz[2].Uint);
			else 
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[4].Uint)) * \
								SP_Read.Encoder_Xsh1[3].Float+((float)SP_Read.WyBzz[3].Uint);
			break;
		case 5:
			if(Encoder.Uint<SP_Read.Encoder_Sample[0].Uint)
				ShiftValue0=0.0f;
			else if(Encoder.Uint<SP_Read.Encoder_Sample[1].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[0].Uint)) * \
								SP_Read.Encoder_Xsh1[0].Float;
			else if(Encoder.Uint<SP_Read.Encoder_Sample[2].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[1].Uint)) * \
								SP_Read.Encoder_Xsh1[1].Float+((float)SP_Read.WyBzz[0].Uint);
			else if(Encoder.Uint<SP_Read.Encoder_Sample[3].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[2].Uint)) * \
								SP_Read.Encoder_Xsh1[2].Float+((float)SP_Read.WyBzz[1].Uint);
			else if(Encoder.Uint<SP_Read.Encoder_Sample[4].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[3].Uint)) * \
								SP_Read.Encoder_Xsh1[3].Float+((float)SP_Read.WyBzz[2].Uint);
			else if(Encoder.Uint<SP_Read.Encoder_Sample[5].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[4].Uint)) * \
								SP_Read.Encoder_Xsh1[4].Float+((float)SP_Read.WyBzz[3].Uint);
			else 
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[5].Uint)) * \
								SP_Read.Encoder_Xsh1[4].Float+((float)SP_Read.WyBzz[4].Uint);
			break;
		default :
			break;
	}
	
	sprintf(s, "%-10.2f", ShiftValue0); //产生:" 123 4567"
	
	for(j=0;j<6;j++)
	{
		if(s[j]==0x20)
			s[j]=0;
		else if(s[j]==0x2d)
			s[j]=13;
		else if(s[j]==0x2e)
		{
			s[j]=14;
			i=j;
		}
		else
			s[j]-=0x30;
	}
	for(j=0;j<=(i+2);j++)
	{
		dispchn4(196+j*6,40,&ALB_NUM[s[j]][0]);
	}
	for(j=(i+3);j<6;j++)
		dispchn5(196+j*6,40);


	


	
}

这段代码会跑飞。

其中:

case 5:
			if(Encoder.Uint<SP_Read.Encoder_Sample[0].Uint)
				ShiftValue0=0.0f;
			else if(Encoder.Uint<SP_Read.Encoder_Sample[1].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[0].Uint)) * \
								SP_Read.Encoder_Xsh1[0].Float;
			else if(Encoder.Uint<SP_Read.Encoder_Sample[2].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[1].Uint)) * \
								SP_Read.Encoder_Xsh1[1].Float+((float)SP_Read.WyBzz[0].Uint);
			else if(Encoder.Uint<SP_Read.Encoder_Sample[3].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[2].Uint)) * \
								SP_Read.Encoder_Xsh1[2].Float+((float)SP_Read.WyBzz[1].Uint);
			else if(Encoder.Uint<SP_Read.Encoder_Sample[4].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[3].Uint)) * \
								SP_Read.Encoder_Xsh1[3].Float+((float)SP_Read.WyBzz[2].Uint);
			else if(Encoder.Uint<SP_Read.Encoder_Sample[5].Uint)
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[4].Uint)) * \
								SP_Read.Encoder_Xsh1[4].Float+((float)SP_Read.WyBzz[3].Uint);
			else 
				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[5].Uint)) * \
								SP_Read.Encoder_Xsh1[4].Float+((float)SP_Read.WyBzz[4].Uint);
			break;

把这段注释掉,就不跑飞了,加上就不行。

大神看看,哪里有问题。谢谢

此帖出自stm32/stm8论坛
个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复

3049

帖子

0

资源

纯净的硅(中级)

//			else if(Encoder.Uint<SP_Read.Encoder_Sample[4].Uint)
//				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[3].Uint)) * \
//								SP_Read.Encoder_Xsh1[3].Float+((float)SP_Read.WyBzz[2].Uint);
//			else if(Encoder.Uint<SP_Read.Encoder_Sample[5].Uint)
//				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[4].Uint)) * \
//								SP_Read.Encoder_Xsh1[4].Float+((float)SP_Read.WyBzz[3].Uint);
//			else 
//				ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[5].Uint)) * \
//								SP_Read.Encoder_Xsh1[4].Float+((float)SP_Read.WyBzz[4].Uint);

又测试了一下,把上面这几句注释掉没问题。加上就不行,好奇怪

个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复

2652

帖子

1

资源

五彩晶圆(初级)

  • ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[5].Uint)) * \
  • SP_Read.Encoder_Xsh1[4].Float+((float)SP_Read.WyBzz[4].Uint)

注释这个试试,其他保留。

点评

不行啊  详情 回复 发表于 2020-8-26 08:02
个人签名人已离开,无事别找,找也找不到。

回复

3049

帖子

0

资源

纯净的硅(中级)

freebsder 发表于 2020-8-25 21:58 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[5].Uint)) * \ SP_Read.Encoder_Xsh1[4]. ...

不行啊

个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复

3049

帖子

0

资源

纯净的硅(中级)

1.jpg

跑到这里面来啦

点评

先把堆栈开大,弄200K再说。你这里面有sprintf,试试看。  详情 回复 发表于 2020-8-26 08:50
个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复

2652

帖子

1

资源

五彩晶圆(初级)

先把堆栈开大,弄200K再说。你这里面有sprintf,试试看。

点评

谢谢,把堆栈开大怎么操作?  详情 回复 发表于 2020-8-26 09:01
个人签名人已离开,无事别找,找也找不到。

回复

3049

帖子

0

资源

纯净的硅(中级)

freebsder 发表于 2020-8-26 08:50 先把堆栈开大,弄200K再说。你这里面有sprintf,试试看。

谢谢,把堆栈开大怎么操作?

个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复

3049

帖子

0

资源

纯净的硅(中级)

;Stack_Size      EQU     0x00000400
Stack_Size      EQU     0x00000800
    
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

;Heap_Size       EQU     0x00000200
Heap_Size       EQU     0x00000400

我都扩大了一倍还是不行

点评

2k很大吗?你又不是没内存,搞20k再说。  详情 回复 发表于 2020-8-26 09:32
个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复

3329

帖子

1

资源

版主

本帖最后由 damiaa 于 2020-8-26 09:30 编辑

堆栈小了  数组 越界 这两种可能性很大

 

贴一下结构定义 和结构变量申明看看。

SP_Read

 

Encoder

点评

struct SystemParameter                            //存储结构体 {     union xl2  详情 回复 发表于 2020-8-26 13:36

回复

2652

帖子

1

资源

五彩晶圆(初级)

chenbingjy 发表于 2020-8-26 09:11 ;Stack_Size      EQU     0x00000400 Stack_Size      EQU &nb ...

2k很大吗?你又不是没内存,搞20k再说。

点评

已经用了很多啦。 [attachimg]497046[/attachimg]  详情 回复 发表于 2020-8-26 13:39
个人签名人已离开,无事别找,找也找不到。

回复

3049

帖子

0

资源

纯净的硅(中级)

damiaa 发表于 2020-8-26 09:26 堆栈小了  数组 越界 这两种可能性很大   贴一下结构定义 和结构变量申明看看。 SP_Rea ...

struct SystemParameter                            //存储结构体
{
    union xl2 BzzLhnc[5];
    union xl2 Wy;
    struct Lch lc;
    uchar CalibrationPoints;
    struct Parameter PS;
    uchar Tonnage[3];                    //吨位
    struct Yield Qf;
    union xl3 BzzSamplenc[6];
    union xs SCnc[5];
    union xl2 Encoder_Save[2];
    union xs1 Encoder_Xsh;                        //编码器系数
    struct Extensometer    Extensome;        //引伸计结构体
    uint16_t NC;
    union xl3 ExtenSample[4];
    union xs1 ExtenXsh[3];
    struct Lch1 ExtenLch;
    struct YMD Expire;                                //到期设定
    struct FblysParameter    Fblys;            //非比例延伸
    struct KyKz KyKzSy;
    struct Kl KlSy;
    struct Kl KlFblYsSy;                            //非比例延伸试验
    union xl2 TestPieceType1;                //试件型号
    union xl3 KykzSaveNumber;
    union xl3 KykzSaveNumberTemp;
    struct SS SensorSet;
    uchar LockStatus;
    union xl2 BzzLh[LIZHIDIANSHU];
    union xl3 BzzSample[LIZHIDIANSHU+1];
    union xs SC[LIZHIDIANSHU];
    struct Extensometer1    Extensome1;        //引伸计结构体
    union xl3 ExtenSample1[10];
    union xs1 ExtenXsh1[9];
    union xl2 WyBdDs;                                        //位移标定点数
    union xl2 WyBzz[5];
    union xl2 Encoder_Sample[6];
    union xs1 Encoder_Xsh1[5];                        //编码器系数
};

 

struct SystemParameter SP_Write,SP_Read;

个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复

3049

帖子

0

资源

纯净的硅(中级)

freebsder 发表于 2020-8-26 09:32 2k很大吗?你又不是没内存,搞20k再说。

已经用了很多啦。

2.jpg

点评

103VC好像是48K或者 64K吧。  详情 回复 发表于 2020-8-26 14:08
103VC有48K或者64KSRAM,你这才20920+840,还剩一半多,内存不拿来用你留着当晚饭?  详情 回复 发表于 2020-8-26 13:56
个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复

2652

帖子

1

资源

五彩晶圆(初级)

chenbingjy 发表于 2020-8-26 13:39 已经用了很多啦。

103VC有48K或者64KSRAM,你这才20920+840,还剩一半多,内存不拿来用你留着当晚饭?

个人签名人已离开,无事别找,找也找不到。

回复

3049

帖子

0

资源

纯净的硅(中级)

6.jpg

这么多啦,还不行。再多就内存溢出啦。

个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复

3329

帖子

1

资源

版主

本帖最后由 damiaa 于 2020-8-26 14:10 编辑
chenbingjy 发表于 2020-8-26 13:39 已经用了很多啦。

103VC好像是48K或者 64K吧。 加点试试。 数组好像没超界。 你可以一句一句试。

点评

48K  详情 回复 发表于 2020-8-26 14:09

回复

3049

帖子

0

资源

纯净的硅(中级)

damiaa 发表于 2020-8-26 14:08 103VC好像是48K或者 64K吧。

48K

点评

主要是栈。 一般就是前面那个Stack_Size  详情 回复 发表于 2020-8-26 14:12
个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复

2652

帖子

1

资源

五彩晶圆(初级)

单步看在哪里异常的。

点评

[attachimg]497065[/attachimg] 单步运行,到下括号那了,1261行那,就跳到异常那里。 [attachimg]497066[/attachimg]  详情 回复 发表于 2020-8-26 14:21
个人签名人已离开,无事别找,找也找不到。

回复

2652

帖子

1

资源

五彩晶圆(初级)

一步一步缩范围,你这东西表面上看不出啥,只能自己抓异常。

个人签名人已离开,无事别找,找也找不到。

回复

3049

帖子

0

资源

纯净的硅(中级)

7.jpg 看,是不是溢出了

个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复

3329

帖子

1

资源

版主

本帖最后由 damiaa 于 2020-8-26 14:19 编辑

主要是栈。 一般就是前面那个Stack_Size 

如果 没问题就去排除其他的。也不一定是这个地方的代码。其他的程序代码也有可能。

可以逐步注释掉看看。


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

关闭
站长推荐上一条 1/5 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表