为什么执行跳转指令?

fla*_*urn 0 c embedded pointers

我刚刚在一个小型嵌入式产品的启动加载器中看到了一个非常有趣的C代码.

代码由两部分组成:引导加载程序和主代码.主代码地址的开头存储在函数指针中.以下是我正在谈论的代码

typedef struct {
  uint32_t myOtherField;
  void (*mainCodeStartAddress)(void);
} MyStruct;

MyStruct myStruct = {0x89ABCDEF, 0x12345678};

void main(void) {
  // Some code
  ...
  myStruct.mainCodeStartAddress(); // Jump to the start of the application
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么这有效?为什么机器会转到应用程序代码?任何帮助表示赞赏.

har*_*ald 6

该构造void (*mainCodeStartAddress)(void)声明了一个名为的函数指针mainCodeStartAddress.它将指向一个不带参数的函数,并且不会返回任何内容.

您可以将任何相同类型的函数分配给函数指针,例如:

void some_function(void)
{
    // Do something useful
}

mystruct.mainCodeStartAddress = some_function;
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样调用它:

mystruct.mainCodeStartAddress();  // Same as calling some_function();
Run Code Online (Sandbox Code Playgroud)

在您的示例中,固定地址被分配给函数指针,因此当您调用函数时,它指向它跳转到该地址并执行它.