大家好,小弟在用STM32开发项目时遇到一个问题,程序总是跑飞,非常奇怪,希望能得到各位的帮助。现象如下:
见下图:
图1 执行993行断点前的程序代码
图2
变量值查看结果
注:sf->new_cmd_obj和sf->destroy_cmd_obj是函数指针,new_cmd_obj_i和destroy_cmd_obj是具体的函数,993行和994行均是函数指针的赋值操作。
上图是程序在执行断点之前的情况,从图上可以看出,在执行sf->new_cmd_obj = new_cmd_obj_i这句话之前,
1 通过图2可以看到sf->new_cmd_obj此时的值是0x20008DE0(应该是指向内存区域的某个地方,这是不是有点问题,因为sf->destroy_cmd_obj的值为0,这可以形成一个对比,所以我认为这是有差异的一个地方)。
2 new_cmd_obj_i这个函数的地址是在flash的0x0800039AC处。
单步执行至图1的第995行后,情况如下:
图3执行至995行的断点后
图4
执行至995行变量值
图3和图4显示程序从第993行执行至995行的情况,从图上可以看出,sf->new_cmd_obj的值为0x0D4604B5,这个地址已经不是程序正常执行范围内,所以当程序调用new_cmd_obj方法时,程序就跑飞了,进入HardFault_Handler()了。
sf结构体中的destroy_cmd_obj是函数指针, destroy_cmd_obj是外部的一个函数,994行的赋值语句含义是通过函数的值赋给sf->destroy_cmd_obj,图4标蓝线的值是正确的,主要是和new_cmd_obj异常情况形成一下对比。
请大家帮我找找,为何我的程序在执行993行后,sf->new_cmd_obj的值变成0x0D4604B5导致后期调用这个成员时使程序跑飞。
|