avr-gcc
Andras Tantos
andras_tantos at tantos.homelinux.org
Tue May 6 10:09:15 CEST 2003
> Egyetlen dolog zavarta most meg a nyugalmamat. Akartam irni egy
> ezredmasodperces felbontasu keslelteto fuggvenyt a timertol fuggetlenul.
> Kezenfekvo a megoldas, az orajeltol fuggoen vegrehajtunk N db ures
> ciklust (elvileg N kb. CLK/4000, ha 4 orajel hosszu ciklust csinalunk).
>
> A CLK/4000 tul gyors lett (hibasan!), ezert mindenfele ertekeket
> probalgattam. Alant lathato az illeto fuggveny es a gcc altal generalt
> assembly forras ket valtozata.
>
> A belso ciklusban van a lenyeg: CLK/160-nal pontosan azt teszi, amit C-ben
> irtam, azaz egyesevel csokkenti az i-t. CLK/320-nal viszont mar 25-osevel
> csokkenti az i-t! Honnan veszi a 25-ot...?
>
> Most akkor egybol irjam is a bugreportot, vagy van valami esszeru
> magyarazat a tortentekre?
Egy megjegyzes: 800000 nagyobb, mint 65535, a legnagyobb 16-bites unsigned
integer. Probald meg ezt:
#define CLK 8000000L
valamint ezt:
for(i=(uint16_t)(CLK/320L);i;i--)
Talan segit. Ettol meg nekem is code-gen problemanak lattszik, de a te
programod se hibatlan.
Es meg valami: nem illik ilyen idozitest csinalni C-ben. Amint bekapcsolod az
optimalizalast, az egeszbol semmi sem marad. Az ilyet leginkabb assembly-ben
erdemes megirni, de legalabb tedd a kovetkezot:
volatile uint_16_t __delay_internal_counter;
void delay(uint16_t ms) {ˇ
uint16_t i;ˇ
for(;ms;ms--) {ˇ
for(__delay_internal_counter=CLK/160;
__delay_internal_counter;
__delay_internal_counter--)
{
}
}
}
Ettol talan mar megremul a fordito annyira, hogy nem optimalizalja a fuggvenyt
tovabb.
>
> Gumo
>
> ========================================
> #define CLK 8000000
> ...
> void delay(uint16_t ms) {ˇ
> uint16_t i;ˇ
> for(;ms;ms--) {ˇ
> for(i=CLK/160;i;i--) {ˇ
> }ˇ
> }ˇ
> }ˇ
> ========================================
> .LM3:ˇ
> ldi r18,lo8(-15536)ˇ
> ldi r19,hi8(-15536)ˇ
> .L10:ˇ
> subi r18,lo8(-(-1))ˇ
> sbci r19,hi8(-(-1))ˇ
> brne .L10ˇ
> .stabn 68,0,68,.LM4-delay
> .LM4:ˇ
> sbiw r24,1ˇ
> brne .L11ˇ
> ========================================
> #define CLK 8000000
> ...
> void delay(uint16_t ms) {ˇ
> uint16_t i;ˇ
> for(;ms;ms--) {ˇ
> for(i=CLK/320;i;i--) {ˇ
> }ˇ
> }ˇ
> }ˇ
> ========================================
> .LM3:ˇ
> ldi r18,lo8(25000)ˇ
> ldi r19,hi8(25000)ˇ
> .L10:ˇ
> subi r18,lo8(-(-25))ˇ
> sbci r19,hi8(-(-25))ˇ
> brne .L10ˇ
> .stabn 68,0,68,.LM4-delay
> .LM4:ˇ
> sbiw r24,1ˇ
> brne .L11ˇ
> ========================================
>
> ---------------------------------------
> Legyszi ezentul az elektro at tesla.hu
> cimre kuldd a leveleket
More information about the Elektro
mailing list