4

In an embedded code I have to understand, there's this line of code :

*((void (**) ()) 0x01) = c_int01; /* Write the interrupt routine entry */

I can grasp the fact that you setup the interruption vector with the function pointer c_int01, but I can't figure what kind of cast (void (**) ()) refers to. I know the standard function pointer notation (void (*)()) but not the other one.

I tried to refactor the code so that it looked a bit more readable like this:

// header
typedef void (*interrupt_handler)(); // prototype of an interruption handler
#define INTERRUPT_VECTOR 0x01
#define SET_INTERRUPT_HANDLER( handler ) *((interrupt_handler) INTERRUPT_VECTOR) = (handler)

// code
SET_INTERRUPT_HANDLER( c_int01 );

But the embedded compiler whines about the LHS not beeing an object.

Anybody know what this notation signifies? (void (**)())

// EDIT:

For those interrested, I would understand this much better:

*( (void (*)())* 0x01) = c_int01;
4

5 回答 5

10

这是一个指向函数的指针。

所以强制转换将整数转换为0x01具有类型的函数指针的地址(void (*)())

你可以重写它:

typedef void (*interrupt_handler)();
*((interrupt_handler*) 0x01) = c_int101;
于 2013-04-29T10:39:03.973 回答
4

(void (**) ())是指向函数指针的指针。

(void (*)())是指向函数的指针,因此添加星号会增加间接级别。)

你需要说:

*((interrupt_handler*) INTERRUPT_VECTOR) = (handler)

上面写着,“将INTERRUPT_VECTOR其视为指向函数指针的指针,并将其值设置为handler。”

于 2013-04-29T10:40:03.350 回答
2

以下是永远有用的cdecl关于该表达式核心的内容,即(void (**) ())

将 unknown_name 转换为指向返回 void 的函数的指针

所以,它是一个强制转换(由外圆括号表示),类型是“指向函数指针的指针”,这似乎是有道理的。

于 2013-04-29T10:41:15.497 回答
1

Cdecl将是更快的了解方式:

     cast unknown_name into pointer to pointer to function returning void

著名的“螺旋规则将是下一个:

          +-----+
          |+-+  |
          || |  V
   (void (** |)( ))
      ^   ^^||  |
      |   ||||  |
      |   ||+|  |
      |   +--+  |
      +---------+

按照您阅读的内容:

  • 指向的指针
  • 指向的指针
  • 一个函数返回
  • 空白
于 2013-04-29T10:44:51.980 回答
-1

您可以将中断入口点向量的设置可视化为

   void (*interupt_handlers)()[256] = 0;

   void set_interupt_handler(int vector, void(*handler)())
   {
       interupt_handlers[vector] = handler;
   }
于 2013-04-29T11:40:32.077 回答