AVRGCC ICCAVR

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
Hello, All!


????????? ???? ?? 20080430...

unsigned char getSer_0(void)
    {
 292: 20 91 31 01  lds r18, 0x0131
 296: 30 91 32 01  lds r19, 0x0132
 29a: 80 91 4f 01  lds r24, 0x014F
 29e: 90 91 50 01  lds r25, 0x0150
 2a2: 28 17        cp r18, r24
 2a4: 39 07        cpc r19, r25
 2a6: 91 f0        breq .+36      ; 0x2cc <getSer_0+0x3a>

// ??? ?? ???? ?


        unsigned char received = 0x00;

 while(SCRxRdIdx_0 == SCRxWrIdx_0);   // wait for character

        received = SCRxBuf_0[SCRxRdIdx_0++];
 2a8: f9 01        movw r30, r18
 2aa: e9 5e        subi r30, 0xE9 ; 233
 2ac: fe 4f        sbci r31, 0xFE ; 254
 2ae: e0 81        ld r30, Z
 2b0: c9 01        movw r24, r18
 2b2: 01 96        adiw r24, 0x01 ; 1
 2b4: 90 93 32 01  sts 0x0132, r25
 2b8: 80 93 31 01  sts 0x0131, r24

        if(SCRxRdIdx_0 >= SC0RXBUFSIZ)
 2bc: 48 97        sbiw r24, 0x18 ; 24
 2be: 20 f0        brcs .+8       ; 0x2c8 <getSer_0+0x36>
              SCRxRdIdx_0 = 0;
 2c0: 10 92 32 01  sts 0x0132, r1
 2c4: 10 92 31 01  sts 0x0131, r1

        return received;
    }
 2c8: 8e 2f        mov r24, r30
 2ca: 08 95        ret
 2cc: ff cf        rjmp .-2       ; 0x2cc <getSer_0+0x3a>

// ?????? ??????



ICCAVR 6

(0092) unsigned char getSer_0(void)
(0093)     {
(0094)         unsigned char received = 0x00;
_getSer_0:
  received             --> R16
    017D 2700      CLR R16
(0095)
(0096)  while(SCRxRdIdx_0 == SCRxWrIdx_0);   // wait for character
    017E 9020016C  LDS R2,_SCRxWrIdx_0
    0180 9030016D  LDS R3,_SCRxWrIdx_0+1
    0182 9040016E  LDS R4,_SCRxRdIdx_0
    0184 9050016F  LDS R5,_SCRxRdIdx_0+1
    0186 1442      CP R4,R2
    0187 0453      CPC R5,R3
    0188 F3A9      BEQ 0x017E
(0097)
(0098)         received = SCRxBuf_0[SCRxRdIdx_0++];
(0099)
(0100)         if(SCRxRdIdx_0 >= SC0RXBUFSIZ)
    0189 01C2      MOVW R24,R4
    018A 9601      ADIW R24,1
    018B 9390016F  STS _SCRxRdIdx_0+1,R25
    018D 9380016E  STS _SCRxRdIdx_0,R24
    018F E780      LDI R24,0x70
    0190 E091      LDI R25,1
    0191 01F2      MOVW R30,R4
    0192 0FE8      ADD R30,R24
    0193 1FF9      ADC R31,R25
    0194 8100      LDD R16,Z+0
    0195 9180016E  LDS R24,_SCRxRdIdx_0
    0197 9190016F  LDS R25,_SCRxRdIdx_0+1
    0199 3188      CPI R24,0x18
    019A E0E0      LDI R30,0
    019B 079E      CPC R25,R30
    019C F030      BCS 0x01A3
(0101)               SCRxRdIdx_0 = 0;
    019D 2422      CLR R2
    019E 2433      CLR R3
    019F 9230016F  STS _SCRxRdIdx_0+1,R3
    01A1 9220016E  STS _SCRxRdIdx_0,R2
(0102)
(0103)         return received;
    01A3 9508      RET
(0104)     }

? ??? ????? ??? ?????...




With best regards, Andrej Arnold.  E-mail: snipped-for-privacy@aol.com



Re: AVRGCC ICCAVR
Привет, Andrej Arnold!

25.07.2008 20:01 Вы писали:

Quoted text here. Click to load it
     [...]
Quoted text here. Click to load it

   У тебя кодировка слетела.

--
Всего наилучшего,
Алексей Могильников

We've slightly trimmed the long signature. Click to see the full one.
AVRGCC ICCAVR
Alex,

You wrote to All:

 AM> Привет, Andrej Arnold!
 AM>
 AM> 25.07.2008 20:01 Вы писали:
 AM>
 >> ????????? ???? ?? 20080430...
 AM>
 AM>      [...]
 AM>
 >> ? ??? ????? ??? ?????...
 AM>
 AM>    У тебя кодировка слетела.

По любому там и без комнетариев всё понятно ...


Andrey


AVRGCC ICCAVR
All,


Я даже откатился на версию 20080430...
думал глюк только в новых...

как вообще народ с этим avrgcc работает
коль он элементарную строку:

while(SCRxRdIdx_0 == SCRxWrIdx_0);   // wait for character

неправильно компилирует?


unsigned char getSer_0(void)
    {
 292: 20 91 31 01  lds r18, 0x0131
 296: 30 91 32 01  lds r19, 0x0132
 29a: 80 91 4f 01  lds r24, 0x014F
 29e: 90 91 50 01  lds r25, 0x0150
 2a2: 28 17        cp r18, r24
 2a4: 39 07        cpc r19, r25
 2a6: 91 f0        breq .+36      ; 0x2cc <getSer_0+0x3a>

С чего тут прыжок в конец, а не в начало???


unsigned char received = 0x00;

 while(SCRxRdIdx_0 == SCRxWrIdx_0);   // wait for character

        received = SCRxBuf_0[SCRxRdIdx_0++];
 2a8: f9 01        movw r30, r18
 2aa: e9 5e        subi r30, 0xE9 ; 233
 2ac: fe 4f        sbci r31, 0xFE ; 254
 2ae: e0 81        ld r30, Z
 2b0: c9 01        movw r24, r18
 2b2: 01 96        adiw r24, 0x01 ; 1
 2b4: 90 93 32 01  sts 0x0132, r25
 2b8: 80 93 31 01  sts 0x0131, r24

        if(SCRxRdIdx_0 >= SC0RXBUFSIZ)
 2bc: 48 97        sbiw r24, 0x18 ; 24
 2be: 20 f0        brcs .+8       ; 0x2c8 <getSer_0+0x36>
              SCRxRdIdx_0 = 0;
 2c0: 10 92 32 01  sts 0x0132, r1
 2c4: 10 92 31 01  sts 0x0131, r1

        return received;
    }
 2c8: 8e 2f        mov r24, r30
 2ca: 08 95        ret
 2cc: ff cf        rjmp .-2       ; 0x2cc <getSer_0+0x3a>

// А тут и вовсе прпосто напросто виснем...


Тот же исходник, только под:

ICCAVR 6

(0092) unsigned char getSer_0(void)
(0093)     {
(0094)         unsigned char received = 0x00;
_getSer_0:
  received             --> R16
    017D 2700      CLR R16
(0095)
(0096)  while(SCRxRdIdx_0 == SCRxWrIdx_0);   // wait for character
    017E 9020016C  LDS R2,_SCRxWrIdx_0
    0180 9030016D  LDS R3,_SCRxWrIdx_0+1
    0182 9040016E  LDS R4,_SCRxRdIdx_0
    0184 9050016F  LDS R5,_SCRxRdIdx_0+1
    0186 1442      CP R4,R2
    0187 0453      CPC R5,R3
    0188 F3A9      BEQ 0x017E
(0097)
(0098)         received = SCRxBuf_0[SCRxRdIdx_0++];
(0099)
(0100)         if(SCRxRdIdx_0 >= SC0RXBUFSIZ)
    0189 01C2      MOVW R24,R4
    018A 9601      ADIW R24,1
    018B 9390016F  STS _SCRxRdIdx_0+1,R25
    018D 9380016E  STS _SCRxRdIdx_0,R24
    018F E780      LDI R24,0x70
    0190 E091      LDI R25,1
    0191 01F2      MOVW R30,R4
    0192 0FE8      ADD R30,R24
    0193 1FF9      ADC R31,R25
    0194 8100      LDD R16,Z+0
    0195 9180016E  LDS R24,_SCRxRdIdx_0
    0197 9190016F  LDS R25,_SCRxRdIdx_0+1
    0199 3188      CPI R24,0x18
    019A E0E0      LDI R30,0
    019B 079E      CPC R25,R30
    019C F030      BCS 0x01A3
(0101)               SCRxRdIdx_0 = 0;
    019D 2422      CLR R2
    019E 2433      CLR R3
    019F 9230016F  STS _SCRxRdIdx_0+1,R3
    01A1 9220016E  STS _SCRxRdIdx_0,R2
(0102)
(0103)         return received;
    01A3 9508      RET
(0104)     }

// Всё, вроде, здесь логично.



Andrey


Re: AVRGCC ICCAVR

Quoted text here. Click to load it

  Hед.

Quoted text here. Click to load it

  Абсолютно правильно. Что самое смешное.

Quoted text here. Click to load it


  А с того, что умный шибко. GCC. Соптимизировал твой while(forver) в
конструкцию вида jmp $. Ибо, следи за мыслью. Он их вначале загружает в
регистры из ОЗУ и потом сравнивает. Первая стадия оптимизации, следи за
мыслью -- не грузить в регистры уже там находящееся, ибо это
бессмысленно и накладно по ресурсам:

     lds r18, 0x0131
     lds r19, 0x0132
     lds r24, 0x014F
     lds r25, 0x0150
L1:     cp r18, r24
     cpc r19, r25
     breq L1

  Так сделает каждый разумный компилятор. Может не конкретно в таком
выражении (вот IAR не делает, и это по совершенно отдельной причине),
но в случае отсутствия циклов -- точно совершенно.
      
  Вторая стадия оптимизации -- выкинуть весь цикл ввиду абсурдности.
Попробуй поставить разные -O0, -O1, -O2, -O3 ключи оптимизации и
посмотреть что получается. Занимательно будет. И заодно почитай info gcc
о ключиках, которые включают эти -Ox.

Quoted text here. Click to load it


  Hе виснем, а выполняем while(forever). В смысле jmp $.

  google://volatile. Вобщем низачот. В очередной раз убеждаюсь, что
модное @#$ (IAR) в красивой обёртке учит исключительно плохому. Если не
дошло, то шибко умный в данном случае на самом деле IAR, а не GCC,
который видит, что ты в данном случае сам облажался или не умеешь на C
писать, но он панимашь-ли юзер-френдли должен быть, и подчищает все баги
за тобой на ходу, отключая оптимизацию в явно абсурдных ситуациях.



Re: AVRGCC ICCAVR
Hello, Kirill!
You wrote to Andrey Arnold on Tue, 29 Jul 2008 00:20:59 +0600:

 ??>> Я даже откатился на версию 20080430...
 ??>> думал глюк только в новых...
 KF>   Hед.
 ??>> while(SCRxRdIdx_0 == SCRxWrIdx_0);   // wait for character
 ??>> неправильно компилирует?
 KF>   Абсолютно правильно. Что самое смешное.
А чего тут правильного? А уж тем более смешного?

(Я тут жду, когда в прерывании, что-нибудь изменится - это же почти
очевидно...)


 ??>> unsigned char getSer_0(void)
 ??>>     {
 ??>>  292: 20 91 31 01  lds r18, 0x0131
 ??>>  296: 30 91 32 01  lds r19, 0x0132
 ??>>  29a: 80 91 4f 01  lds r24, 0x014F
 ??>>  29e: 90 91 50 01  lds r25, 0x0150
 ??>>  2a2: 28 17        cp r18, r24
 ??>>  2a4: 39 07        cpc r19, r25
 ??>>  2a6: 91 f0        breq .+36      ; 0x2cc <getSer_0+0x3a>

 ??>> С чего тут прыжок в конец, а не в начало???

 KF>   А с того, что умный шибко. GCC. Соптимизировал твой while(forver) в
 KF> конструкцию вида jmp $. Ибо, следи за мыслью. Он их вначале загружает в
 KF> регистры из ОЗУ и потом сравнивает. Первая стадия оптимизации, следи за
 KF> мыслью -- не грузить в регистры уже там находящееся, ибо это
 KF> бессмысленно и накладно по ресурсам:

Из одной мнимой бессмыслицы, появляется быссмыслица реальная.

 KF>   lds r18, 0x0131
 KF>   lds r19, 0x0132
 KF>   lds r24, 0x014F
 KF>   lds r25, 0x0150
 KF> L1:  cp r18, r24
 KF>   cpc r19, r25
 KF>   breq L1

 KF>   Так сделает каждый разумный компилятор. Может не конкретно в таком
 KF> выражении (вот IAR не делает, и это по совершенно отдельной причине),
 KF> но в случае отсутствия циклов -- точно совершенно.

 KF>   Вторая стадия оптимизации -- выкинуть весь цикл ввиду абсурдности.
 KF> Попробуй поставить разные -O0, -O1, -O2, -O3 ключи оптимизации и
 KF> посмотреть что получается. Занимательно будет. И заодно почитай info
 KF> gcc о ключиках, которые включают эти -Ox.

 ??>>  2c8: 8e 2f        mov r24, r30
 ??>>  2ca: 08 95        ret
 ??>>  2cc: ff cf        rjmp .-2       ; 0x2cc <getSer_0+0x3a>

 ??>> // А тут и вовсе прпосто напросто виснем...

 KF>   Hе виснем, а выполняем while(forever). В смысле jmp $.

google://volatile. Вобщем низачот. В очередной раз убеждаюсь, что
модное @#$ (IAR)

Это не "модное" ИАР, это это совсем немодное... ICCAVR.

в красивой обёртке учит исключительно плохому. Если не
дошло, то шибко умный в данном случае на самом деле IAR, а не GCC,
который видит, что ты в данном случае сам облажался или не умеешь на C
писать, но он панимашь-ли юзер-френдли должен быть, и подчищает все баги
за тобой на ходу, отключая оптимизацию в явно абсурдных ситуациях.


Я не вижу ошибок с точки зрения синтаксиса Це, посему на мой взгляд
это глюк компилятора чистой воды ...

ЗЫ.
Я и раньше наталкивался на какие-то зависоны (или может ошибки при
компиляции
(так сразу не вспомню)) у строк типа

while(1)
{}

но руки не доходили разобраться в истинной причине.




With best regards, Andrej Arnold.  E-mail: snipped-for-privacy@aol.com



AVRGCC ICCAVR
Hello snipped-for-privacy@aol.com!

29 Jul 36 12:09, snipped-for-privacy@aol.com wrote to Kirill Frolov:

 ??>>> Я даже откатился на версию 20080430...
 ??>>> думал глюк только в новых...
 KF>>   Hед.
 ??>>> while(SCRxRdIdx_0 == SCRxWrIdx_0);   // wait for character
 ??>>> неправильно компилирует?
 KF>>   Абсолютно правильно. Что самое смешное.
 b> А чего тут правильного? А уж тем более смешного?


 b> (Я тут жду, когда в прерывании, что-нибудь изменится - это же почти
 b> очевидно...)

Hу раз тебе очевидно - то сообщи об этом компилятору,
объявив переменную volatile , то есть имеющую возможность
измениться "снаружи".

Без такого объявления компилятору "очевидно" то, что переменная
не может измениться, так как к ней нет обращений внутри цикла.

Поэтому он и не выполняет "лишние" сравнения.

То есть такое поведение компилятора - совершенно не баг, а фича.


Sergei


AVRGCC ICCAVR
Sergei,

You wrote to snipped-for-privacy@aol.com:

 ??>>>> Я даже откатился на версию 20080430...
 ??>>>> думал глюк только в новых...
 KF>>>   Hед.
 ??>>>> while(SCRxRdIdx_0 == SCRxWrIdx_0);   // wait for character
 ??>>>> неправильно компилирует?
 KF>>>   Абсолютно правильно. Что самое смешное.
 b>> А чего тут правильного? А уж тем более смешного?
 SP>
 b>> (Я тут жду, когда в прерывании, что-нибудь изменится - это же
 b>> почти очевидно...)
 SP> Hу раз тебе очевидно - то сообщи об этом компилятору,
 SP> объявив переменную volatile , то есть имеющую возможность
 SP> измениться "снаружи".
 SP>
 SP> Без такого объявления компилятору "очевидно" то, что переменная
 SP> не может измениться, так как к ней нет обращений внутри цикла.
 SP>
 SP> Поэтому он и не выполняет "лишние" сравнения.
 SP>
 SP> То есть такое поведение компилятора - совершенно не баг, а фича.

... тут у меня видимо и в самом деле пробел в знаниях...
Спасибо.


Andrey


AVRGCC ICCAVR
                Hi, Andrey!

 SP>> То есть такое поведение компилятора - совершенно не баг, а фича.

 AA> ... тут у меня видимо и в самом деле пробел в знаниях...
 AA> Спасибо.

    на собственном опыте скажу, что пробел сурьёзный. обрати внимание:
http://www.hjtag.com/download/CTest.rar там много чего увидишь, если есть,
конечно, к чему прикопаться.


                                        oleg

AVRGCC ICCAVR
Oleg,

You wrote to Andrey Arnold:

 SP>>> То есть такое поведение компилятора - совершенно не баг, а фича.
 AA>> ... тут у меня видимо и в самом деле пробел в знаниях...
 AA>> Спасибо.
 od>     на собственном опыте скажу, что пробел сурьёзный.

Ты видимо тут недавно, а помнится на границе тысячелетий тут
заклевали того же шепелева, за то что он посмел усомнится в
стандартизации в Це...

 od> обрати внимание:
 od> http://www.hjtag.com/download/CTest.rar

А о каком там компиляторе речь-то, я что-то не понял?

 od> там много чего увидишь, если есть, конечно, к чему прикопаться.

Пока я вижу, что ICCAVR и AVRGCC  компилируют функционально
различно одинаковые исходные строки... и если уж на то пошло,
то ICCAVR c extern обращается корректно, а AVRGCC додумывает
за программиста сей вопрос (что (додумывание) тут ставилось
ICCAVR в укор ... типа).



Andrey


Re: AVRGCC ICCAVR
Hello, Andrey!
You wrote to Oleg Dozhdev on Sun, 03 Aug 2008 15:32:04 +0400:

 AA> Oleg,

 AA> You wrote to Andrey Arnold:

 SP>>>> То есть такое поведение компилятора - совершенно не баг, а фича.
 AA>>> ... тут у меня видимо и в самом деле пробел в знаниях...
 AA>>> Спасибо.
 od>>     на собственном опыте скажу, что пробел сурьёзный.

 AA> Ты видимо тут недавно, а помнится на границе тысячелетий тут
 AA> заклевали того же шепелева, за то что он посмел усомнится в
 AA> стандартизации в Це...

А что "нестандартного" в volatile ?  Разве что язык учить надо....

Шепелева "заклевали" как обычно за то, что он говорит о том, о чем и понятия
не имеет.
О Це он может(мог) рассуждать сколько угодно - он его не знает, по
крайнеймере - не знал тогда. Hадеюсь что уже выучил хоть чтото.

With best regards, Alexander Torres.
http://altor.sytes.net OR http://altor1.narod.ru



AVRGCC ICCAVR
                Hi, Andrey!

 od>> обрати внимание:
 od>> http://www.hjtag.com/download/CTest.rar

 AA> А о каком там компиляторе речь-то, я что-то не понял?

 od>> там много чего увидишь, если есть, конечно, к чему прикопаться.


    ни о каком, просто свой уровень проверишь и подучишь где надо. я вообще
половину вопросов завалил, если ты так болезненно относишсо.


                                        oleg

Re: AVRGCC ICCAVR
Hello, oleg!
You wrote to Andrey Arnold on Mon, 04 Aug 2008 15:16:04 +0600:

 od>>> обрати внимание:
 od>>> http://www.hjtag.com/download/CTest.rar
 AA>> А о каком там компиляторе речь-то, я что-то не понял?
 od>>> там много чего увидишь, если есть, конечно, к чему прикопаться.
 od>     ни о каком,
А какой тогда смысл?

Для общего развития (?)  у меня заковыристых вопросов и в учебнике полно,
причём на языках мне более понятных (в том числе и на русском),  а, скажем,
для понимания философии  CallBack мало понимать, что это вызовы функций
и иметь работающие примеры. ( Мне сейчас именно этого (понимания
возможностей
с использованием таких вызовов) и не хватет.)
Да и все эти адресации адресов тоже требуют перекройки мышления,
которое даётся не так уж и просто, если этим не заниматься с "детства".




With best regards, Andrej Arnold.  E-mail: snipped-for-privacy@aol.com



AVRGCC ICCAVR
Hello Andrey Arnold!

 SP>> объявив переменную volatile , то есть имеющую возможность

 AA> ... тут у меня видимо и в самом деле пробел в знаниях...
 AA> Спасибо.

Отмечу, что суть применения volatile разъяснялась имхо даже в тонюсеньком
"справочнике по языку С" Болски ...


AVRGCC ICCAVR
Alexander,

You wrote to Andrey Arnold:

 SP>>> объявив переменную volatile , то есть имеющую возможность
 AA>> ... тут у меня видимо и в самом деле пробел в знаниях...
 AA>> Спасибо.
 AK> Отмечу, что суть применения volatile разъяснялась имхо даже в
 AK> тонюсеньком "справочнике по языку С" Болски ...

 А в моём справочнике для ВУЗов написано, что это ключевое слово не
стандартизировано в Це, и реализация зависит от компилятора.

 Hу а поскольку ICCAVR пока обходился у меня без "изменчивости"...
другое поведение AVRGCC и показалось из ряда вон... про "изменчивость"
в тот момент я и не подумал.


Andrey


Re: AVRGCC ICCAVR
Hello, Andrey Arnold!
You wrote in conference fido7.ru.embedded to Alexander Konosevich on Sun, 03
Aug 2008 15:44:05 +0400:


 SP>>>> объявив переменную volatile , то есть имеющую возможность
 AA>>> ... тут у меня видимо и в самом деле пробел в знаниях...
 AA>>> Спасибо.
 AK>> Отмечу, что суть применения volatile разъяснялась имхо даже в
 AK>> тонюсеньком "справочнике по языку С" Болски ...

 AA>  А в моём справочнике для ВУЗов написано, что это ключевое слово не
 AA> стандартизировано в Це, и реализация зависит от компилятора.

Ключевое слово AFAIK стандартизовано, реализация действительно зависит, так
она у многих слов зависит.

dima
http://www.dorlov.no-ip.com
http://dimorlus.dynalias.com



AVRGCC ICCAVR
                Hi, Kirill!


 KF>   google://volatile. Вобщем низачот. В очередной раз убеждаюсь, что
 KF> модное @#$ (IAR) в красивой обёртке учит исключительно плохому. Если
 KF> не дошло, то шибко умный в данном случае на самом деле IAR, а не GCC,
 KF> который видит, что ты в данном случае сам облажался или не умеешь на C
 KF> писать, но он панимашь-ли юзер-френдли должен быть, и подчищает все
 KF> баги за тобой на ходу, отключая оптимизацию в явно абсурдных
 KF> ситуациях.


    а морать басни какова? на чём программить? под ARM что лучше? сейчас
поставил keil uVision 3.22. Что скажуть знатоки?


                                        oleg

Re: AVRGCC ICCAVR
Привет, oleg dozhdev!

02.08.2008 16:04 Вы писали:

Quoted text here. Click to load it

   Для ARM использую gcc (пишу на C и C++), нареканий не имею.

--
Всего наилучшего,
Алексей Могильников


C ARM
                Hi, Alex!


 >>     а морать басни какова? на чём программить? под ARM что лучше?
 >> сейчас поставил keil uVision 3.22. Что скажуть знатоки?

 AM>    Для ARM использую gcc (пишу на C и C++), нареканий не имею.


    это для виндов? что есть в комплекте и откуда скачать можно? если есть, дай
ссылочку на компилятор. (как инет дадут, скачаю.)

    вот сейчас посмотрел на диске, коллега бывший писал, есть gccarm331.exe.
видимо, установочник, 21 метр. если это оно, то, какие у него плюсы по
сравнению с кеилом? вспоминается, коллега говорил, что код, собранный кейлом и
гцц различается в 2 раза, не в пользу второго.

    если плюсы всё же есть (надо сказать, мне самому не нравятся ИДЕ, легче в
нотпаде++ набрать, а затем из фара запустить компилятор), распиши, пожалуйста.


                                        oleg

Re: C ARM

Quoted text here. Click to load it

  http://gandalf.arubi.uni-kl.de/avr_projects/arm_projects/#winarm

Quoted text here. Click to load it

  Да конечно XXX -- говно и поделки финских студентов. (скромно умолчу,
что насколько я знаю внутри uVision тот же gcc запрятан).


Site Timeline