OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3105|回复: 5

STM32F103VCT6加上一段代码程序跑飞的问题

[复制链接]

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
发表于 2020-8-26 09:23:40 | 显示全部楼层 |阅读模式
1金钱

我用STM32F103VCT6写程序。


有一下一段代码:

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

  5.         switch(SP_Read.WyBdDs.Uint)
  6.         {
  7.                 case 1:
  8.                         if(Encoder.Uint<SP_Read.Encoder_Sample[0].Uint)
  9.                                 ShiftValue0=0.0;
  10.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[1].Uint)
  11.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[0].Uint)) * \
  12.                                                                 SP_Read.Encoder_Xsh1[0].Float;
  13.                         else
  14.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[1].Uint)) * \
  15.                                                                 SP_Read.Encoder_Xsh1[0].Float+(float)(SP_Read.WyBzz[0].Uint);
  16.                         break;
  17.                 case 2:
  18.                         if(Encoder.Uint<SP_Read.Encoder_Sample[0].Uint)
  19.                                 ShiftValue0=0.0;
  20.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[1].Uint)
  21.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[0].Uint)) * \
  22.                                                                 SP_Read.Encoder_Xsh1[0].Float;
  23.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[2].Uint)
  24.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[1].Uint)) * \
  25.                                                                 SP_Read.Encoder_Xsh1[1].Float+((float)SP_Read.WyBzz[0].Uint);
  26.                         else
  27.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[2].Uint)) * \
  28.                                                                 SP_Read.Encoder_Xsh1[1].Float+((float)SP_Read.WyBzz[1].Uint);
  29.                         break;
  30.                 case 3:
  31.                         if(Encoder.Uint<SP_Read.Encoder_Sample[0].Uint)
  32.                                 ShiftValue0=0.0f;
  33.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[1].Uint)
  34.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[0].Uint)) * \
  35.                                                                 SP_Read.Encoder_Xsh1[0].Float;
  36.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[2].Uint)
  37.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[1].Uint)) * \
  38.                                                                 SP_Read.Encoder_Xsh1[1].Float+((float)SP_Read.WyBzz[0].Uint);
  39.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[3].Uint)
  40.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[2].Uint)) * \
  41.                                                                 SP_Read.Encoder_Xsh1[2].Float+((float)SP_Read.WyBzz[1].Uint);
  42.                         else
  43.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[3].Uint)) * \
  44.                                                                 SP_Read.Encoder_Xsh1[2].Float+((float)SP_Read.WyBzz[2].Uint);
  45.                         break;
  46.                 case 4:
  47.                         if(Encoder.Uint<SP_Read.Encoder_Sample[0].Uint)
  48.                                 ShiftValue0=0.0f;
  49.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[1].Uint)
  50.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[0].Uint)) * \
  51.                                                                 SP_Read.Encoder_Xsh1[0].Float;
  52.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[2].Uint)
  53.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[1].Uint)) * \
  54.                                                                 SP_Read.Encoder_Xsh1[1].Float+((float)SP_Read.WyBzz[0].Uint);
  55.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[3].Uint)
  56.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[2].Uint)) * \
  57.                                                                 SP_Read.Encoder_Xsh1[2].Float+((float)SP_Read.WyBzz[1].Uint);
  58.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[4].Uint)
  59.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[3].Uint)) * \
  60.                                                                 SP_Read.Encoder_Xsh1[3].Float+((float)SP_Read.WyBzz[2].Uint);
  61.                         else
  62.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[4].Uint)) * \
  63.                                                                 SP_Read.Encoder_Xsh1[3].Float+((float)SP_Read.WyBzz[3].Uint);
  64.                         break;
  65.                 case 5:
  66.                         if(Encoder.Uint<SP_Read.Encoder_Sample[0].Uint)
  67.                                 ShiftValue0=0.0f;
  68.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[1].Uint)
  69.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[0].Uint)) * \
  70.                                                                 SP_Read.Encoder_Xsh1[0].Float;
  71.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[2].Uint)
  72.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[1].Uint)) * \
  73.                                                                 SP_Read.Encoder_Xsh1[1].Float+((float)SP_Read.WyBzz[0].Uint);
  74.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[3].Uint)
  75.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[2].Uint)) * \
  76.                                                                 SP_Read.Encoder_Xsh1[2].Float+((float)SP_Read.WyBzz[1].Uint);
  77.                        
  78.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[4].Uint)
  79.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[3].Uint)) * \
  80.                                                                 SP_Read.Encoder_Xsh1[3].Float+((float)SP_Read.WyBzz[2].Uint);
  81. //                        else if(Encoder.Uint<SP_Read.Encoder_Sample[5].Uint)
  82. //                                ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[4].Uint)) * \
  83. //                                                                SP_Read.Encoder_Xsh1[4].Float+((float)SP_Read.WyBzz[3].Uint);
  84. //                        else
  85. //                                ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[5].Uint)) * \
  86. //                                                                SP_Read.Encoder_Xsh1[4].Float+((float)SP_Read.WyBzz[4].Uint);
  87.                         break;
  88.                
  89.                 default :
  90.                         break;
  91.         }
  92.        
  93.         sprintf(s, "%-10.2f", ShiftValue0); //产生:" 123 4567"
  94.        
  95.         for(j=0;j<6;j++)
  96.         {
  97.                 if(s[j]==0x20)
  98.                         s[j]=0;
  99.                 else if(s[j]==0x2d)
  100.                         s[j]=13;
  101.                 else if(s[j]==0x2e)
  102.                 {
  103.                         s[j]=14;
  104.                         i=j;
  105.                 }
  106.                 else
  107.                         s[j]-=0x30;
  108.         }
  109.         for(j=0;j<=(i+2);j++)
  110.         {
  111.                 dispchn4(196+j*6,40,&ALB_NUM[s[j]][0]);
  112.         }
  113.         for(j=(i+3);j<6;j++)
  114.                 dispchn5(196+j*6,40);


  115.        


  116.        
  117. }
复制代码

这段代码会跑飞。

其中:

  1. case 5:
  2.                         if(Encoder.Uint<SP_Read.Encoder_Sample[0].Uint)
  3.                                 ShiftValue0=0.0f;
  4.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[1].Uint)
  5.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[0].Uint)) * \
  6.                                                                 SP_Read.Encoder_Xsh1[0].Float;
  7.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[2].Uint)
  8.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[1].Uint)) * \
  9.                                                                 SP_Read.Encoder_Xsh1[1].Float+((float)SP_Read.WyBzz[0].Uint);
  10.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[3].Uint)
  11.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[2].Uint)) * \
  12.                                                                 SP_Read.Encoder_Xsh1[2].Float+((float)SP_Read.WyBzz[1].Uint);
  13.                        
  14.                         else if(Encoder.Uint<SP_Read.Encoder_Sample[4].Uint)
  15.                                 ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[3].Uint)) * \
  16.                                                                 SP_Read.Encoder_Xsh1[3].Float+((float)SP_Read.WyBzz[2].Uint);
  17. //                        else if(Encoder.Uint<SP_Read.Encoder_Sample[5].Uint)
  18. //                                ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[4].Uint)) * \
  19. //                                                                SP_Read.Encoder_Xsh1[4].Float+((float)SP_Read.WyBzz[3].Uint);
  20. //                        else
  21. //                                ShiftValue0=((float)(Encoder.Uint-SP_Read.Encoder_Sample[5].Uint)) * \
  22. //                                                                SP_Read.Encoder_Xsh1[4].Float+((float)SP_Read.WyBzz[4].Uint);
  23.                         break;
  24.                
复制代码

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

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



最佳答案

查看完整内容[请看2#楼]

你不觉得 char s[8] 然后%-10.2f到s这个数据里面本身就数据越界了嘛,其他的case可能算出来的浮点数小,你那个case如果整数位大于一定程度肯定越界
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4504
金钱
4504
注册时间
2018-5-14
在线时间
962 小时
发表于 2020-8-26 09:23:41 | 显示全部楼层
你不觉得 char s[8]
然后%-10.2f到s这个数据里面本身就数据越界了嘛,其他的case可能算出来的浮点数小,你那个case如果整数位大于一定程度肯定越界
回复

使用道具 举报

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
 楼主| 发表于 2020-8-26 09:24:46 | 显示全部楼层
//                        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);
又测试了一下,把上面这几句注释掉没问题。加上就不行,好奇怪
回复

使用道具 举报

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
 楼主| 发表于 2020-8-26 13:41:48 | 显示全部楼层
姚先起 发表于 2020-8-26 13:39
你不觉得 char s[8]
然后%-10.2f到s这个数据里面本身就数据越界了嘛,其他的case可能算出来的浮点数小,你 ...

整数位没那么多,其实这一段代码根本就没执行到,可是一加进去就出错。
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2020-8-26 17:51:26 | 显示全部楼层
你注释掉那几行的特征就是对结构体内数组的访问时, 索引比别的地方都大,是不是访问越界了?
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
发表于 2020-8-28 11:52:02 | 显示全部楼层
能分享个F103VCT6的模板给我吗,我配置不会配
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-13 01:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表