完善资料让更多小伙伴认识你,还能领取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的文件是串口打印输出的
DEBUG.zip
(1.53 KB, 下载次数: 6
)
|
|
相关推荐
2 个讨论
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-本地仓库管理之分支间的操作
561 浏览 0 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】3D 图形显示
498 浏览 0 评论
630 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】SPI点亮16级灰阶OLED显示屏
503 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第四十二章 录音机实验
1122 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12205 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-23 06:10 , Processed in 0.656707 second(s), Total 44, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号