public inbox for ecos-discuss@sourceware.org
 help / color / mirror / Atom feed
From: Marcel Ovidiu Achim <marcel.achim@ovidius-ib.de>
To: marcel.achim@ovidius-ib.de
Cc: ecos-discuss@sources.redhat.com,  ecos-discuss@ecos.sourceware.org
Subject: [ECOS] AT91 on EB55 DSR is started only once
Date: Wed, 18 May 2005 09:49:00 -0000	[thread overview]
Message-ID: <428AD5CA.4080900@ovidius-ib.de> (raw)
In-Reply-To: <E1DXzpq-0007Bq-00@mrelay.alturo.net>

Dear all,

I am experiencing some weird behaviour when trying to setup a timer
interrupt on an EB55 board.
I attached the relevant code below.
What happens is that the DSR is started only once after init from main,
and then never again, although the
timer interrupt is shown to occur (on an ascilloscope).
By accident I discovered that this can be fixed if I insert the
following line in the DSR:

HAL_READ_UINT32( AT91_TC1 + AT91_TC_SR, i );

Although the read seems to have no impact of the content of the SR
register,
it seems to magically have the DSR activated again.
I could live fine with that, but then other external interrupts seem to
considerably bring down overall system performance.
What am I overseeing here? Can anyone please help?

Thanks,



void main() {

...

// Create interrupt for Timer3 with prio 10
cyg_interrupt_create(
CYGNUM_HAL_INTERRUPT_TIMER3,
10,
0,
Timer_ISR,
Timer_DSR,
&handle_timer_isr,
&isr
);

cyg_interrupt_attach(handle_timer_isr);

// AIC Source Mode Register. TC3 interupt on a positive edge of the
TC3 timer.
HAL_WRITE_UINT32( AT91_AIC + AT91_AIC_SMR9, AT91_AIC_SMR_EDGE_POS);

// AIC Source Mode Register. IRQ0 positive edge-triggerd
HAL_WRITE_UINT32( AT91_AIC + AT91_AIC_SMR29, AT91_AIC_SMR_EDGE_POS);

// AIC Source Mode Register. IRQ1 positive edge-triggerd
HAL_WRITE_UINT32( AT91_AIC + AT91_AIC_SMR28, 0x00000060);

//
// CLOCK CONFIGURATION
//

// Generate interrupt on RC compare
HAL_WRITE_UINT32( 0x00 + AT91_TC1 + AT91_TC_IER, AT91_TC_IER_CPC);

// Fill RC register with a value
HAL_WRITE_UINT32( 0x00 + AT91_TC1 + AT91_TC_RC, 0x00003FFF);

// TC command register. Set the frequency for the timer, enabel Wave
Mode and
// on RC compare reset the timer and start it again.
HAL_WRITE_UINT32( 0x00 + AT91_TC1 + AT91_TC_CMR,
AT91_TC_CMR_CLKS_MCK2
| AT91_TC_CMR_WAVE
| AT91_TC_CMR_CPCTRG
| AT91_TC_CMR_ACPC_TOGGLE
);

// Enable and start the timer
HAL_WRITE_UINT32( 0x00 + AT91_TC1 + AT91_TC_CCR, 0x01 + 0x04);

...

// Enable interrupts
cyg_interrupt_enable();
}



cyg_uint32 Timer_ISR(cyg_vector_t vector, cyg_addrword_t data)
{
// Block this interrupt from occurring until DSR completed
cyg_interrupt_mask (vector);

// Ack the interrupt so other routines can be serviced
cyg_interrupt_acknowledge(vector);

// Proceed to DSR
return CYG_ISR_CALL_DSR;
}


void Timer_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t
data)
{
int i=0;

if ( some_global_condition ) {
execute_code();
}

HAL_READ_UINT32( AT91_TC1 + AT91_TC_SR, i );

// Allow this interrupt to occur again
cyg_interrupt_unmask (vector);
}



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

WARNING: multiple messages have this Message-ID
From: Marcel Ovidiu Achim <marcel.achim@ovidius-ib.de>
To: marcel.achim@ovidius-ib.de
Cc: ecos-discuss@sources.redhat.com,  ecos-discuss@ecos.sourceware.org
Subject: [ECOS] AT91 on EB55 DSR is started only once
Date: Wed, 18 May 2005 10:11:00 -0000	[thread overview]
Message-ID: <428AD5CA.4080900@ovidius-ib.de> (raw)
Message-ID: <20050518101100.bOa76wPzcTAWJEo-v1QG9yVOCTaRHfptgc-Bq0s0UvI@z> (raw)
In-Reply-To: <E1DXzpq-0007Bq-00@mrelay.alturo.net>

Dear all,

I am experiencing some weird behaviour when trying to setup a timer
interrupt on an EB55 board.
I attached the relevant code below.
What happens is that the DSR is started only once after init from main,
and then never again, although the
timer interrupt is shown to occur (on an ascilloscope).
By accident I discovered that this can be fixed if I insert the
following line in the DSR:

HAL_READ_UINT32( AT91_TC1 + AT91_TC_SR, i );

Although the read seems to have no impact of the content of the SR
register,
it seems to magically have the DSR activated again.
I could live fine with that, but then other external interrupts seem to
considerably bring down overall system performance.
What am I overseeing here? Can anyone please help?

Thanks,



void main() {

...

// Create interrupt for Timer3 with prio 10
cyg_interrupt_create(
CYGNUM_HAL_INTERRUPT_TIMER3,
10,
0,
Timer_ISR,
Timer_DSR,
&handle_timer_isr,
&isr
);

cyg_interrupt_attach(handle_timer_isr);

// AIC Source Mode Register. TC3 interupt on a positive edge of the
TC3 timer.
HAL_WRITE_UINT32( AT91_AIC + AT91_AIC_SMR9, AT91_AIC_SMR_EDGE_POS);

// AIC Source Mode Register. IRQ0 positive edge-triggerd
HAL_WRITE_UINT32( AT91_AIC + AT91_AIC_SMR29, AT91_AIC_SMR_EDGE_POS);

// AIC Source Mode Register. IRQ1 positive edge-triggerd
HAL_WRITE_UINT32( AT91_AIC + AT91_AIC_SMR28, 0x00000060);

//
// CLOCK CONFIGURATION
//

// Generate interrupt on RC compare
HAL_WRITE_UINT32( 0x00 + AT91_TC1 + AT91_TC_IER, AT91_TC_IER_CPC);

// Fill RC register with a value
HAL_WRITE_UINT32( 0x00 + AT91_TC1 + AT91_TC_RC, 0x00003FFF);

// TC command register. Set the frequency for the timer, enabel Wave
Mode and
// on RC compare reset the timer and start it again.
HAL_WRITE_UINT32( 0x00 + AT91_TC1 + AT91_TC_CMR,
AT91_TC_CMR_CLKS_MCK2
| AT91_TC_CMR_WAVE
| AT91_TC_CMR_CPCTRG
| AT91_TC_CMR_ACPC_TOGGLE
);

// Enable and start the timer
HAL_WRITE_UINT32( 0x00 + AT91_TC1 + AT91_TC_CCR, 0x01 + 0x04);

...

// Enable interrupts
cyg_interrupt_enable();
}



cyg_uint32 Timer_ISR(cyg_vector_t vector, cyg_addrword_t data)
{
// Block this interrupt from occurring until DSR completed
cyg_interrupt_mask (vector);

// Ack the interrupt so other routines can be serviced
cyg_interrupt_acknowledge(vector);

// Proceed to DSR
return CYG_ISR_CALL_DSR;
}


void Timer_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t
data)
{
int i=0;

if ( some_global_condition ) {
execute_code();
}

HAL_READ_UINT32( AT91_TC1 + AT91_TC_SR, i );

// Allow this interrupt to occur again
cyg_interrupt_unmask (vector);
}



-- 
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:[~2005-05-18  5:42 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <E1DXzpq-0007Bq-00@mrelay.alturo.net>
2005-05-18  9:49 ` Marcel Ovidiu Achim [this message]
2005-05-18 10:11   ` Marcel Ovidiu Achim
2005-05-19  4:25   ` Nick Garnett

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=428AD5CA.4080900@ovidius-ib.de \
    --to=marcel.achim@ovidius-ib.de \
    --cc=ecos-discuss@ecos.sourceware.org \
    --cc=ecos-discuss@sources.redhat.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).