完善资料让更多小伙伴认识你,还能领取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 个讨论
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之电阻屏触摸
769 浏览 0 评论
1276 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之I2C-RTC
552 浏览 0 评论
ATK-DLRK3588开发板deepseek-r1-1.5b/7b部署指南
2890 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第五十章 WiFi热点实验
876 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12390 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-23 21:09 , Processed in 0.548833 second(s), Total 42, Slave 33 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191