5053|46

3243

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

程序跑飞的问题 [复制链接]

 

我用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论坛

最新回复

逐步调试,肯定是某些else 拐到一个莫名的地方了。一点点调,打印步骤   详情 回复 发表于 2023-8-24 14:12
点赞 关注
个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
 

回复
举报

3243

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
//			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);

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

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

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

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

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

此帖出自stm32/stm8论坛

点评

不行啊  详情 回复 发表于 2020-8-26 08:02
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 

回复

3243

帖子

0

TA的资源

纯净的硅(高级)

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

不行啊

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

回复

3243

帖子

0

TA的资源

纯净的硅(高级)

5
 

跑到这里面来啦

此帖出自stm32/stm8论坛

点评

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

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

6
 

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

此帖出自stm32/stm8论坛

点评

谢谢,把堆栈开大怎么操作?  详情 回复 发表于 2020-8-26 09:01
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

3243

帖子

0

TA的资源

纯净的硅(高级)

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

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

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

回复

3243

帖子

0

TA的资源

纯净的硅(高级)

8
 

;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

我都扩大了一倍还是不行

此帖出自stm32/stm8论坛

点评

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

回复

6111

帖子

4

TA的资源

版主

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

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

 

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

SP_Read

 

Encoder

此帖出自stm32/stm8论坛

点评

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

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

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

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

此帖出自stm32/stm8论坛

点评

已经用了很多啦。 [attachimg]497046[/attachimg]  详情 回复 发表于 2020-8-26 13:39
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

3243

帖子

0

TA的资源

纯净的硅(高级)

11
 
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;

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

回复

3243

帖子

0

TA的资源

纯净的硅(高级)

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

已经用了很多啦。

此帖出自stm32/stm8论坛

点评

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

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

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

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

此帖出自stm32/stm8论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

3243

帖子

0

TA的资源

纯净的硅(高级)

14
 

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

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

回复

6111

帖子

4

TA的资源

版主

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

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

此帖出自stm32/stm8论坛

点评

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

回复

3243

帖子

0

TA的资源

纯净的硅(高级)

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

48K

此帖出自stm32/stm8论坛

点评

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

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

17
 

单步看在哪里异常的。

此帖出自stm32/stm8论坛

点评

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

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

18
 

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

此帖出自stm32/stm8论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

3243

帖子

0

TA的资源

纯净的硅(高级)

19
 

看,是不是溢出了

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

回复

6111

帖子

4

TA的资源

版主

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

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

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

可以逐步注释掉看看。

此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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