作者MaxHaru (懂得放手..才是王道)
看板ASM
标题[问题] Function Pointer to ISR
时间Sun Nov 2 00:00:44 2014
请教一个百思不解的问题,
我在Keil C中, 要在某个ISR中使用Function Point来指到
一些只会在这个ISR会Call到的function, 如下:
void XXX_ISR(void)
{
unsigned char i;
i = GetFunction(); //i=0~1
if(i==0)
{
Func0_ISR();
}
else if(i==1)
{
Func0_ISR();
}
}
void Func0(void)
{
AAA_ISR();
}
之後宣告了一个Function Table如下:
typedef void (*FUNCTION_PTR_V_V) (void);
const FUNCTION_PTR_V_V code ISR_Table[2]=
{
Func0_ISR,
Func1_ISR
};
在ISR_Table[]定义好之後, Compile就会出现以下的Warning
*** WARNING L13: RECURSIVE CALL TO SEGMENT
SEGMENT: ?PR?XXXX
CALLER: ?PR?_AAA_ISR?XXXX
*** WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT: ?PR?_ESPIVW_GPIO_INIT_ESPI_ISR?ESPIVW
CALLER1: ?C_C51STARTUP
CALLER2: ?PR?INTERRUPT_XXXX?INTFUNC
感觉是跟AAA_ISR()这个function有关,
不过这个Function是一个独立的function,
没有再Call到其它的地方了
我不明白为什麽会出现这样的Warning
有谁知道Keil C出现这样Warning的原因吗?
是不是不能在ISR中使用Function Point的方法来呼叫Function?
谢谢.
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.163.234.68
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/ASM/M.1414857647.A.CE1.html
※ 编辑: MaxHaru (1.163.234.68), 11/02/2014 00:04:53
1F:推 ksmrt0123: 这是reentrant的问题, 跟function pointer无关 11/08 18:09
2F:→ MaxHaru: 请问该怎麽解决呢? 11/15 16:23
3F:推 ksmrt0123: 最简单的方法就是在被isr call的function都宣告为 11/19 22:01
4F:→ ksmrt0123: reentrant 11/19 22:01
5F:→ ksmrt0123: 最好再次检视程式架构 不要在isr内做太多事 11/19 22:04
6F:→ MaxHaru: 十分感谢, 我会再试试.. 11/28 20:35