public inbox for ecos-discuss@sourceware.org
 help / color / mirror / Atom feed
From: Bob Brusa <bob.brusa@gmail.com>
To: Michael Bergandi <mbergandi@gmail.com>
Cc: discuss ecos <ecos-discuss@ecos.sourceware.org>
Subject: Re: [ECOS] Interrupt handling under eCOS for the arm AT91SAM7s
Date: Mon, 27 Aug 2012 19:55:00 -0000	[thread overview]
Message-ID: <503BD096.7000708@gmail.com> (raw)
In-Reply-To: <CAOHvnTMR9m8RYkMEyD54e4bB2ncC2Ruy_7p7tzCpgsxL0s0zDw@mail.gmail.com>

Am 27.08.2012 21:30, schrieb Michael Bergandi:
> Bob,
>
>> I use an ISR that has considerable work to. Clearly, a job for a dsr, but I
>> found, that using a dsr is too time consuming, so I must do everything in
>> the isr (A screenshot of the ISR is available here:
>> https://dl.dropbox.com/u/13412634/Screenshot%20-%2021.08.jpg)
>
> The ISR doesn't look that big to me really. To get a real idea of how
> long your ISR is taking, you can just time it. If you have the memory
> you can simply accumulate the timing in a buffer and print them out
> later to look for abnormalities.
>
>> The ISR handles 4 pwm channels - all producing interrupts at a rate of 1 ms.
>> 3 of the channels run syncronously and hence only one of them has interrupts
>> enabled. The 4th channels also triggers interrupts every ms, but is not in
>> phase with the other 3 channels. The pwm interrupts have lowest priority of
>> all interrupts in my system.
>
> Ok, there may be an issue here. Considering that they are the lowest
> priority, anything and everything else in the system can put them off
> causing you to miss an interrupt from the PWM. The timings as
> described above can give you some insight into that.
>
>> Upon entry in the pwm_isr, I clear flags, mask the interrupt of the
>> pwm-hardware on the level of the interrupt controller (AIC) and enable
>> interrupts again. This should allow higher priority interrupts to come
>> through, but no pwm interrupts while the pwm_isr is busy. This according to
>> my understanding. But it is obviously wrong, because the primitve
>> "semaphore" I implemented tells me, that a 2nd pwm interrupt interrupts the
>> first one.
>
> First, remove the HAL_ENABLE_INTERRUPTS macro from the ISR. That is
> not needed and may be causing problems. That call enables the system
> interrupt controller. HAL interrupts are obviously enabled if you got
> into the ISR to begin with.
>
> Next, you should mask the interrupt, then acknowledge it. If you use a
> DSR, then unmask at the end of the DSR.
>
> Now, be absolutely certain that all pwm channel vectors are set to the
> same priority (even the one's you THINK aren't enabled). Sounds to me
> like one of them is enabled and shouldn't be and has a higher
> priority. For example, you have:
>
> if (pwm_isr & 7)  then the ISR was triggered by pwm0, which is
> synchronous with pwm1 and pwm2
>
> Well,
>
> if ((pwm_isr & 6) != 0) then pwm1 or pwm2 is generating interrupts and
> one of them is probably a higher priority than the others.
>
>
>> One explanation I have for this is, that one of the higher priority
>> interrupts clears the interrupt mask of the pwm channels - which I would
>> consider a bug of eCos.
>
> Probably unlikely.
>
>> Onother explanation could be, that the system timer interrupts the pwm_isr
>> and runs a task and of course, many threads in my system access globals of
>> the pwm_isr, doing this within mask-pwm-interrupts/unmask-pwm-interrupts
>> brackets. But it would surprise me that ecos runs a thread while an isr is
>> still unfinished. Any comments?
>
> eCos will not run a task while an ISR or DSR is executing.
>
> Hope this helps you along.
>
Michael,
you wrote:
First, remove the HAL_ENABLE_INTERRUPTS macro from the ISR. That is
not needed and may be causing problems. That call enables the system
interrupt controller. HAL interrupts are obviously enabled if you got
into the ISR to begin with.

But if I do this, even higher priority interrupts are no longer allowed 
to come through. But I need them - otherwize I might loose characters 
during io-operations.

Yes, I am sure that only pwm3 and pwm0 generate interrupts. The 
AT91SAM7s ores all pwm-interrupt together and assigns them to vectored 
interrupt 10.

What I need is
1 pwm-interrupt 10 is blocked while its isr is running
2 interrupts of higher priority come through
3 pwm interrupts that happen while the pwm_isr is busy are defered and
   as soon as I return from the pwm_isr, such a possibly pending new
   pwm_interrupt should invoke pwm_isr again.

I have the impression, that I got something wrong with the sequence of 
eCos-calls in the pwm_isr. Caling them in proper sequence would probalby 
achieve the desired result.

Any further comments? Thanks and regards - Bob

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss

  reply	other threads:[~2012-08-27 19:55 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-22  7:27 Bob Brusa
2012-08-27 19:31 ` Michael Bergandi
2012-08-27 19:55   ` Bob Brusa [this message]
     [not found] <CAOHvnTNSNzD0G+QMAv+B2+ZpRgwwCm5+7oQ+ArXXn-t_VJ6t=g@mail.gmail.com>
2012-08-30 13:37 ` Bob Brusa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=503BD096.7000708@gmail.com \
    --to=bob.brusa@gmail.com \
    --cc=ecos-discuss@ecos.sourceware.org \
    --cc=mbergandi@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).