реклама на сайте
подробности

 
 
> Как программно сгенерить ресет?
Karl
сообщение Jul 26 2005, 10:52
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Контроллер мега8535. Свободных выводов нет.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
singlskv
сообщение May 26 2008, 15:11
Сообщение #2


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Щаз я Вам все объясню smile.gif

Дело в том что у 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>
ОБА-НА, прыжок то на адрес начала функции(интересно что будет
когда стек налезет на на регистры smile.gif )

Почему разработчики WinAVR не сделали вполне валидный в этом случае icall для меня
загадка, наверное регистры r31:r30 решили сэкономить smile.gif

итого для чипов с <=8Kb лучше так:
Код
__asm__ __volatile__("ldi r30,0\n\t"\
                       "ldi r31,0\n\t"\
                       "ijmp");
Go to the top of the page
 
+Quote Post
defunct
сообщение May 26 2008, 16:03
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 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 (по крайней мере теми, которые я пробовал).
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 26 2008, 16:23
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 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 пишут...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st August 2025 - 22:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01478 секунд с 7
ELECTRONIX ©2004-2016