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

 
 
 
Reply to this topicStart new topic
> Си и переход по явному адресу, Нужна консультация
srg_co
сообщение Sep 21 2006, 14:48
Сообщение #1


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

Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600



Среда: Codevision AVR 1.24.8b prof
CPU: Mega8

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

Какие есть мысли по этому поводу ?
Go to the top of the page
 
+Quote Post
viael
сообщение Sep 21 2006, 15:05
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
_artem_
сообщение Sep 21 2006, 17:25
Сообщение #3


учащийся
*****

Группа: Свой
Сообщений: 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(;;)
      ;
}


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
vet
сообщение Sep 22 2006, 05:28
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Не может это скомпилироваться. Потому что команды jmp у меги8 нет, как было верно замечено.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Sep 22 2006, 06:30
Сообщение #5


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Попробуйте так написать, с учетом оформления ассемблерных команд для вашего компилятора. Я компилировал для GCC AVR, ATMega16, все работает без проблем.
Код
  asm("lds r30,0");
  asm("lds r31,0");
  asm("icall");


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Семён
сообщение Sep 22 2006, 06:33
Сообщение #6


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

Группа: Свой
Сообщений: 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-дюемовых дискетах
Go to the top of the page
 
+Quote Post
shamray
сообщение Sep 22 2006, 08:39
Сообщение #7


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

Группа: Свой
Сообщений: 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(;;);
Go to the top of the page
 
+Quote Post
Семён
сообщение Sep 22 2006, 08:50
Сообщение #8


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

Группа: Свой
Сообщений: 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-дюемовых дискетах
Go to the top of the page
 
+Quote Post
_artem_
сообщение Sep 22 2006, 09:12
Сообщение #9


учащийся
*****

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



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



Извиняюсь за ошибку , я другой проц ставил, просмотрел что требуется мега 8. Действительно там rjmp и ijmp только есть.


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
srg_co
сообщение Sep 22 2006, 09:45
Сообщение #10


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

Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600



Понял, буду пробовать, всем спасибо !
Go to the top of the page
 
+Quote Post

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

 


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


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