Part Number:TMS320F280049
测试平台CCS9.0,在函数指针调用的过程中,若使用常数作为形参,存在传递错误的情况。例子如下:
1、变量、函数定义
2、被调用函数的内部
3、函数调用和函数指针调用及计算结果
按理来说两种方法的计算结果应该一致,理应为spd_pid.Out = 1677721, spd_pid.Ui =1677721, spd_pid.Uff = 0.但是只有调用函数pid_setvar1的计算结果是正确的,而调用函数指针spd_pid.setvar结果如下:
Ui和Uff都在错误变化。
4、对比两种调用方法的汇编指令
发现调用函数有将临时变量0压入堆栈中,而调用函数指针是将临时变量0存储在XAR5,其余操作殊途同归
然而,被调用函数的内部指令确没有因此而改变,如下图所示,
不管哪种操作,函数内部都会认为堆栈区中弹出的临时变量是第三个形参,然而函数指针的调用,并没有将0压入堆栈区中,这会导致读取来的第三个形参是错误的。
这是编译器存在的问题,还是我的C语言编写不规范呢?
YuanZe Wang:
代码写错了,结构体里面的函数指针也要声明输入输出类型
,
? ??:
好,我试试
,
? ??:
会报错啊,怎么把函数指针放进结构体
,
YuanZe Wang:
如果一定要typedef的话,用下面这种形式
typedef struct PIDREG3 PIDREG3;struct PIDREG3 {Uint16a;void (*fcn_ptr)(PIDREG3 *,Uint16); };
,
? ??:
好的,谢谢
,
Lydia:
感谢分享