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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Как программно сгенерить ресет?
Karl
сообщение Jul 26 2005, 10:52
Сообщение #1


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

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



Контроллер мега8535. Свободных выводов нет.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jul 26 2005, 11:27
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



1) можнро через вачдог если он есть

2) а можно так ( ( void ( void * ) ( void ) ) 0x0000 ) ( );

3) или на асме JMP 0x0000
Go to the top of the page
 
+Quote Post
nml
сообщение Jul 26 2005, 11:34
Сообщение #3


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

Группа: Свой
Сообщений: 86
Регистрация: 13-06-04
Из: Minsk
Пользователь №: 29



Цитата(Karl @ Jul 26 2005, 13:52)
Контроллер мега8535. Свободных выводов нет.
*


Наверное, разрешить WDT и зациклиться. По истечени определенного времени (по настройкам предделителя WDT) будет сброс.
Go to the top of the page
 
+Quote Post
Karl
сообщение Jul 27 2005, 03:22
Сообщение #4


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

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



Цитата(nml @ Jul 26 2005, 16:34)
Цитата(Karl @ Jul 26 2005, 13:52)
Контроллер мега8535. Свободных выводов нет.
*


Наверное, разрешить WDT и зациклиться. По истечени определенного времени (по настройкам предделителя WDT) будет сброс.
*



Тоже подумал, что это единственный выход для меня. Переход на начало программы - это не сброс. Не происходит установки в исходное состояние выводов и регистров.
Go to the top of the page
 
+Quote Post
lolikandr
сообщение Jul 28 2005, 06:18
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 56
Регистрация: 25-06-05
Пользователь №: 6 300



В своё время удовлетворился таким решением - глобальное запрещение прерываний, запрещение всех важных прерываний, сброс всех важных регистров, сброс стека + rjmp Reset.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 29 2005, 07:04
Сообщение #6


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(lolikandr @ Jul 28 2005, 09:18)
В своё время удовлетворился таким решением - глобальное запрещение прерываний, запрещение всех важных прерываний, сброс всех важных регистров, сброс стека + rjmp Reset.
*

Наверное, под важными регистрами имелась в виду ещё и начальная инициализация всей внутренней периферии.
Go to the top of the page
 
+Quote Post
lolikandr
сообщение Jul 29 2005, 13:26
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 56
Регистрация: 25-06-05
Пользователь №: 6 300



Цитата
Наверное, под важными регистрами имелась в виду ещё и начальная инициализация всей внутренней периферии.

Если необходимая инциализация есть после сброса, а у меня именно так, то перечисленных процедур достаточно.
Go to the top of the page
 
+Quote Post
Rock
сообщение May 21 2008, 13:52
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(MALLOY2 @ Jul 26 2005, 15:27) *
1) можнро через вачдог если он есть

2) а можно так ( ( void ( void * ) ( void ) ) 0x0000 ) ( );

3) или на асме JMP 0x0000



В WinAVR'е ( ( void ( void * ) ( void ) ) 0x0000 ) ( ); это не работет,
ещё бы хотелось узнать что эта запись означает.
А если в процессоре нет команды jmp, то кроме wdt можно сбросить процессор
запретив все прерывания очистить стек и следующую команду поставить ret.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 21 2008, 14:04
Сообщение #9


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Ещё один способ:
пишем ручками стартап со всеми необходимыми действиями, линкуем в программу, а для сброса делаем jump на свой стартап.
Не понял: а почему jump 0х0000 не подходит?
произойдёт переход по вектору сброса, то есть на тот же стартап.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 21 2008, 14:20
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Rock @ May 21 2008, 16:52) *
В WinAVR'е ( ( void ( void * ) ( void ) ) 0x0000 ) ( ); это не работет,
ещё бы хотелось узнать что эта запись означает.
Наверное, правильнее ( ( void ( * ) ( void ) ) 0x0000 ) ( ); Сие означает, что число ноль приводится к типу "указатель на функцию, котороя ничего не возвращает и без параметров"; производится вызов этой функции через указатель. Т.е. другими словами: вызываем подпрограмму, начинающуюся с адреса ноль.

Цитата(MrYuran @ May 21 2008, 17:04) *
Не понял: а почему jump 0х0000 не подходит?
произойдёт переход по вектору сброса, то есть на тот же стартап.
Переход на адрес ноль - не совсем сброс в том смысле, что перефирия не сбрасывается. Например, USART, который передавал байт в момент перехода на нулевой адрес не прекратит его передавать, а после его передачи начнет передавать следующий из UDR, если он был положен туда до перехода на 0...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 21 2008, 14:23
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Rock @ May 21 2008, 16:52) *
В WinAVR'е ( ( void ( void * ) ( void ) ) 0x0000 ) ( ); это не работет,
ещё бы хотелось узнать что эта запись означает.
Наверное MALLOY2 подразумевал ((void(*)()0x0000)(); - приведение константы 0х0000 к типу "указатель на функцию" и вызов функции по этому указателю. Поиск по форуму по "((void(*)()0x0000)()" вам даст несколько ссылок на обсуждения.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
kada
сообщение May 21 2008, 16:39
Сообщение #12


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

Группа: Свой
Сообщений: 106
Регистрация: 23-05-05
Из: Ташкент
Пользователь №: 5 324



Работающий пример на IARe:

Код
// Программный сброс
__disable_interrupt();
__watchdog_reset();
WDTCR |= (unsigned char)(1 << WDE);
while(1);
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 21 2008, 19:05
Сообщение #13


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Сергей Борщ @ May 21 2008, 17:23) *
Наверное MALLOY2 подразумевал ((void(*)()0x0000)();

Увы, опечатка, ибо при беглом взгляде видно, что скобки не парные. Наверное всё таки вот так:
Код
((void (*)())0x0000)();

Не знаю, будет ли работать в WinAVR, но в IAR точно работает.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 21 2008, 19:27
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(IgorKossak @ May 21 2008, 21:05) *
Не знаю, будет ли работать в WinAVR, но в IAR точно работает.

А чего не работать, если чистейший "C" smile.gif
Уже как-то поминал http://electronix.ru/forum/index.php?showtopic=35580
Цитата
1. 0 Берем, например, 0
2. ()0 Будем явно тип преобразовывать
3. (*)0 В указатель
4, ((*)())0 .................. на функцию
5. ((*)(void))0 ........................................без параметров
6. (void(*)(void))0 ничего не возвращающую
7. Ну и вызываем это ((void(*)(void))0)();
При необходимости добавляем параметры и возвращаемые значеня по месту..

Только это рестарт, а не ресет. Reset через Watchdog.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 12:10
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(zltigo @ May 21 2008, 23:27) *
((void(*)(void))0)();
А чего не работать, если чистейший "C" smile.gif
Уже как-то поминал http://electronix.ru/forum/index.php?showtopic=35580

Только это рестарт, а не ресет. Reset через Watchdog.

А вот и не работает в WinAvr'e, улетает не на нулевой адрес!!! laughing.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 26 2008, 12:15
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Rock @ May 26 2008, 15:10) *
А вот и не работает в WinAvr'e, улетает не на нулевой адрес!!! laughing.gif
Такие серьезные заявления обычно подтверждаются приведением исходника и отрывка листинга. У меня, например, работает.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 12:21
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(Сергей Борщ @ May 26 2008, 16:15) *
Такие серьезные заявления обычно подтверждаются приведением исходника и отрывка листинга. У меня, например, работает.

вот кусок из студии
дизассемблер:
@00000A2D: main
1350: {
+00000A2D: E5C6 LDI R28,0x56 Load immediate
+00000A2E: E0D4 LDI R29,0x04 Load immediate
+00000A2F: BFDE OUT 0x3E,R29 Out to I/O location
+00000A30: BFCD OUT 0x3D,R28 Out to I/O location
1356: if ((MCUCSR>>WDRF)&1) //Watchdog Reset Flag
+00000A31: B784 IN R24,0x34 In from I/O location
+00000A32: 9586 LSR R24 Logical shift right
+00000A33: 9586 LSR R24 Logical shift right
+00000A34: 9586 LSR R24 Logical shift right
+00000A35: FF80 SBRS R24,0 Skip if bit in register set
+00000A36: C005 RJMP PC+0x0006 Relative jump
1357: conditions.start =1;
+00000A37: 91800079 LDS R24,0x0079 Load direct from data space
+00000A39: 6082 ORI R24,0x02 Logical OR with immediate
+00000A3A: 93800079 STS 0x0079,R24 Store direct to data space
1358: MCUCSR =0;
+00000A3C: BE14 OUT 0x34,R1 Out to I/O location
1359: init_ctc();
+00000A3D: DBF7 RCALL PC-0x0408 Relative call subroutine
1361: initport();
+00000A3E: D60F RCALL PC+0x0610 Relative call subroutine
1362: ((void(*)(void))0)();
+00000A3F: D60E RCALL PC+0x060F Relative call subroutine
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 26 2008, 12:47
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



А, не выдаёт ли транслятор какого-либо сообщения при трансляции строки ((void(*)(void))0)() ?
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 12:51
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(Палыч @ May 26 2008, 16:47) *
А, не выдаёт ли транслятор какого-либо сообщения при трансляции строки ((void(*)(void))0)() ?

нет!всё ок!проглатывает....
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение May 26 2008, 12:52
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(Палыч @ May 26 2008, 16:47) *
АА, не выдаёт ли транслятор какого-либо сообщения при трансляции строки ((void(*)(void))0)() ?


В ИАР все прекрасно работает и в CVAVR тоже. Возможно в симуляторе надо поставить птицу старта симуляции и 0-го адреса, а не с main(). В C-SPY IAR такая опция есть. ИМХО обязано работать.
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 26 2008, 12:57
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Rock @ May 26 2008, 15:51) *
нет!всё ок!проглатывает....
Странно... Насколько я понимаю, вызывается та же процедура, что и в предыдущем вызове, т.е. вызывается initpotr()... Может у Вас отключены выводы предупреждающих сообщений?
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 13:05
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(Палыч @ May 26 2008, 16:57) *
Странно... Насколько я понимаю, вызывается та же процедура, что и в предыдущем вызове, т.е. вызывается initpotr()... Может у Вас отключены выводы предупреждающих сообщений?

да!именно так и происходит
предупреждения включены,забыл сказать у меня mega8
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 26 2008, 13:16
Сообщение #23


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Есть еще
Код
int main(void)
{
.....................
.....................
cli();
return(0);
}


smile.gif
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 13:45
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(_Pasha @ May 26 2008, 17:16) *
Есть еще
Код
int main(void)
{
.....................
.....................
cli();
return(0);
}


smile.gif

похоже что не работает ....
00000A54: CFFF RJMP PC-0x0000 Relative jump
зацикливатся на себя
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 26 2008, 13:50
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Сейчас попробовал эту конструкцию в WinAVR - всё хорошо транслирует и выполняет - переход куда и было сказано!
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 13:52
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(Палыч @ May 26 2008, 17:50) *
Сейчас попробовал эту конструкцию в WinAVR - всё хорошо транслирует и выполняет - переход куда и было сказано!

какую?
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 26 2008, 13:58
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(_Pasha @ May 26 2008, 15:16) *
Есть еще

Это называется возвратисть туда, незнаю куда, но может куда и попадешь.


Цитата(Rock @ May 26 2008, 14:21) *
вот кусок из студии
....
1362: ((void(*)(void))0)();
+00000A3F: D60E RCALL PC+0x060F Relative call subroutine

Кто-то кому-то голову пытается морочить. Вопрос зачем?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 14:02
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(zltigo @ May 26 2008, 17:58) *
Это называется возвратисть туда, незнаю куда, но может куда и попадешь.
Кто-то кому-то голову пытается морочить. Вопрос зачем?

всмысле???
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 26 2008, 14:19
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Rock @ May 26 2008, 16:52) *
какую?
Вот такую: ((void(*)(void))0)() ! Что-то Вы не так делаете....
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 26 2008, 15:11
Сообщение #30


дятел
*****

Группа: Свой
Сообщений: 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
zltigo
сообщение May 26 2008, 15:51
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ May 26 2008, 17:11) *
Дело в том что у WinAVR есть такая бага/фича (бага с точки зрения стандарта)
что переход по ((void(*)(void))0x0)(); может осуществляться НЕ на нулевой адрес.

Фичи в упор не вижу, а баг 100% - нет ни одной причины не сгенерить, как уже говорилось, ICALL.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 26 2008, 16:00
Сообщение #32


дятел
*****

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



Да, ну и конечно стоит еще добавить вариант который должен быть правильным для
всех аврок и не использует асм:
Код
volatile unsigned int vect = 0;

void softreset()
{
  ((void(*)(void))vect)();
}

int main(void)
{

  softreset();

  return 0;
}

Код
void softreset()
{
  ((void(*)(void))vect)();
  5c:    e0 91 60 00     lds    r30, 0x0060
  60:    f0 91 61 00     lds    r31, 0x0061
  64:    09 95           icall
  66:    08 95           ret

только при этом рамы 2 байта зазря расходуем

Цитата(zltigo @ May 26 2008, 19:51) *
Фичи в упор не вижу, а баг 100% - нет ни одной причины не сгенерить, как уже говорилось, ICALL.
Бага поведение которой 100% известно, это уже не бага а фича smile.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение May 26 2008, 16:03
Сообщение #33


кекс
******

Группа: Свой
Сообщений: 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
Палыч
сообщение May 26 2008, 16:14
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



А, ведь точно - прав singlskv!

Цитата(defunct @ May 26 2008, 19:03) *
А почему только до 8kb, а не до 128kb? Этот код на m128 точно будет работать. только если делать "asm" вставку, то что мешает написать
Код
asm( "jmp 0x0");
Наверное, отсутствие команды jmp в m8
Go to the top of the page
 
+Quote Post
defunct
сообщение May 26 2008, 16:17
Сообщение #35


кекс
******

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



Цитата(Палыч @ May 26 2008, 19:14) *
Наверное, отсутствие команды jmp в m8

не не, я там просто неправильно выразился,
быстро писал sad.gif

я насчет "asm" и "__asm__ __volatile__"
Пост уже подправил.
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 26 2008, 16:23
Сообщение #36


дятел
*****

Группа: Свой
Сообщений: 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
_Pasha
сообщение May 26 2008, 17:02
Сообщение #37


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(zltigo @ May 26 2008, 17:58) *
Это называется возвратисть туда, незнаю куда, но может куда и попадешь.

Нет, это к работающей собаке впридачу. Вот cli() только картину портит не-сишностью.

Цитата(singlskv @ May 26 2008, 19:11) *
Код
__asm__ __volatile__("ldi r30,0\n\t"\
                       "ldi r31,0\n\t"\
                       "ijmp");


Другой вариант, если целый стек smile.gif
Код
__asm__ __volatile__("clr r1\n\t"\
                  "push r1\n\t"\
                 "push r1\n\t"\
                  "ret");


2singlskv: А скажите пожалуйста, __bad_interrupt всегда был jmp 0 ?
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 26 2008, 17:20
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(_Pasha @ May 26 2008, 19:02) *
Нет, это к работающей собаке впридачу. Вот cli() только картину портит не-сишностью.

Картину "портит" возврат фиг знает куда, где и прерывания,между прочим могут снова разрешены, вещи типа __disable_interrupt() уже вполне "сишные" для ембедеров smile.gif.

Еще раз напоминаю, что переход по нулевому адресу не есть Reset - перефирия не в исходном состоянии. Особых альтернатив Watchdog-у в этом отношении нет, а тупое соединение ножки с ресетом (если без ресетчика), вообще делать нельзя ввиду непредсказуемой длительности импульса сброса.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aesok
сообщение May 26 2008, 17:21
Сообщение #39


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Rock @ May 26 2008, 16:21) *
1361: initport();
+00000A3E: D60F RCALL PC+0x0610 Relative call subroutine
1362: ((void(*)(void))0)();
+00000A3F: D60E RCALL PC+0x060F Relative call subroutine


Пожалуста укажите версию WinAVR и опции компилятора. У меня '((void(*)(void))0)();' всегда компилиться в
Код
    ldi r30,lo8(0)    ;  7    call_insn/4    [length = 3]
    ldi r31,hi8(0)
    icall


Анатолий.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 26 2008, 17:49
Сообщение #40


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(zltigo @ May 26 2008, 21:20) *
Картину "портит" возврат фиг знает куда, где и прерывания,между прочим могут снова разрешены,


Не верю smile.gif

WinAVR-20071221

Код
000002ac <.do_clear_bss_start>:
     2ac:    a9 30           cpi    r26, 0x09; 9
     2ae:    b1 07           cpc    r27, r17
     2b0:    e1 f7           brne    .-8      ; 0x2aa <.do_clear_bss_loop>
     2b2:    0e 94 9f 07     call    0xf3e; 0xf3e <main>
     2b6:    0c 94 28 23     jmp    0x4650; 0x4650 <_exit>

000002ba <__bad_interrupt>:
     2ba:    0c 94 00 00     jmp    0; 0x0 <__vectors>
................................................................................
.....
00004650 <_exit>:
    4650:    ff cf           rjmp    .-2      ; 0x4650 <_exit>




Цитата(aesok @ May 26 2008, 21:21) *
У меня '((void(*)(void))0)();' всегда компилиться


Попробовал - компилится без проблем.
Код
avr-gcc.exe  -mmcu=atmega640 -Wall -gdwarf-2 -std=gnu99           -DF_CPU=16000000UL -O2 -fsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT plc4_v02.o -MF dep/plc4_v02.o.d  -c  ../plc4_v02.c
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 17:49
Сообщение #41


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(aesok @ May 26 2008, 21:21) *
Пожалуста укажите версию WinAVR и опции компилятора. У меня '((void(*)(void))0)();' всегда компилиться в
Код
    ldi r30,lo8(0);  7    call_insn/4    [length = 3]
    ldi r31,hi8(0)
    icall


Анатолий.


WinAVR-20050214 и какие опции интересны?
Go to the top of the page
 
+Quote Post
aesok
сообщение May 26 2008, 18:01
Сообщение #42


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Rock @ May 26 2008, 21:49) *
WinAVR-20050214 и какие опции интересны?


Извините ни какие. Старенький он. Не буду смотреть.

Анатолий.
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 26 2008, 18:06
Сообщение #43


дятел
*****

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



Цитата(zltigo @ May 26 2008, 21:20) *
вещи типа __disable_interrupt() уже вполне "сишные" для ембедеров smile.gif.

Ну это не спортивный подход sad.gif smile.gif

Тогда можно просто написать:
Код
extern void __vectors();

int main(void)
{
  __vectors(); // call/rcall на адрес 0

  return 0;
}
Типа напоминаем компилятору что __vectors у него таки определен, но
к сожалению не вынесен в заголовочные файлы.
ну и получаем mega8:
Код
  __vectors(); // call/rcall на адрес 0
  64:    cd df           rcall    .-102    ; 0x0 <__vectors>

mega16:
Код
  __vectors(); // call/rcall на адрес 0
  96:    0e 94 00 00     call    0x0 <__vectors>

Цитата
Еще раз напоминаю, что переход по нулевому адресу не есть Reset - перефирия не в исходном состоянии. Особых альтернатив Watchdog-у в этом отношении нет,
Я уже приводил пример как оно у меня без проблем работает:
Код
//-------------------------------------------------------------------
// Перезагрузка (рестарт с адреса 0)
//-------------------------------------------------------------------

void Reset()
{
  __asm__ __volatile__ ("cli");  // запретить прерывания
               // останавливаем всю переферию
  SysTimerStop();
  AdcStop();
  SpiStop();
  PwmStop();
  PortsReset();
  I2cStop();
               // переходим на адрес 0
  __asm__ __volatile__("ldi r30,0\n\t"\
                       "ldi r31,0\n\t"\
                       "ijmp");
}



Цитата(aesok @ May 26 2008, 22:01) *
Старенький он. Не буду смотреть.
А 20060421 тоже старенький уже ? (вроде Gcc3.4.6 еще много где поддерживается)
Где смотреть правильный багтрекер на компилятор который в WinAVR ?
Go to the top of the page
 
+Quote Post
aesok
сообщение May 26 2008, 18:11
Сообщение #44


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(singlskv @ May 26 2008, 22:06) *
А 20060421 тоже старенький уже ? (вроде Gcc3.4.6 еще много где поддерживается)


Для меня да.

Цитата(singlskv @ May 26 2008, 22:06) *
Где смотреть правильный багтрекер на компилятор который в WinAVR ?


Здесь: http://www.nongnu.org/avr-libc/bugs.html
И в WinAVR проекте на sourceforge.net: http://sourceforge.net/tracker/?group_id=6...amp;atid=520074

Анатолий.
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 18:13
Сообщение #45


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(aesok @ May 26 2008, 22:01) *
Извините ни какие. Старенький он. Не буду смотреть.

Анатолий.

вот простая прога

#include <avr/io.h>
volatile unsigned char x, y, z;
int main(void)
{
x=1;
y=1;
z=x+y;
((void(*)(void))0)();
for(;;);
return(0);
}
вот что компельнул
............................
@0000002E: main
---- main.c ---------------------------------------------------------------------------------------
4: {
+0000002E: E5CF LDI R28,0x5F Load immediate
+0000002F: E0D4 LDI R29,0x04 Load immediate
+00000030: BFDE OUT 0x3E,R29 Out to I/O location
+00000031: BFCD OUT 0x3D,R28 Out to I/O location
5: x=1;
+00000032: E081 LDI R24,0x01 Load immediate
+00000033: 93800060 STS 0x0060,R24 Store direct to data space
6: y=1;
+00000035: 93800062 STS 0x0062,R24 Store direct to data space
7: z=x+y;
+00000037: 91800060 LDS R24,0x0060 Load direct from data space
+00000039: 91900062 LDS R25,0x0062 Load direct from data space
+0000003B: 0F89 ADD R24,R25 Add without carry
+0000003C: 93800061 STS 0x0061,R24 Store direct to data space
8: ((void(*)(void))0)();
+0000003E: DFEF RCALL PC-0x0010 Relative call subroutine
9: for(;;);
+0000003F: CFFF RJMP PC-0x0000 Relative jump
+00000040: FFFF ??? Data or unknown opcode
+00000041: FFFF ??? Data or unknown opcode
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 26 2008, 18:22
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(_Pasha @ May 26 2008, 19:49) *
Не верю smile.gif

Что верю-не верю? Зависит о того, как реализовали startup. Я никогда call main не делаю, бо совсем незачем. А оно это надо приключения на свою голову искать причем абсолютно без какой-бы то ни было надобности???

Цитата(singlskv @ May 26 2008, 20:06) *
// останавливаем всю переферию
SysTimerStop();
AdcStop();
SpiStop();
PwmStop();
PortsReset();
I2cStop();

Ну и зачем весь этот лишний код? Зачем помнить, что после модификации-добавления надо еще добавить stop()? Watcdog-и есть везде, зачастую есть возможность спровоцировать Watcdog досрочно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 26 2008, 18:36
Сообщение #47


дятел
*****

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



Цитата(zltigo @ May 26 2008, 22:22) *
Ну и зачем весь этот лишний код? Зачем помнить, что после модификации-добавления надо еще добавить stop()? Watcdog-и есть везде, зачастую есть возможность спровоцировать Watcdog досрочно.
Я же и не говорю что так нужно делать всегда, конечно вариант
с вотчдогом намного надежнее(думать меньше надо smile.gif ), ну а если еще и доступ к нему
через magic numbers то вобще очень не плохо, не нужно долго ждать, но иногда нужно
сделать рестарт очень быстро, и тогда выключение всей переферии за несколько мкс это выход.
Ну и тема вроде как называется "Как программно сгенерить ресет?", так что
обсуждаем все варианты...
Go to the top of the page
 
+Quote Post
aesok
сообщение May 26 2008, 18:51
Сообщение #48


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Rock @ May 26 2008, 22:13) *
Код
8:          ((void(*)(void))0)();
+0000003E:   DFEF        RCALL   PC-0x0010        Relative call subroutine
9:          for(;;);
+0000003F:   CFFF        RJMP    PC-0x0000        Relative jump
+00000040:   FFFF        ???                      Data or unknown opcode
+00000041:   FFFF        ???                      Data or unknown opcode


avr-gcc 4.4
Выдает правильный код проверял для 128 и 8 меги:
Код
((void(*)(void))0)();
  76:    e0 e0           ldi    r30, 0x00; 0
  78:    f0 e0           ldi    r31, 0x00; 0
  7a:    09 95           icall


Анатолий.

Сообщение отредактировал aesok - May 26 2008, 18:59
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 26 2008, 19:14
Сообщение #49


дятел
*****

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



Цитата(_Pasha @ May 26 2008, 21:02) *
2singlskv: А скажите пожалуйста, __bad_interrupt всегда был jmp 0 ?
Нет, __bad_interrupt заменяеться на
jmp 0 для "толстых" чипов и на
rjmp __vectors для "тонких",

НО, Вы можете переопределить обработчик для незадействованных прерывание(типа контроль),
например так:
Код
ISR(__vector_default)
{
  // вигхня какаята
}
Ну и джамп в __bad_interrupt будет на Ваш обработчик.

to aesok, а почему бы вам не прописать __vectors в хидерах ?
Правда наверное тогда завалят вопросами "а почему у меня не работает ...." smile.gif
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 19:16
Сообщение #50


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(aesok @ May 26 2008, 22:51) *
avr-gcc 4.4
Выдает правильный код проверял для 128 и 8 меги:
Код
((void(*)(void))0)();
  76:    e0 e0           ldi    r30, 0x00; 0
  78:    f0 e0           ldi    r31, 0x00; 0
  7a:    09 95           icall


Анатолий.

уточните какая эта версия 2007хххх пожалуйста, придётся обновить ....
Go to the top of the page
 
+Quote Post
aesok
сообщение May 26 2008, 19:27
Сообщение #51


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Rock @ May 26 2008, 23:16) *
уточните какая эта версия 2007хххх пожалуйста, придётся обновить ....

smile.gif я думаю что то типа 2009хххх надо будет у Эрика уточнить.

Последняя вышедшая версия WinAVR - 20080512 в ней avr-gcc 4.3. Я уверен что переход на нулевой адрес в ней работает. Если нет пишите.

Анатолий.

Цитата(singlskv @ May 26 2008, 23:14) *
to aesok, а почему бы вам не прописать __vectors в хидерах ?
Правда наверное тогда завалят вопросами "а почему у меня не работает ...." smile.gif


Потому что нет никаких причин переходить на 0 адрес. Переход на нелевой адрес это не ресет. (точка.)

avr-libc-user-manual FAQ #30 How do I perform a software reset of the AVR? http://www.nongnu.org/avr-libc/user-manual...l#faq_softreset

Анатолий.

Сообщение отредактировал aesok - May 26 2008, 19:35
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 26 2008, 20:26
Сообщение #52


дятел
*****

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



Цитата(aesok @ May 26 2008, 23:27) *
Потому что нет никаких причин переходить на 0 адрес. Переход на нелевой адрес это не ресет. (точка.)
ну давайте все-таки обойдемся без нравоучений, я сам в своем софте лучше знаю
когда нужно делать ресет через watchdog а когда рестарт через джамп на 0 адрес...
Особенно учитывая что в приведенном Вами линке:
Цитата
avr-libc-user-manual FAQ #30 How do I perform a software reset of the AVR? http://www.nongnu.org/avr-libc/user-manual...l#faq_softreset
Есть небольшое такое предупреждение smile.gif :
CAUTION! Older AVRs will have the watchdog timer disabled on a reset. For these older AVRs, doing a soft reset by enabling the watchdog is easy, as the watchdog will then be disabled after the reset. On newer AVRs, once the watchdog is enabled, then it stays enabled, even after a reset! For these newer AVRs a function needs to be added to the .init3 section (i.e. during the startup code, before main()) to disable the watchdog early enough so it does not continually reset the AVR.

А по поводу нужности, ну покажите что ли код с использованием watchdog который будет
начинать работу заново менее чем через 1мс ...

а то что есть по приведенной Вами ссылке, не более чем предупреждение для тех кто не
в состоянии провести правильно инициализацию/деинициализацию, ну и уж истиной
в последней инстанции это точно не являеться... (типа просто совета так не делать)
Go to the top of the page
 
+Quote Post
aesok
сообщение May 26 2008, 21:03
Сообщение #53


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(singlskv @ May 27 2008, 00:26) *
ну давайте все-таки обойдемся без нравоучений, я сам в своем софте лучше знаю
когда нужно делать ресет через watchdog а когда рестарт через джамп на 0 адрес...

Вы правы, переход на нулевой адрес являеться рестартом программы а не ресетом контроллера. Ресет и рестарт разные вещи и не нужно их путать (я не про Вас). Просто выполнять ресет более надежно.

Цитата
А по поводу нужности, ну покажите что ли код с использованием watchdog который будет
начинать работу заново менее чем через 1мс ...


Ну не все вещи в этой жизни можно решить нажимая на кнопочки, в смысле програмно. Програмно AVR-ку можно сбросит за 16мс. Надо быстрее ставте аппаратный формирователь сброса и дергайте его пином. C'EST LA VIE.

Цитата
а то что есть по приведенной Вами ссылке, не более чем предупреждение для тех кто не
в состоянии провести правильно инициализацию/деинициализацию, ну и уж истиной
в последней инстанции это точно не являеться... (типа просто совета так не делать)


А зачем полагаться на программиста который может ошибиться, может проще подождать 16 мс и быть уверенным что работа программы всегда будет начинаться на контроллере который находиться в предсказуемом состоянии? Я выбираю надежность перед крутизной.

Давайте будем считать, что отсутсвие пределения "__vectors" в avr-libc и являеться советом.

Анатолий.

Сообщение отредактировал aesok - May 26 2008, 21:07
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 26 2008, 21:16
Сообщение #54


дятел
*****

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



Цитата(aesok @ May 27 2008, 01:03) *
Давайте будем считать, что отсутсвие пределения "__vectors" в avr-libc и являеться советом.
договорились beer.gif
Просто реально бывают ситуации когда нужно "начать все с начала", при этом програмный
контроль всего и вся займет кода(и времени) значительно больше чем просто вариант
"все остановили, все перезапустили", а 16мс это иногда так много...
Go to the top of the page
 
+Quote Post
defunct
сообщение May 26 2008, 21:36
Сообщение #55


кекс
******

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



Цитата(singlskv @ May 27 2008, 00:16) *
а 16мс это иногда так много...

пином Reset дергайте smile.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 26 2008, 21:51
Сообщение #56


дятел
*****

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



Цитата(defunct @ May 27 2008, 01:36) *
пином Reset дергайте smile.gif
реально быстро стартануть после настоящего ресета можно только
или на внутреннем RC или на керамике, ну нету у авр варианта переключения
источника тактирования.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 27 2008, 03:45
Сообщение #57


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(singlskv @ May 26 2008, 23:14) *
НО, Вы можете переопределить обработчик для незадействованных прерывание(типа контроль),


Нет, я имел ввиду по умолчанию.


Цитата(defunct @ May 27 2008, 01:36) *
пином Reset дергайте smile.gif


Тогда надо помнить о таких багах:

Цитата
2. Part may hang in reset
Some parts may get stuck in a reset state when a reset signal is applied when the internal
reset state-machine is in a specific state. The internal reset state-machine is in this state for
approximately 10 ns immediately before the part wakes up after a reset, and in a 10 ns window
when altering the system clock prescaler...... There are theoretical possibilities of this happening also
in run-mode. The following three cases can trigger the device to get stuck in a reset-state:
- Two succeeding resets are applied where the second reset occurs in the 10ns window
before the device is out of the reset-state caused by the first reset.
- A reset is applied in a 10 ns window while the system clock prescaler value is updated by
software.
..............


Возможные последствия усложнения схемы ресета: девайс отъезжает при наносекундных помехах.
bb-offtopic.gif
Лично меня (в моих приложениях) даже подтягивающий резистор на ресете >1кОм уже в ступор вводит. 300 Ом - не больше - ставлю, когда ISP не надо.
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 27 2008, 18:57
Сообщение #58


дятел
*****

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



По мотивам этой темы озадачился вопросом кодогенерации в Gcc.
Ну вобщем все правильно, вышеприведенная ошибка(с неправильным джампом) есть только
в более менее давних версиях Gcc.
Сравнивалась кодогенерация в версиях gcc_3.4.6 и gcc_4.1.2 :
gcc_3.4.6:
Код
;; Unconditional and other jump instructions.
.......................
(define_insn "call_insn"
.......................
  return AS1(%~call,%c0);
}"
.......................
(define_insn "call_value_insn"
.......................
  return AS1(%~call,%c1);
}"

gcc_4.1.2:
Код
;; Unconditional and other jump instructions.
.......................
(define_insn "call_insn"
.......................
  else if (which_alternative==2)
    return AS1(%~call,%c0);
  return (AS2 (ldi,r30,lo8(%0)) CR_TAB
          AS2 (ldi,r31,hi8(%0)) CR_TAB
          \"icall\");
}"
.......................
(define_insn "call_value_insn"
.......................
  else if (which_alternative==2)
    return AS1(%~call,%c1);
  return (AS2 (ldi, r30, lo8(%1)) CR_TAB
          AS2 (ldi, r31, hi8(%1)) CR_TAB
          \"icall\");
}"

то есть как видно из рисунка, при переходе от 3.4.6 к 4.1.2 эта ошибка была подправленна,
как это точно соотноситься с версиями WinAvr точно не знаю, но думаю что все что было
начиная с 200705xx уже правильное.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:07
Рейтинг@Mail.ru


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