<div dir="ltr">Thank you a lot ! maybe i was thinking make code more clear and then forget the right<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Apr 28, 2019 at 3:27 PM Christian Mauderer <<a href="mailto:list@c-mauderer.de">list@c-mauderer.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Am 27.04.19 um 16:40 schrieb Christian Mauderer:<br>
> Am 24.04.19 um 10:00 schrieb Jython:<br>
>> HI, ALL!<br>
>> why the code stuck in wakeup handler while the RTC gets time work fine<br>
>> i have checked some days, but no register error found, i suspect that<br>
>> the handler function is the issue<br>
>><br>
>><br>
>> // code<br>
>> rtems_isr rtc_wakeup_handler(rtems_vector_number vector)<br>
>> {<br>
>>    <br>
>>     uint32_t STM32F4_RTC_ISR = (*(volatile uint32_t *)(0x4000280C));<br>
>>    <br>
>>     // clear 10bit<br>
>>     if(STM32F4_RTC_ISR & (1<<10))<br>
>>     {<br>
>>         //printk("wak\n");<br>
>>         STM32F4_RTC_ISR &= ~(1<<10);<br>
>>         STM32F4_RTC_ISR &= 0xfffffbff;<br>
>>     }<br>
>>    <br>
>>     volatile uint32_t EXIT_PR = *(volatile uint32_t*)0x40013C14;<br>
>>     printk("before clr %08x\n", EXIT_PR);<br>
>>     EXIT_PR |= 1<<22;<br>
>>    <br>
>>     int i;<br>
>>     for(i = 0; i < 1000; i++) i = i + 1 - 1;<br>
>>     printk(" %08x\n", EXIT_PR);<br>
>> }<br>
>><br>
>><br>
>> the printed log attached,  why the EXIT_PR bit22 not cleared<br>
>><br>
>><br>
> <br>
> Hello Jython,<br>
> <br>
> your EXIT_PR seems to be slightly odd. What you do:<br>
> <br>
>     volatile uint32_t EXIT_PR = *(volatile uint32_t*)0x40013C14;<br>
> <br>
> This means you read the content of 0x40013C14 and write it to a 32 bit<br>
> value.<br>
> <br>
> Later you do<br>
> <br>
>     EXIT_PR |= 1<<22;<br>
> <br>
> This changes the _copy_ of the value.<br>
> <br>
> What you most likely want to do is the following:<br>
> <br>
>     volatile uint32_t *EXIT_PR = (volatile uint32_t*)0x40013C14;<br>
>     *EXIT_PR |= 1<<22;<br>
> <br>
> This would change the value at 0x40013C14 and not only your copy.<br>
> <br>
> By the way: You tried to do a busy wait. That's not a good idea in an<br>
> interrupt. The way you implemented it, the compiler most likely even<br>
> just removes it:<br>
> <br>
>     int i;<br>
>     for(i = 0; i < 1000; i++) i = i + 1 - 1;<br>
> <br>
> The compiler most likely notices that this statement has no effect. If<br>
> you would like to implement a busy wait that way, you should use a<br>
> volatile int.<br>
> <br>
> Note that RTEMS has a rtems_counter_delay_nanoseconds() function. That<br>
> is a busy wait loop. It is based on the CPU counter and provides a<br>
> method for short busy waits for example during driver initialization.<br>
> But again: Please don't use busy waits in Interrupts. It's not a good<br>
> idea and will lead to problems sooner or later.<br>
> <br>
> Best regards<br>
> <br>
> Christian Mauderer<br>
<br>
Oh, and I just noted: You are writing a one to the register but expect<br>
the bit to be cleared. So it is most likely a "write one to clear"<br>
register (which is quite common for interrupt flags). In that case you<br>
maybe don't want to use a<br>
<br>
    *EXIT_PR |= 1<<22;<br>
<br>
but a<br>
<br>
    *EXIT_PR = 1<<22;<br>
<br>
Otherwise you clear other flags in that register too. Please have a look<br>
at the reference manual of your chip to decide that.<br>
<br>
Best regards<br>
<br>
Christian<br>
</blockquote></div>