|
Как программно сгенерить ресет? |
|
|
|
 |
Ответов
|
May 26 2008, 15:11
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Щаз я Вам все объясню  Дело в том что у WinAVR есть такая бага/фича (бага с точки зрения стандарта) что переход по ((void(*)(void))0x0)(); может осуществляться НЕ на нулевой адрес. Это зависит от того сколько флеша есть у контроллера. Если на проце >8Kb(4Кслов) , то такой вызов будет правильным call 0x0000 , если же на проце меньше или равно 8Kb то у проца просто нет инструкций call/jmp а есть только rcall/rjmp те абсолютные адреса понимать он не может(на этапе компиляции), поэтому для таких процов джамп будет не на 0 адрес. Вот примеры одного и того же кода для mega16: Код int main(void) { 8e: cf e5 ldi r28, 0x5F; 95 90: d4 e0 ldi r29, 0x04; 4 92: de bf out 0x3e, r29; 62 94: cd bf out 0x3d, r28; 61
((void(*)(void))0x0)(); 96: 0e 94 00 00 call 0x0 <__vectors> Прыгнули куда надо! и для mega8: Код int main(void) { 5c: cf e5 ldi r28, 0x5F; 95 5e: d4 e0 ldi r29, 0x04; 4 60: de bf out 0x3e, r29; 62 62: cd bf out 0x3d, r28; 61
((void(*)(void))0x0)(); 64: fb df rcall .-10 ; 0x5c <main> Не знали куда надо прыгать, поэтому прыгнули на main! А теперь добавляем функцию на мега8: Код void softreset() { ((void(*)(void))0x0)(); 5c: ff df rcall .-2 ; 0x5c <softreset> 5e: 08 95 ret
00000060 <main>: }
int main(void) { 60: cf e5 ldi r28, 0x5F; 95 62: d4 e0 ldi r29, 0x04; 4 64: de bf out 0x3e, r29; 62 66: cd bf out 0x3d, r28; 61
softreset(); 68: f9 df rcall .-14 ; 0x5c <softreset> ОБА-НА, прыжок то на адрес начала функции(интересно что будет когда стек налезет на на регистры  ) Почему разработчики WinAVR не сделали вполне валидный в этом случае icall для меня загадка, наверное регистры r31:r30 решили сэкономить  итого для чипов с <=8Kb лучше так: Код __asm__ __volatile__("ldi r30,0\n\t"\ "ldi r31,0\n\t"\ "ijmp");
|
|
|
|
|
May 26 2008, 16:03
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(singlskv @ May 26 2008, 18:11)  итого для чипов с <=8Kb лучше так: Код __asm__ __volatile__("ldi r30,0\n\t"\ "ldi r31,0\n\t"\ "ijmp"); А почему только до 8kb, а не до 128kb? Этот код на m128 точно будет работать - значит это общий случай. только если делать "asm" вставку, то что мешает написать Код asm( "jmp 0x0"); будет работать без ограничений для толтых чипов. ЗЫ: зачем писать "__asm__ __volatile__" когда уже есть макрос "asm". придерживающийся одинакового синтаксиса и поддерживаемый всеми компиляторами для AVR (по крайней мере теми, которые я пробовал).
|
|
|
|
|
May 26 2008, 16:23
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ May 26 2008, 20:03)  А почему только до 8kb, а не до 128kb? Этот код на m128 точно будет работать. ну в том смысле что на <=8Кб по другому никак Цитата только если делать "asm" вставку, то что мешает написать Код asm( "jmp 0x0"); будет работать без ограничений для толтых чипов. на толстых то и без асм все работает ((void(*)(void))0)(); Цитата ЗЫ: и нафига писать "__asm__ __volatile__" когда уже есть макрос "asm". придерживающийся одинакового синтаксиса и поддерживаемый всеми компиляторами для AVR (по крайней мере теми, которые я пробовал). А это немного народное поверие когда-то давно вычитаное из описания avr-libc : Let us first examine the part of a compiler listing which may have been generated from our example: lds r24,value /* #APP */ in r24, 12 /* #NOAPP */ sts value,r24 The comments have been added by the compiler to inform the assembler that the included code was not generated by the compilation of C statements, but by inline assembler statements. The compiler selected register r24 for storage of the value read from PORTD. The compiler could have selected any other register, though. It may not explicitely load or store the value and it may even decide not to include your assembler code at all. All these decisions are part of the compiler’s optimization strategy. For example, if you never use the variable value in the remaining part of the C program, the compiler will most likely remove your code unless you switched off optimization. To avoid this, you can add the volatile attribute to the asm statement: asm volatile("in %0, %1" : "=r" (value) : "I" (_SFR_IO_ADDR(PORTD)));
ну а запись "__asm__ __volatile__" это так в самой avr-libc пишут...
|
|
|
|
Сообщений в этой теме
Karl Как программно сгенерить ресет? Jul 26 2005, 10:52 MALLOY2 1) можнро через вачдог если он есть
2) а можно ... Jul 26 2005, 11:27 Rock Цитата(MALLOY2 @ Jul 26 2005, 15:27) 1) ... May 21 2008, 13:52  Палыч Цитата(Rock @ May 21 2008, 16:52) В WinAV... May 21 2008, 14:20  Сергей Борщ Цитата(Rock @ May 21 2008, 16:52) В WinA... May 21 2008, 14:23   IgorKossak Цитата(Сергей Борщ @ May 21 2008, 17:23) ... May 21 2008, 19:05    zltigo Цитата(IgorKossak @ May 21 2008, 21:05) Н... May 21 2008, 19:27     Rock Цитата(zltigo @ May 21 2008, 23:27) ((voi... May 26 2008, 12:10      Сергей Борщ Цитата(Rock @ May 26 2008, 15:10) А вот ... May 26 2008, 12:15       Rock Цитата(Сергей Борщ @ May 26 2008, 16:15) ... May 26 2008, 12:21        aesok Цитата(Rock @ May 26 2008, 16:21) 1361: ... May 26 2008, 17:21         Rock Цитата(aesok @ May 26 2008, 21:21) Пожалу... May 26 2008, 17:49          aesok Цитата(Rock @ May 26 2008, 21:49) WinAVR-... May 26 2008, 18:01           Rock Цитата(aesok @ May 26 2008, 22:01) Извини... May 26 2008, 18:13            aesok Цитата(Rock @ May 26 2008, 22:13) Код8... May 26 2008, 18:51             Rock Цитата(aesok @ May 26 2008, 22:51) avr-gc... May 26 2008, 19:16              aesok Цитата(Rock @ May 26 2008, 23:16) уточнит... May 26 2008, 19:27               singlskv Цитата(aesok @ May 26 2008, 23:27) Потому... May 26 2008, 20:26                aesok Цитата(singlskv @ May 27 2008, 00:26) ну ... May 26 2008, 21:03                 singlskv Цитата(aesok @ May 27 2008, 01:03) Давайт... May 26 2008, 21:16                  defunct Цитата(singlskv @ May 27 2008, 00:16) а 1... May 26 2008, 21:36                   singlskv Цитата(defunct @ May 27 2008, 01:36) пино... May 26 2008, 21:51 nml Цитата(Karl @ Jul 26 2005, 13:52)Контроллер м... Jul 26 2005, 11:34 Karl Цитата(nml @ Jul 26 2005, 16:34)Цитата(Karl ... Jul 27 2005, 03:22 lolikandr В своё время удовлетворился таким решением - глоба... Jul 28 2005, 06:18 IgorKossak Цитата(lolikandr @ Jul 28 2005, 09:18)В своё ... Jul 29 2005, 07:04 lolikandr ЦитатаНаверное, под важными регистрами имелась в в... Jul 29 2005, 13:26 MrYuran Ещё один способ:
пишем ручками стартап со всеми не... May 21 2008, 14:04 kada Работающий пример на IARe:
Код// Программный сбро... May 21 2008, 16:39 Палыч А, не выдаёт ли транслятор какого-либо сообщения п... May 26 2008, 12:47 Rock Цитата(Палыч @ May 26 2008, 16:47) А, не ... May 26 2008, 12:51 VladimirYU Цитата(Палыч @ May 26 2008, 16:47) АА, не... May 26 2008, 12:52 Палыч Цитата(Rock @ May 26 2008, 15:51) нет... May 26 2008, 12:57 Rock Цитата(Палыч @ May 26 2008, 16:57) Странн... May 26 2008, 13:05 _Pasha Есть еще
Кодint main(void)
{
................ May 26 2008, 13:16 Rock Цитата(_Pasha @ May 26 2008, 17:16) Есть ... May 26 2008, 13:45 zltigo Цитата(_Pasha @ May 26 2008, 15:16) Есть ... May 26 2008, 13:58  Rock Цитата(zltigo @ May 26 2008, 17:58) Это н... May 26 2008, 14:02 Палыч Сейчас попробовал эту конструкцию в WinAVR - всё х... May 26 2008, 13:50 Rock Цитата(Палыч @ May 26 2008, 17:50) Сейчас... May 26 2008, 13:52  Палыч Цитата(Rock @ May 26 2008, 16:52) какую? ... May 26 2008, 14:19 zltigo Цитата(singlskv @ May 26 2008, 17:11) Дел... May 26 2008, 15:51  Палыч А, ведь точно - прав singlskv!
Цитата(defunct... May 26 2008, 16:14   defunct Цитата(Палыч @ May 26 2008, 19:14) Наверн... May 26 2008, 16:17 singlskv Да, ну и конечно стоит еще добавить вариант которы... May 26 2008, 16:00 _Pasha Цитата(zltigo @ May 26 2008, 17:58) Это н... May 26 2008, 17:02 zltigo Цитата(_Pasha @ May 26 2008, 19:02) Нет, ... May 26 2008, 17:20  _Pasha Цитата(zltigo @ May 26 2008, 21:20) Карти... May 26 2008, 17:49   zltigo Цитата(_Pasha @ May 26 2008, 19:49) Не ве... May 26 2008, 18:22    singlskv Цитата(zltigo @ May 26 2008, 22:22) Ну и ... May 26 2008, 18:36  singlskv Цитата(zltigo @ May 26 2008, 21:20) вещи ... May 26 2008, 18:06   aesok Цитата(singlskv @ May 26 2008, 22:06) А 2... May 26 2008, 18:11 singlskv Цитата(_Pasha @ May 26 2008, 21:02) 2sing... May 26 2008, 19:14 _Pasha Цитата(singlskv @ May 26 2008, 23:14) НО,... May 27 2008, 03:45 singlskv По мотивам этой темы озадачился вопросом кодогенер... May 27 2008, 18:57
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|