lbc___ 发表于 2009-11-6 22:11:23

感觉icc对指向函数的指针操作有问题啊

比如一个函数原型如下:
void fun1( void (*paa)(void) );

另一个函数是
void fun2()
{
。。。
}
然后执行 fun1(fun2);的时候总是会出错,用单步调试的时候发现进入fun1函数里面以后,参数值不是原来fun2的地址了。
换了个版本的icc,还是一样会传错。
很奇怪,怎么回事呢?

likunpeng 发表于 2009-11-6 23:25:46

楼主 指向函数的指针是介个样子滴

void (*fun1) (void)

lbc___ 发表于 2009-11-6 23:53:58

是啊,我觉得语法上没错吧。
我是把void (*paa)(void)这个指针当成fun1函数的参数传进去了。
我还是写完整一点吧

比如两个函数是:
void fun1( void (*paa)(void) )
{
(*paa)();
}

void fun2()
{
....
}

然后运行 fun1(fun2);的时候,发现传到fun1函数内的不是fun2函数的地址。不知道为什么。

zhudan 发表于 2009-11-7 00:12:01

iar没有问题

likunpeng 发表于 2009-11-7 01:10:06

哦,那就楼主贴出的这部分代码看是没有任何问题的,帮不上了

lbc___ 发表于 2009-11-7 10:31:35

刚看了生成的汇编代码,好像是传进去一个值,然后根据这个值再去某个地方查找函数入口的。
所以用fun1(fun2);直接调用可以执行,但是传进去的不是函数的地址值。

我最近在写一个简单的任务调度的东西,需要直接得到函数的地址
不知道有没有办法可以直接获得函数的地址值呢?

lanselian 发表于 2009-11-7 11:12:08

期待中

voidx 发表于 2009-11-7 11:13:49

我最近在写一个简单的任务调度的东西
-------------------------------------

OS建议用GCC,或IAR.

一般任务上下文初始化,需要函数地址。
个人代码:GCC



typedef struct
{
uint8       _reserved;

uint8       _r0;
uint8       _r1;

uint8       _r2;
uint8       _r3;
uint8       _r4;
uint8       _r5;

uint8       _r6;
uint8       _r7;
uint8       _r8;
uint8       _r9;

uint8       _r10;
uint8       _r11;
uint8       _r12;
uint8       _r13;

uint8       _r14;
uint8       _r15;
uint8       _r16;
uint8       _r17;

uint8       _r18;
uint8       _r19;
uint8       _r20;
uint8       _r21;

uint8       _r22;
uint8       _r23;
uint8       _r24;
uint8       _r25;

uint8       _r26;
uint8       _r27;
uint8       _r28;
uint8       _r29;


uint8       _r30;

uint8       _sreg;

uint8       _r31;

uint8       _pch;
uint8       _pcl;

}ctx_sp_t;


typedef ctx_sp_t TContext;

               指向上下文指针的指针    函数指针,指向任务处理函数          指向任务堆栈空间
void ctx_init(TContext **Context    ,    TTaskProc *TaskProc         ,   void *Stack1)
{
ctx_sp_t *ctx_sp;

ctx_sp=(ctx_sp_t *)Stack1 - 1;

ctx_sp->_pcl= (uint16)TaskProc%256;
ctx_sp->_pch= (uint16)TaskProc/256;

ctx_sp->_sreg = 0;

ctx_sp->_r31 = 0x31;
ctx_sp->_r30 = 0x30;
ctx_sp->_r29 = 0x29;
ctx_sp->_r28 = 0x28;
ctx_sp->_r27 = 0x27;
ctx_sp->_r26 = 0x26;
ctx_sp->_r25 = 0x25;
ctx_sp->_r24 = 0x24;
ctx_sp->_r23 = 0x23;
ctx_sp->_r22 = 0x22;
ctx_sp->_r21 = 0x21;
ctx_sp->_r20 = 0x20;
ctx_sp->_r19 = 0x19;
ctx_sp->_r18 = 0x18;
ctx_sp->_r17 = 0x17;
ctx_sp->_r16 = 0x16;
ctx_sp->_r15 = 0x15;
ctx_sp->_r14 = 0x14;
ctx_sp->_r13 = 0x13;
ctx_sp->_r12 = 0x12;
ctx_sp->_r11 = 0x11;
ctx_sp->_r10 = 0x10;
ctx_sp->_r9= 0x09;
ctx_sp->_r8= 0x08;
ctx_sp->_r7= 0x07;
ctx_sp->_r6= 0x06;
ctx_sp->_r5= 0x05;
ctx_sp->_r4= 0x04;
ctx_sp->_r3= 0x03;
ctx_sp->_r2= 0x02;

ctx_sp->_r1= 0x00;
ctx_sp->_r0= 0x00;

*Context=ctx_sp;

}
页: [1]
查看完整版本: 感觉icc对指向函数的指针操作有问题啊