Re: NutEnterCritical vs NutEnterCriticalAccess()
Uwe Bonnes <bon-1JbLm1bU5j5ZIx36JBfelj3+ndqKAYMe9FMPySWZwLkb1SvskN2V4Q@public.gmane.org>
| Newsgroups | gmane.comp.hardware.microcontrollers.ethernut |
|---|---|
| Message-ID | <[email protected]> |
>>>>> "Ole" == Ole Reinhardt <ole.reinhardt-L1vi/[email protected]> writes: Ole> Hi Uwe, I suspect you are on the wrong track. In my understanding Ole> assigning the value of one variable to another will result at least Ole> in one load and one store operation on ARM. I am not talking about atomic read-modify-update. I talk about a single read _or_ write to a volatile variable. Look e.g. at dev/usart.c: UsartResetBuffer /* Disable further buffer usage. */ NutEnterCritical(); rbf->rbf_siz = 0; NutExitCritical(); rbf->rbf_siz is only changed by UsartResetBuffer itself. But the IRQ routines uses this value for calculation of available/used bytes and size== 0 means that the buffer is not available. On AVR the operation rbf->rbf_siz = 0; may be interrupted, leaving rbf_siz in an "undefined" state with either the high or the low byte already set to zero and the other byte still valid. Only this situation is addressed by the critical section around the access. But on 32-bit machines, rbf->rbf_siz = 0 is atomic per-se and so the critical section is not needed. Ole> Even more, if one of the variables uses indirect addressing (like Ole> in your example) Look atdev/usart.c: UsartRead() NutEnterCritical(); avail = rbf->rbf_cnt; NutExitCritical(); The purpose of the critical section is to read valid data. The data may have changed just before or will change just after, that doesn't matter if we guarantee to always read a valid value. On AVR this is not guaranteed for values > 1 Byte, but on a 32-bit machine this is guaranted for up to 4-byte values. Ole> Instead of writing such error prone hacks, I would suggest to only Ole> disable single interrupts instead of disabling the whole interrupt Ole> handling, wherever possible. I agree, machine specific driver code should do so. But code in dev/ does not know the IRQ involved and so can not do so. Bye -- Uwe Bonnes bon-1JbLm1bU5j5ZIx36JBfelj3+ndqKAYMe9FMPySWZwLkb1SvskN2V4Q@public.gmane.org Institut fuer Kernphysik Schlossgartenstrasse 9 64289 Darmstadt --------- Tel. 06151 1623569 ------- Fax. 06151 1623305 --------- _______________________________________________ http://lists.egnite.de/mailman/listinfo/en-nut-discussion