关于keil MDK 6和5版编译器的奇怪问题
[复制链接]
我在将使用旧版项目升级到新版后,发现程序不能顺利执行了,通过查找原因竟然是因为使用的MKD 编译器版本不同造成的。旧版使用MDK 5版编译通过,工作正常,新版使用MDK 6版编译通过,但是工作不正常了。旧版使用MDK 6编译也工作不正常。
通过查找问题出在函数指针上面,编写了下面的验证程序段复现问题,
//声明代码
#define inx_1st 0
typedef uint16_t (*fun_cmd)(uint16_t,uint16_t);
const fun_cmd cmd_list[]={cmd1,cmd2}
//调用代码
fun_cmd cmd_task = NULL;
cmd_task = cmd_list[inx_1st];//动态的调用,由程序执行决定
result = cmd_task(0,0); //MKD 6 编译无法调用成功
//函数声明
/* none cmmand */
uint16_t cmd1(uint16_t x,uint16_t y)
{
g_val = 1;
return 0;
}
/* none cmmand */
uint16_t cmd2(uint16_t x,uint16_t y)
{
g_val = 2;
return 0;
}
该段程序无论MKD 5或6 都可以通过,但是6版却不能工作,调试时也无法中断执行,感觉MDK 6版似乎把程序体给优化掉了,只是简单的返回就不执行程序体里的内容了,因为都能够编译通过,而且能够执行,所以不知道是怎么回事,是不是我哪里的声明出问题了。
|