EmbDev.net

Forum: ARM programming with GCC/GNU tools swi_handler.S in the LPC2378_demo1


Author: Varuzhan Danielyan (Guest)
Posted on:

Rate this post
0 useful
not useful
The SWI interrupt handler (modified by Martin Thomas)looks:

@********************************************************************
@*  SWI interrupt handler           *
@*  Function : SoftwareInterrupt(SWI_Number)      *
@*  The SWI_Number is 0 through 3        *
@*  See below "SwiFunction" table below        *
@*  Parameters:    None            *
@*  input  :       SWI_Number                *
@*  output :       None            *
@********************************************************************
SoftwareInterrupt:
  CMP  R0, #4
  LDRLO  PC, [PC, R0, LSL #2]
  MOVS  PC, LR

It assumes, that the SWI instruction's low bits value is already placed
in R0.  But I could not find the code, which does this.  What is my
mistake?
Great thanks in advance,
Varuzhan

Author: Martin Thomas (mthomas) (Moderator)
Posted on:

Rate this post
0 useful
not useful
Dear Martin,

Thank you very much.  But I think that your answer is interesting
for the forum members too.
Best regards,

Varuzhan

----- Original Message -----
From: "Martin Thomas" <mthomas@>
To: <dan@>
Sent: Wednesday, June 27, 2007 8:44 PM
Subject: Re: swi_handler.S in the LPC2378_demo1


> Hello Varuzhan,
>
> dan@ wrote:
>> Dear Martin,
>>
>> Waiting several days for my forum question, I am forced
>> again repeat it:
>>
>> The SWI interrupt handler (modified by Martin Thomas)looks:
>>
>> @********************************************************************
>> @*  SWI interrupt handler           *
>> @*  Function : SoftwareInterrupt(SWI_Number)      *
>> @*  The SWI_Number is 0 through 3        *
>> @*  See below "SwiFunction" table below        *
>> @*  Parameters:    None            *
>> @*  input  :       SWI_Number                *
>> @*  output :       None            *
>> @********************************************************************
>> SoftwareInterrupt:
>>  CMP  R0, #4
>>  LDRLO  PC, [PC, R0, LSL #2]
>>  MOVS  PC, LR
>>
>> It assumes, that the SWI instruction's low bits value is already
>> placed in R0.  But I could not find the code, which does this.  What
>> is my mistake?
>
> I did read your question in the forum but as written in the source: I have
> not tested the SWI-handler in the 2378-demo so I can not give a final
> answer. I have just adpated the original NXP source so it can be assembled
> with the GNU assembler.
> I don't know why the NXP developer ceated the handler like this. It does not
> look like the recommended SWI handling documented in the ARM manuals. It
> should be easy to adapt the SWI-handler from my GNU port of the LPC2138/48
> examples at
>
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm...
> which I have tested with an LPC2138 (also ARM7TDMI-S-core).
>
> I will extend the LPC2378 example to demonstrate SWI-calls and modify the
> source if needed when I have some spare time.
>
> Regards,
> Martin Thomas

Author: Martin Thomas (mthomas) (Moderator)
Posted on:

Rate this post
0 useful
not useful
>> I will extend the LPC2378 example to demonstrate SWI-calls and modify the
>> source if needed when I have some spare time.

An extended version of "demo_1/epsilon" is available at:
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm...

I have modified the swi-handler and startup-code:
- modified decoding of swi-number in swi-handler (from arm-mode only,
since the assembler-functions with the swi instruction are in arm-mode,
so the decoding from thumb is not needed here) (swi_handler.S)
- Exception vector "routes" SWI-exceptions to swi-handler (in startup.S)
- application starts in USR-mode with IRQ-exceptions disabled
(startup.S)
- IRQs enabled in main() thru swi (main.c)

Hope this helps, feedback welcome
Martin Thomas

Author: Varuzhan Danielyan (vdaniel)
Posted on:

Rate this post
0 useful
not useful
Martin Thomas wrote:
>>> I will extend the LPC2378 example to demonstrate SWI-calls and modify the
>>> source if needed when I have some spare time.
>
> An extended version of "demo_1/epsilon" is available at:
> http://www.siwawi.arubi.uni-kl.de/avr_projects/arm...
>
> I have modified the swi-handler and startup-code:
> - modified decoding of swi-number in swi-handler (from arm-mode only,
> since the assembler-functions with the swi instruction are in arm-mode,
> so the decoding from thumb is not needed here) (swi_handler.S)
> - Exception vector "routes" SWI-exceptions to swi-handler (in startup.S)
> - application starts in USR-mode with IRQ-exceptions disabled
> (startup.S)
> - IRQs enabled in main() thru swi (main.c)
>
> Hope this helps, feedback welcome
> Martin Thomas

Hello Martin,

Thank you very much!  With addition of the SWI handler,
your example is really a great one.  I adapted your code for my
own board (not industry standard) and now it works fine.
To support watchdog I added a small asembler function to your
swi_handler.S and it works too, though I am not an ARM assembler
expert:
WDTfeed:
        STMFD   sp!, {r4}
  MOV    r4,#0xaa
  MOV    r0,#0xe0000000
  STR    r4,[r0,#8]
  MOV    r4,#0x55
  STR    r4,[r0,#8]
  LDMFD   sp!, {r4}^
  MOVS  PC, LR

Maybe it is not a nice code and experts can suggest a better one.

One more question: I use Programmers Notepad from the standard
WinARM, but I could not find (if exists) how to let it know about
the '@' character as a comment.  So to avoid ugly highlights in
comments I replaced it with "//@".  Maybe there is a better way?

Thanks in advance,
Varuzhan

Reply

Entering an e-mail address is optional. If you want to receive reply notifications by e-mail, please log in.

Rules — please read before posting

  • Post long source code as attachment, not in the text
  • Posting advertisements is forbidden.

Formatting options

  • [c]C code[/c]
  • [avrasm]AVR assembler code[/avrasm]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]




Bild automatisch verkleinern, falls nötig
Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.