|
|
  |
Си и переход по явному адресу, Нужна консультация |
|
|
|
Sep 21 2006, 15:05
|
Местный
  
Группа: Свой
Сообщений: 200
Регистрация: 10-04-06
Из: Украина,Запорожье
Пользователь №: 15 979

|
Цитата(srg_co @ Sep 21 2006, 18:48)  Среда: Codevision AVR 1.24.8b prof CPU: Mega8
Есть кусок кода в котором присутствует команда #asm("jump 0x0000"), е.е. в определенный момент необходимо перейти на стартовый адрес т.е. перезапустить контроллер. Эта конструкция успешно работала в версии Codevision 1.24.6 prof, настройки в проекте не менялись, причем компиляция проходит нормально, а при создании проекта вываливается ошибка: Error(s) occurred during assembly и указывает на JMP 0x0000 в ассемблерном файле.
Какие есть мысли по этому поводу ? Посмотрел только что Instruction Set Summary for ATMega8. Нет у нее комманды jamp. есть rjump и ijump, так что змени jump на rjamp.
|
|
|
|
|
Sep 21 2006, 17:25
|

учащийся
    
Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249

|
Вот пример из описания кодвизиона : Код #pragma warn- // this will prevent warnings int sum_abc(int a, int b, unsigned char c) { #asm ldd r30,y+3;R30=LSB a ldd r31,y+4;R31=MSB a ldd r26,y+1;R26=LSB b ldd r27,y+2;R27=MSB b add r30,r26;(R31,R30)=a+b adc r31,r27 ld r26,y;R26=c clr r27;promote unsigned char c to int
add r30,r26;(R31,R30)=(R31,R30)+c adc r31,r27 #endasm } #pragma warn+ // enable warnings для Вашего случая : Код #pragma warn- // чтоб компайлер не страдал) #asm jump 0х0000 #endasm #pragma warn+ ... извиняюсь - инструкция вроде бы должна "jmp" (см AVR Assembler guide на сайте). вот это нормально скомпилировалось (version 1.24.8d) Код void main(void) { #asm jmp 0x0000 #endasm for(;;) ; }
--------------------
Зачем лаять на караван , когда на него можно плюнуть?
|
|
|
|
|
Sep 22 2006, 06:33
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922

|
Перезапуск контролера предпочитаю делать по сбросу WDТ таймера (всегда его использую) в реальных проектах это наиболее надежный способ. В конце памяти обычно размещаю следующий код: ERROR_SYSTEM: ldi tmp,18 out WDTCR,tmp ldi tmp,8 out WDTCR,tmp ERROR_WAIT: nop jmp ERROR_WAIT
Все неиспользуемые прерывания имеют инструкцию: jmp ERROR_SYSTEM
Также если функция в программе возвращает несколько раз критическую ошибку или в основном цикле программы теоретически получаю не те данные, которые я ожидаю также использую переход на ERROR_SYSTEM Надежность программ с этим кодом и без него проверял, специально мучая плату, разница видна была очень наглядно. Дополнительно: при запуске программы проверяю по какому случаю произошел RESET ]
--------------------
Тяжелое детство - 8-битные игрушки на 8-дюемовых дискетах
|
|
|
|
|
Sep 22 2006, 08:39
|

Частый гость
 
Группа: Свой
Сообщений: 114
Регистрация: 31-08-05
Из: Украина, Одесса
Пользователь №: 8 105

|
Если надо перейти по определенному адресу, то можно на Си наптисать Код void (*voidFuncPtr)(void);
voidFuncPtr=(void(*)(void))0x0000; //адресс куда переходим voidFuncPtr(); Но если надо действительно перегрузить контроллер полностью, то действительно лучше использовать WDT. В этом случае инитятся все внутренние регистры. Просто написать: Код _CLI(); WDTCR=(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0); //WDT @ 1.9 for(;;);
|
|
|
|
|
Sep 22 2006, 08:50
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922

|
Цитата(shamray @ Sep 22 2006, 12:39)  Но если надо действительно перегрузить контроллер полностью, то действительно лучше использовать WDT. В этом случае инитятся все внутренние регистры. Просто написать: Код _CLI(); WDTCR=(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0); //WDT @ 1.9 for(;;); Из опыта добавлю, уже писал об этом выше. Этот код лучше распологать в самом конце программной памяти.
--------------------
Тяжелое детство - 8-битные игрушки на 8-дюемовых дискетах
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|