感觉icc对指向函数的指针操作有问题啊
比如一个函数原型如下:void fun1( void (*paa)(void) );
另一个函数是
void fun2()
{
。。。
}
然后执行 fun1(fun2);的时候总是会出错,用单步调试的时候发现进入fun1函数里面以后,参数值不是原来fun2的地址了。
换了个版本的icc,还是一样会传错。
很奇怪,怎么回事呢? 楼主 指向函数的指针是介个样子滴
void (*fun1) (void) 是啊,我觉得语法上没错吧。
我是把void (*paa)(void)这个指针当成fun1函数的参数传进去了。
我还是写完整一点吧
比如两个函数是:
void fun1( void (*paa)(void) )
{
(*paa)();
}
void fun2()
{
....
}
然后运行 fun1(fun2);的时候,发现传到fun1函数内的不是fun2函数的地址。不知道为什么。 iar没有问题 哦,那就楼主贴出的这部分代码看是没有任何问题的,帮不上了 刚看了生成的汇编代码,好像是传进去一个值,然后根据这个值再去某个地方查找函数入口的。
所以用fun1(fun2);直接调用可以执行,但是传进去的不是函数的地址值。
我最近在写一个简单的任务调度的东西,需要直接得到函数的地址
不知道有没有办法可以直接获得函数的地址值呢? 期待中 我最近在写一个简单的任务调度的东西
-------------------------------------
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]