<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>S12 / MagniV Microcontrollers中的主题 Re: Function Pointers and FCALL - Stack memory issues</title>
    <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Function-Pointers-and-FCALL-Stack-memory-issues/m-p/155094#M4628</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;It's a bug in the interrupt handlers if they do not properly stack all modified registers, not a bug in _FCALL.&lt;BR /&gt;I would check all your handlers if they do save GPAGE (at address 0x10), if they are potentially modifying it.&lt;FONT size="2"&gt;&lt;/FONT&gt;&lt;BR /&gt;The core stacks all internal CPU registers (CCR,X,Y,D,PC) but it does not safe the page registers on its own,&lt;BR /&gt;so the entry code of the interrupt handler has to do that.&lt;BR /&gt;When I remember right (out of my memory, and has been a while) the compiler does it if you use the -CpGPAGE=0x10 option (actually I'm not sure about the large memory model, did not use that).&lt;BR /&gt;&lt;BR /&gt;Daniel&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 12 May 2008 22:09:49 GMT</pubDate>
    <dc:creator>CompilerGuru</dc:creator>
    <dc:date>2008-05-12T22:09:49Z</dc:date>
    <item>
      <title>Function Pointers and FCALL - Stack memory issues</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Function-Pointers-and-FCALL-Stack-memory-issues/m-p/155091#M4625</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;Hi all,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;I had been&amp;nbsp;debugging on an ILLEGAL_BP&amp;nbsp; hit on my EVB9S12XEP100 using codewarrior 4.6 for the past few days. My code is built on a LARGE MEMORY MODEL and and has a number of function pointer tables which is fetched by a small OS and run on timely manner.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;I did observe that the illegal bp occurs very consistently when my interrupts are enabled and as an example,&amp;nbsp;tried sending some serial data through SCI1 which was configured to receive interrupt.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;Always, the stack used to get corrupted and hence&amp;nbsp;not finding a valid return address, the code would crash.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;Further debugging, the interesting thing is whenever the function pointers are accessed, the FCALL is fetched which expects a pre-aligned stack as shown below&amp;nbsp;containing the function pointer address and the return address.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;Before FCALL is called, there are some 10&amp;nbsp;assembly instructions generated&amp;nbsp;which will&amp;nbsp;arrange the addresses in the stack as expected by the FCALL.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 1;"&gt;/*----------------- FAR FUNCTION PTR Call ------------------------------------------------&lt;BR /&gt;&amp;nbsp; Parameters:&lt;BR /&gt;&amp;nbsp; - the normal function parameters according&lt;BR /&gt;&amp;nbsp; - on the stack: address of function to be called&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 1;"&gt;&amp;nbsp; Result :&lt;BR /&gt;&amp;nbsp; - Function is called with unchanged D &amp;amp; X register&lt;BR /&gt;&amp;nbsp; - Y is changed&lt;BR /&gt;&amp;nbsp; - the function address is removed from the stack before the function call&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 1;"&gt;&amp;nbsp; Stack layout (in):&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5, SP&amp;nbsp; : page of function to be called&lt;BR /&gt;&amp;nbsp; 3-4, SP&amp;nbsp; : offset of function to be called&lt;BR /&gt;&amp;nbsp; 1-2, SP&amp;nbsp; : offset of return address&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0, SP&amp;nbsp; : page of return address&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function ptr to be called (3 bytes)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return address caller&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (3 bytes)&lt;BR /&gt;&amp;nbsp; Idea:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exchanging function ptr and return address&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; because function ptr and return address have the page at different offset a&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; complicated transformation must be done&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; before&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; after&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,SP&amp;nbsp;&amp;nbsp;&amp;nbsp; page ret&amp;nbsp; A&amp;nbsp;&amp;nbsp;&amp;nbsp; page fkt&amp;nbsp; F&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1,SP&amp;nbsp;&amp;nbsp;&amp;nbsp; high ret&amp;nbsp; B&amp;nbsp;&amp;nbsp;&amp;nbsp; high fkt&amp;nbsp; D&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2,SP&amp;nbsp;&amp;nbsp;&amp;nbsp; low&amp;nbsp; ret&amp;nbsp; C&amp;nbsp;&amp;nbsp;&amp;nbsp; low fkt&amp;nbsp;&amp;nbsp; E&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3,SP&amp;nbsp;&amp;nbsp;&amp;nbsp; high fkt&amp;nbsp; D&amp;nbsp;&amp;nbsp;&amp;nbsp; page ret&amp;nbsp; A&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4,SP&amp;nbsp;&amp;nbsp;&amp;nbsp; low fkt&amp;nbsp;&amp;nbsp; E&amp;nbsp;&amp;nbsp;&amp;nbsp; high ret&amp;nbsp; B&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5,SP&amp;nbsp;&amp;nbsp;&amp;nbsp; page fkt&amp;nbsp; F&amp;nbsp;&amp;nbsp;&amp;nbsp; low&amp;nbsp; ret&amp;nbsp; C&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 1;"&gt;*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BLOCKQUOTE class="jive-quote"&gt;&lt;DIV&gt;&lt;STRONG style=": ; font-size: 1;"&gt;void __far _FCALL(void)&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG style=": ; font-size: 1;"&gt;{&lt;/STRONG&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG style=": ; font-size: 1;"&gt;&amp;nbsp; __asm {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDY&amp;nbsp;&amp;nbsp; 1, SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; A B C D E F&amp;nbsp;&amp;nbsp;&amp;nbsp; Y = B C&amp;nbsp;&amp;nbsp; ; 2 bytes&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOVW&amp;nbsp; 3, SP,&amp;nbsp; 1, SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; A D E D E F&amp;nbsp;&amp;nbsp;&amp;nbsp; Y = B C&amp;nbsp;&amp;nbsp; ; 4 bytes&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOVB&amp;nbsp; 0, SP,&amp;nbsp; 3, SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; A D E A E F&amp;nbsp;&amp;nbsp;&amp;nbsp; Y = B C&amp;nbsp;&amp;nbsp; ; 4 bytes&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOVB&amp;nbsp; 5, SP,&amp;nbsp; 0, SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; F D E A E F&amp;nbsp;&amp;nbsp;&amp;nbsp; Y = B C&amp;nbsp;&amp;nbsp; ; 4 bytes&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; STY&amp;nbsp;&amp;nbsp; 4, SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; F D E D B C&amp;nbsp;&amp;nbsp;&amp;nbsp; Y = B C&amp;nbsp;&amp;nbsp; ; 2 bytes&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; F D E A B C&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;16 bytes&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; call function pointer&lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;}&lt;/STRONG&gt;&lt;/DIV&gt;&lt;/BLOCKQUOTE&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;So, what I strongly suspect is during a call through Function ptr and an interrupt occurs, the micro would jump to the isr and before it does, it would stack the present address and when returns back to the FCALL, the FCALL routine computes a wrong return address based on the modified stack by the interrupt.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;I tried two methods to validate my observation.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;First, I verfied this by replacing the function pointers with a direct call to the function and all is fine over here.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;Second, I tried by disabling the interrupts before function pointer call and re-enabling the interrupts back after return from the function pointer. This also works fine.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;Hence, I need some advice on how to go about this(unless my above observation is illogical??)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;I can't adopt the second method since I need interrupts to be active as the functions could be large nor the first one as the OS needs them.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;Would modifiying the FCALL method with instructions to disable and enable the interrrupts at the begining and end&amp;nbsp; a good idea?&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;Or is there any other alternative.&amp;nbsp; please advice..&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;with regards,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="font-size: 2;"&gt;Lak&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 10 May 2008 13:46:38 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Function-Pointers-and-FCALL-Stack-memory-issues/m-p/155091#M4625</guid>
      <dc:creator>lak</dc:creator>
      <dc:date>2008-05-10T13:46:38Z</dc:date>
    </item>
    <item>
      <title>Re: Function Pointers and FCALL - Stack memory issues</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Function-Pointers-and-FCALL-Stack-memory-issues/m-p/155092#M4626</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;I doubt a bit that the problem is the shown _FCALL runtime routine, but that the bug&lt;BR /&gt;does not occur if you use direct calls is strange.&lt;BR /&gt;Did you check that you have enough stack space left? Disabling the interrupts while calling those function could also just help on the stack usage, also I could imagine that direct calls cause less spill space to be used.&lt;BR /&gt;Another suspect are the OS and all interrupt handlers, do they properly save all used page registers?&lt;BR /&gt;&lt;BR /&gt;Daniel&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 10 May 2008 14:08:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Function-Pointers-and-FCALL-Stack-memory-issues/m-p/155092#M4626</guid>
      <dc:creator>CompilerGuru</dc:creator>
      <dc:date>2008-05-10T14:08:59Z</dc:date>
    </item>
    <item>
      <title>Re: Function Pointers and FCALL - Stack memory issues</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Function-Pointers-and-FCALL-Stack-memory-issues/m-p/155093#M4627</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Hi,&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;I have enough stack reserved(around 1.5K - to be very comfortable )&amp;nbsp;and all my interrupt handlers are filled.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;what i am seeing is that as soon as function ptr is called, the code generated is similar to this.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;This code actually forms the stack layout with the return and calling function address as required by the FCALL.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Ptr_array[index]();&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&amp;nbsp;||&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&amp;nbsp;V&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="1"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="1"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="1"&gt;FE93AB&amp;nbsp;LDAB&amp;nbsp;#3&lt;BR /&gt;FE93AD&amp;nbsp;LDAA&amp;nbsp;1,SP&lt;BR /&gt;FE93AF&amp;nbsp;MUL&lt;BR /&gt;FE9390&amp;nbsp;MOVB&amp;nbsp;#127,0X0010&lt;BR /&gt;FE9395&amp;nbsp;TFR&amp;nbsp;D,X&lt;BR /&gt;FE9397&amp;nbsp;GLDY&amp;nbsp;32990,X&lt;BR /&gt;FE939C&amp;nbsp;GLDAA&amp;nbsp;32989,X&lt;BR /&gt;FE93A1&amp;nbsp;PSHY&lt;BR /&gt;FE93A2&amp;nbsp;PSHA&lt;BR /&gt;&lt;FONT color="#FF3300"&gt;FE93A3&amp;nbsp;CALL&amp;nbsp;0xc74A,0x00&amp;nbsp;&lt;/FONT&gt; /* This is the call to the &lt;FONT color="#FF3300"&gt;FCALL&lt;/FONT&gt; function mentioned in in my previous post */&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="1"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Now, my suspicion is while it is executing the above instructions any where before FCALL and an interrupt occurs,&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;the cpu might not be stacking all the registers affected during jump to ISR and so when it returns, the valued put to the stack could be different if the registers would have changed.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;What all the registers saved to stack for an isr call ?&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;I did a trace of the instructions executed from the debugger and observed that whenever the cpu was interrupted at FE9397, it returned back to here, entered FCALL and inside FCALL, after RTC, it crashed.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;This makes me think that stack is somewhere corrupted during ISR switching and still wondering why?&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;with regards,&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Lak&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 12 May 2008 21:19:12 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Function-Pointers-and-FCALL-Stack-memory-issues/m-p/155093#M4627</guid>
      <dc:creator>lak</dc:creator>
      <dc:date>2008-05-12T21:19:12Z</dc:date>
    </item>
    <item>
      <title>Re: Function Pointers and FCALL - Stack memory issues</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Function-Pointers-and-FCALL-Stack-memory-issues/m-p/155094#M4628</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;It's a bug in the interrupt handlers if they do not properly stack all modified registers, not a bug in _FCALL.&lt;BR /&gt;I would check all your handlers if they do save GPAGE (at address 0x10), if they are potentially modifying it.&lt;FONT size="2"&gt;&lt;/FONT&gt;&lt;BR /&gt;The core stacks all internal CPU registers (CCR,X,Y,D,PC) but it does not safe the page registers on its own,&lt;BR /&gt;so the entry code of the interrupt handler has to do that.&lt;BR /&gt;When I remember right (out of my memory, and has been a while) the compiler does it if you use the -CpGPAGE=0x10 option (actually I'm not sure about the large memory model, did not use that).&lt;BR /&gt;&lt;BR /&gt;Daniel&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 12 May 2008 22:09:49 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Function-Pointers-and-FCALL-Stack-memory-issues/m-p/155094#M4628</guid>
      <dc:creator>CompilerGuru</dc:creator>
      <dc:date>2008-05-12T22:09:49Z</dc:date>
    </item>
    <item>
      <title>Re: Function Pointers and FCALL - Stack memory issues</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Function-Pointers-and-FCALL-Stack-memory-issues/m-p/155095#M4629</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Hi Daniel,&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Your suspicion was very much right. The GPAGE register was not being restored by the core and neither I had worried about it. Actually if you see the instruction at&amp;nbsp;FE9390&amp;nbsp;MOVB&amp;nbsp;#127,0x0010 , I had neglected this which&amp;nbsp;loads the GPAGE register with a value of 0x7F.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;So, if an isr is hit after this and&amp;nbsp;on return, the further&amp;nbsp;GLD&amp;nbsp;instructions would not be guaranteed for the correct GPAGE value. This would further result in not loading the proper function address on to stack.&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Thanks for your advice, now with the GPAGE access enabled, it is working properly. Thanks a lot again&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;with regards,&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT size="2"&gt;Lak&lt;/FONT&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 13 May 2008 18:40:40 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Function-Pointers-and-FCALL-Stack-memory-issues/m-p/155095#M4629</guid>
      <dc:creator>lak</dc:creator>
      <dc:date>2008-05-13T18:40:40Z</dc:date>
    </item>
  </channel>
</rss>

