嵌入式中地址-函数之间的转换

本文探讨了在嵌入式系统中如何将程序段的入口地址转换为函数,通过分析bootloader中的跳转指令和C语言宏定义,解释了 `(void (*)(int))0x20`(clkcon)`的含义,详细阐述了 `(void (*)(int))` 作为函数指针类型定义,`0x20` 作为函数入口地址,以及 `(clkcon)` 作为参数传递的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经常见到嵌入式设计中,将某一程序段的入口地址转换为一个函数,我们来分析一下它的成分:
      如在bootloader的0x00000020地址上的双字单元中有这样一条语句:
@Address is 0x00000020
      b powerdown          @Jump to the flag "powerdown"
...
...
powerdown:
...
...
      然后在某一C头文件中可以见到这样的宏声明:
#define EnterPWDN(clkcon) ((void (*)(int))0x20)(clkcon)
      初一看,乱七八糟的,现在,我们来整理一下。
      不难看出,当我们编程调用EnterPWDN(clkcon)函数的时候,编译器在编译前首先把EnterPWDN(clkcon)转换为
((void (*)(int))0x20)(clkcon)语句。
对于这个语句,我们将之分解成3部分来看。
      1:(void (*)(int)
      2:0x20
      3:(clkcon)

      (clkcon)是函数的参数,就不用说了。0x20呢?当然就是要转换的函数的入口地址了。那对于(void (*)(int)呢??呵呵……,这一部分作为一个整体,描述了转换后的函数的类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值