Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Си и переход по явному адресу
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
srg_co
Среда: Codevision AVR 1.24.8b prof
CPU: Mega8

Есть кусок кода в котором присутствует команда #asm("jump 0x0000"), е.е. в определенный момент необходимо перейти на стартовый адрес т.е. перезапустить контроллер. Эта конструкция успешно работала в версии Codevision 1.24.6 prof, настройки в проекте не менялись, причем компиляция проходит нормально, а при создании проекта вываливается ошибка: Error(s) occurred during assembly и указывает на JMP 0x0000 в ассемблерном файле.

Какие есть мысли по этому поводу ?
viael
Цитата(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.
_artem_
Вот пример из описания кодвизиона :

Код
#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(;;)
      ;
}
vet
Не может это скомпилироваться. Потому что команды jmp у меги8 нет, как было верно замечено.
haker_fox
Попробуйте так написать, с учетом оформления ассемблерных команд для вашего компилятора. Я компилировал для GCC AVR, ATMega16, все работает без проблем.
Код
  asm("lds r30,0");
  asm("lds r31,0");
  asm("icall");
Семён
Перезапуск контролера предпочитаю делать по сбросу 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
]
shamray
Если надо перейти по определенному адресу, то можно на Си наптисать

Код
void (*voidFuncPtr)(void);

voidFuncPtr=(void(*)(void))0x0000;   //адресс куда переходим
voidFuncPtr();


Но если надо действительно перегрузить контроллер полностью, то действительно лучше использовать WDT. В этом случае инитятся все внутренние регистры.

Просто написать:

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

Просто написать:

Код
_CLI();
WDTCR=(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0);    //WDT @ 1.9
for(;;);

Из опыта добавлю, уже писал об этом выше. Этот код лучше распологать в самом конце программной памяти.
_artem_
Цитата(vet @ Sep 22 2006, 08:28) *
Не может это скомпилироваться. Потому что команды jmp у меги8 нет, как было верно замечено.



Извиняюсь за ошибку , я другой проц ставил, просмотрел что требуется мега 8. Действительно там rjmp и ijmp только есть.
srg_co
Понял, буду пробовать, всем спасибо !
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.