[問題] Function Pointer to ISR

看板ASM作者 (懂得放手..才是王道)時間9年前 (2014/11/02 00:00), 9年前編輯推噓2(204)
留言6則, 2人參與, 最新討論串1/1
請教一個百思不解的問題, 我在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://www.ptt.cc/bbs/ASM/M.1414857647.A.CE1.html ※ 編輯: MaxHaru (1.163.234.68), 11/02/2014 00:04:53

11/08 18:09, , 1F
這是reentrant的問題, 跟function pointer無關
11/08 18:09, 1F

11/15 16:23, , 2F
請問該怎麼解決呢?
11/15 16:23, 2F

11/19 22:01, , 3F
最簡單的方法就是在被isr call的function都宣告為
11/19 22:01, 3F

11/19 22:01, , 4F
reentrant
11/19 22:01, 4F

11/19 22:04, , 5F
最好再次檢視程式架構 不要在isr內做太多事
11/19 22:04, 5F

11/28 20:35, , 6F
十分感謝, 我會再試試..
11/28 20:35, 6F
文章代碼(AID): #1KLGElpX (ASM)