测试例子(仅仅为了说明问题,不能直接复制使用)
测试例子1:在非赋值函数使用函数指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include "slcd_device.h" #include "libprintf.h" uint8_t (*FunctionControltest)(int cmd, void *argv); extern uint8_t hw_slcd_ctrl(int cmd, void *argv); int slcd_device_init(struct slcd_device_struct *slcd_device) { slcd_device->dis_buf[ 0 ] = 1; FunctionControltest = hw_slcd_ctrl; return 0; } slcd_device_data_type get_port_data(struct slcd_device_struct *slcd_device) { libprintf("BBBA:%X\r\n", (uint16_t) slcd_device->dis_buf[ 0 ]); FunctionControltest(SLCD_CTRL_CMD_COM_OUTPUT, 0); libprintf("AAA1:%X\r\n", (uint16_t) slcd_device->dis_buf[ 0 ]); }
|


正确来说应该都是1的
测试例子2:在赋值函数使用函数指针
1 2 3 4 5 6 7
| slcd_device_data_type get_port_data(struct slcd_device_struct *slcd_device) { FunctionControltest = hw_slcd_ctrl; libprintf("BBBA:%X\r\n", (uint16_t) slcd_device->dis_buf[ 0 ]); FunctionControltest(SLCD_CTRL_CMD_COM_OUTPUT, 0); libprintf("AAA1:%X\r\n", (uint16_t) slcd_device->dis_buf[ 0 ]); }
|


这个时候就是全都是1
解决方案
如果案例1跟案例2同样效果,则需要在案例1上增加调用树
项目右击
->option for target
-> LX51 Misc
-> Overlay
-> ?PR?_GET_PORT_DATA?SLCD_DEVICE!?PR?_HW_SLCD_CTRL?HW_SLCD

其中PR?_GET_PORT_DATA?SLCD_DEVICE!?PR?_HW_SLCD_CTRL?HW_SLCD
代表增加调用树,PR?_GET_PORT_DATA?SLCD_DEVICE~?PR?_HW_SLCD_CTRL?HW_SLCD
代表删除调用树