打印
[STM32F1]

程序跑飞的问题

[复制链接]
2469|42
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我用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;
default :
break;
}
把这段注释掉,就不跑飞了,加上就不行。
大神看看,哪里有问题。谢谢

使用特权

评论回复
沙发
LcwSwust| | 2020-8-25 16:42 | 只看该作者
看得眼花,看是不是数组越界了。

使用特权

评论回复
板凳
比神乐|  楼主 | 2020-8-25 17:01 | 只看该作者
LcwSwust 发表于 2020-8-25 16:42
看得眼花,看是不是数组越界了。

检查了,没有越界。

使用特权

评论回复
地板
比神乐|  楼主 | 2020-8-25 17:11 | 只看该作者
//                        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);
又测试了一下,把上面这几句注释掉没问题。加上就不行,好奇怪

使用特权

评论回复
5
比神乐|  楼主 | 2020-8-26 08:24 | 只看该作者

跑到这里面来了

使用特权

评论回复
6
sonicll| | 2020-8-26 11:01 | 只看该作者
进hardfault以后,看一下内核的SP值是多少,然后把这个SP值放进内存窗口查看,可以看到栈里的内容,然后向下找偏移第6个32位字的值,这个值就是进hardfault中断时,压进栈里的PC值,也是代码出错的地址

使用特权

评论回复
7
比神乐|  楼主 | 2020-8-26 13:50 | 只看该作者
sonicll 发表于 2020-8-26 11:01
进hardfault以后,看一下内核的SP值是多少,然后把这个SP值放进内存窗口查看,可以看到栈里的内容,然后向 ...

谢谢!内核的SP值如何查看?

使用特权

评论回复
8
比神乐|  楼主 | 2020-8-26 13:52 | 只看该作者
sonicll 发表于 2020-8-26 11:01
进hardfault以后,看一下内核的SP值是多少,然后把这个SP值放进内存窗口查看,可以看到栈里的内容,然后向 ...


是那个MSP吗?

使用特权

评论回复
9
比神乐|  楼主 | 2020-8-26 13:57 | 只看该作者

哪个是那个地址啊

使用特权

评论回复
10
sonicll| | 2020-8-26 13:58 | 只看该作者

对,就是msp,在memory窗口输入地址0x200064D0,格式选择unisgned int

使用特权

评论回复
11
比神乐|  楼主 | 2020-8-26 13:59 | 只看该作者

你帮我看看,谢谢

使用特权

评论回复
12
比神乐|  楼主 | 2020-8-26 14:01 | 只看该作者
是080279AB吗?找到这个地址再怎么办呀?

使用特权

评论回复
13
ayb_ice| | 2020-8-26 14:09 | 只看该作者
char s[8],搞大些

使用特权

评论回复
14
sonicll| | 2020-8-26 14:09 | 只看该作者
在反汇编代码里找0x08002020这个位置,应该就是这里的指令出现了错误

使用特权

评论回复
15
岛屿失梦| | 2020-8-26 14:11 | 只看该作者
@一下版主问问看吧?

使用特权

评论回复
16
比神乐|  楼主 | 2020-8-26 14:28 | 只看该作者
sonicll 发表于 2020-8-26 14:09
在反汇编代码里找0x08002020这个位置,应该就是这里的指令出现了错误


这个根本看不懂

使用特权

评论回复
17
sonicll| | 2020-8-26 14:43 | 只看该作者

太诡异了,按道理这个地址应该放的是指令,可你这图里看到的却是文字池之类的数据,不是指令

使用特权

评论回复
18
比神乐|  楼主 | 2020-8-26 15:06 | 只看该作者

谢谢!我把s[8]改为s[18]就好了,可是我不懂为什么就好了。
你给我讲讲

使用特权

评论回复
19
ayb_ice| | 2020-8-26 15:09 | 只看该作者
比神乐 发表于 2020-8-26 15:06
谢谢!我把s[8]改为s[18]就好了,可是我不懂为什么就好了。
你给我讲讲

就是越界了而已

使用特权

评论回复
20
sonicll| | 2020-8-26 15:10 | 只看该作者
本帖最后由 sonicll 于 2020-8-26 15:14 编辑

因为 sprintf(s, "%-10.2f", ShiftValue0),10位长度2位小数,ShiftValue0的整数部分很大的话,这个格式化字符串的长度就超过8字节了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

467

主题

3517

帖子

7

粉丝