完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 天涯何处 于 2013-9-3 12:42 编辑 关于使用Keil C编写函数指针的疑惑 自己写了一个简单的函数指针的程序,用的是STC5410AD的片,程序很简单,定义了两个函数指针,然后赋值,调用。 ![]() 如图编译通过没有问题,然后执行,执行的时候我是用串口打印出来的,结果打印出来的内容就有问题了。如果只赋值、调用一个函数指针,能正常打印输出,但是赋值2个就有问题了。打印不出来任何内容。 用串口打印了下TEST_ab跟TEST_cd的值,两个值是不同的,说明两指针指向的地址是不同的,但是一赋值,再打印TaskArr[1],TaskArr[2]两个的值,这两个值就一样了。网上查了下资料,有说是Keil C在编译过程中优化的时候出问题的,然后我按照他们说的方法试了,不成功,没有任何作用。 然后我换了个芯片,用STC89C54RD烧录同样的程序,结果居然神奇的打印正确了,然后我又试了下3组的,也没有问题。此时,我开始猜测是不是芯片的问题,然后换回5410AD的芯片,然后换了一个其他的程序,执行没有问题,换成这个程序,还是不成。。。。 这个时候我已经开始凌乱了。又换了一个新的5410AD的芯片,依然不成功。 不死心的我又换回了89C54的片子,更神奇的一幕出现了,这次居然不能正确打印了,我又依次打印了TEST_ab,TEST_cd跟TaskArr[1],TaskArr[2]的值,悲催的这次跟5410打出来的结果一样了。。。。 重复上面的过程N次,发现用89C54的片子的时候,有时候可以打印正确,有时候会出问题。用5410的时候一次没对过。 这会儿,想死的心都有了。不知道大家有没有碰到过类似的情况,可以给支个招。 简单的源码 如下 #include #include #include typedef int (*fun_p)(); fun_p xdata TaskArr[2] = {NULL}; int TEST_ab() //测试函数 { printf("abn"); return 0; } int TEST_cd() //测试函数 { printf("CDn"); return 0; } void main() { mInitSTDIO(); //开启串口打印输出功能 // TEST_ab(); // TEST_cd(); //函数直接执行没有问题 TaskArr[1] = TEST_ab; //调用函数指针 // TaskArr[2] = TEST_cd; TaskArr[1](); //有问题了,程序执行不对,输出不对。如果只调用一个函数指针就没有问题了 // TaskArr[2](); printf("n"); while(1); } 这个程序还包含一个debug.c跟debug.h的文件是串口打印输出的 ![]() |
|
相关推荐
2 个讨论
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
零知开源——基于STM32F407VET6零知增强板的四路独立计时器
806 浏览 0 评论
零知开源——STM32F4实现ILI9486显示屏UI界面系列教程(一):电子书阅读器功能
1287 浏览 0 评论
CW32L010 ESC Driver 电机控制套件快速上手指南
1043 浏览 1 评论
1644 浏览 1 评论
1866 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
13576 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-7-4 14:01 , Processed in 0.672896 second(s), Total 44, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191