From: SourceForge.net <no...@so...> - 2005-12-12 01:10:12
|
Bugs item #1374531, was opened at 2005-12-06 08:05 Message generated for change (Comment added) made by arcanum You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=520074&aid=1374531&group_id=68108 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None >Status: Closed >Resolution: Invalid Priority: 5 Submitted By: Nobody/Anonymous (nobody) >Assigned to: Eric Weddington (arcanum) Summary: Modulo problem Initial Comment: I spot this problem here for eqivalent codes (not really as some use constatnt 63 and some 64). First code is compiled (and work) incorectly volatile u08 USART_TX_END; #define USART_BUFFER_LENGTH 64 USART_TX_END=(USART_TX_END+1)%USART_BUFFER_LENGTH; 001a 8091 0000 lds r24,Usart1_TxEnd 001e 9927 clr r25 0020 0196 adiw r24,1 0022 9C01 movw r18,r24 0024 207C andi r18,lo8(960) ; I thing this is WRONG ! 0026 3370 andi r19,hi8(960); I thing this is WRONG ! 0028 821B sub r24,r18 002a 930B sbc r25,r19 002c 8093 0000 sts Usart1_TxEnd,r24 #define USART_BUFFER_LENGTH 63 USART_TX_END=(USART_TX_END+1)%USART_BUFFER_LENGTH; 001a 8091 0000 lds r24,Usart1_TxEnd 001e 9927 clr r25 0020 0196 adiw r24,1 0022 6FE3 ldi r22,lo8(63) 0024 70E0 ldi r23,hi8(63) 0026 0E94 0000 call __divmodhi4 002a 8093 0000 sts Usart1_TxEnd,r24 #define USART_BUFFER_LENGTH 63 USART_TX_END++; USART_TX_END%=USART_BUFFER_LENGTH; 001a 8091 0000 lds r24,Usart1_TxEnd 001e 8F5F subi r24,lo8(-(1)) 0020 8093 0000 sts Usart1_TxEnd,r24 0024 8091 0000 lds r24,Usart1_TxEnd 0028 6FE3 ldi r22,lo8(63) 002a 0E94 0000 call __udivmodqi4 002e 9093 0000 sts Usart1_TxEnd,r25 #define USART_BUFFER_LENGTH 64: USART_TX_END++; USART_TX_END%=USART_BUFFER_LENGTH; 001a 8091 0000 lds r24,Usart1_TxEnd 001e 8F5F subi r24,lo8(-(1)) 0020 8093 0000 sts Usart1_TxEnd,r24 0024 8091 0000 lds r24,Usart1_TxEnd 0028 8F73 andi r24,lo8(63) 002a 8093 0000 sts Usart1_TxEnd,r24 ot...@e-... ---------------------------------------------------------------------- >Comment By: Eric Weddington (arcanum) Date: 2005-12-11 18:10 Message: Logged In: YES user_id=543419 Please read the WinAVR User Manual. Bugs having to do with the compiler or avr-libc need to go to those projects and not here. This bug is closed as invalid. Eric ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2005-12-09 07:55 Message: Logged In: NO I don't see anything wrong with this code. The index is a char value. 960 == 0x3C0, The value is incremented, the low 6 bits masked off and subtracted from the original incremented number. That effectively masks off the bits > 6. A bit convoluted, but reasonably efficient optimization of the MOD operator. THe only thing wrong is that the internal math is done 16 bits. That is because you are using the % operator. A more traditional way would be to express this like: end = (end + 1) & (Size -1); and you would get optimal code (which is why buffers tend to be in powers of two size). la...@ba... ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=520074&aid=1374531&group_id=68108 |