打印
[经验分享]

函数指针的使用

[复制链接]
1248|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gygp|  楼主 | 2024-7-17 00:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Keil C51中函数指针的使用函数指针是C语言中的一种重要概念,在Keil C51中函数指针的使用具有非常重要的意义。函数指针可以使得程序更加灵活和灵活,特别是在单片机系统中,嵌入式操作系统、文件系统和网络协议栈等一些较为复杂的应用都大量地使用了函数指针。在Keil C51中,函数指针的使用可以分为三种情况:指向固定地址的指针、无参数的函数指针和带参数的函数指针。指向固定地址的指针可以通过如下代码实现:```cint main(void) {( (void (*)(void)) 0x2000) ();return 0;}```这段代码使得主函数执行位于0x2000地址的程序代码。其中`( (void (*)(void)) 0x2000)`是一种数据类型,表示一指向代码段函数的指针,该函数无参数和无返回值。无参数的函数指针的使用方法与ANSI C基本相同。例如:```cvoid foo(void) {return;}int main(void) {void (*pf) (void) = foo;(*pf) ();return 0;}```带参数的函数指针一般来说,函数参数是通过堆栈来传递,用PUSH和POP汇编指令来实现的。但由于8051体系及其编译器的一些限制,使得其函数参数的传递需要一些特殊的方法。例如:```cvoid (*pfun) (char, short, int) = foo;(*pfun) ('c', 0x1234, 0x5678);```在Keil C51中,函数指针的调用方式与ANSI C有所不同。调用树是由Keil 链接器自动生成的,用于描述函数的调用关系。链接器通过分析调用树来确定哪些寄存器或内存位置是可安全覆盖的。在使用函数指针时,需要正确地使用指针函数,以避免调用树构造出错的可能,函数的参数也可能被错误覆盖。例如:```cvoid foo_caller(int (*fptr) (unsigned int)) {unsigned char i;for (i = 0; i < 5; ++i)(*fptr) (i);}int foo(unsigned int count) {long j, k, k = 0;for (j = 0; j < count; ++j)k += j;return k;}int main(void) {foo_caller(foo);return 0;}```在工程“ Build Target” 之后,打开该工程目录下的M51文件查看代码覆盖及函数调用情况。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

184

主题

8184

帖子

15

粉丝