2015-09-26 3 views
2

, поэтому мне была назначена задача записи пользовательской функции reset() для компиляции AVR.Как написать пользовательскую функцию reset() в C для AVR-Studio?

Мне дана эта информация - «Atmega128 и Pic24e имеют прерывание сброса по адресу программы 0x0. Напишите функцию reset(), чтобы сбросить программу. Я также слышал простой способ заставить вашу систему перезагрузиться это, отправив его в бесконечный цикл

Позови меня с ума, но это так же просто, как написание:.

function reset(){ 
    goto 0x00000000; 
} 

не уверен, что если вы можете сделать это, и не ищет сложного объяснения, как я Я уверен, что это общий вопрос. Короткий и сладкий, если вы можете:

+0

Нет, это не так. Операция 'goto' используется для выполнения (или перехода к) помеченного раздела в вашем коде C. Но вам нужно прервать 0x0. Таким образом, вам может понадобиться встроенная сборка и прерывание с использованием сборки код –

ответ

5

goto 0x00000000 запускает программу, но все SFR не инициализируются, а прерывания не инициализируются. Ошибки могут возникать в зависимости от сложности вашего кода. Вы не должны использовать goto для сброса программного обеспечения, это плохо.

Вместо этого AVR Libc Reference Manual указывает использование сторожевого таймера для сброса программного обеспечения. Используя avr/wdt, вы можете легко включить сторожевой таймер.

#include <avr/wdt.h> 

#define soft_reset()  \ 
do       \ 
{       \ 
    wdt_enable(WDTO_15MS); \ 
    for(;;)     \ 
    {      \ 
    }      \ 
} while(0) 

от AVR LibC

ВНИМАНИЕ! У старых AVR отключен сторожевой таймер при сбросе. Для этих более старых AVR, делая мягкий сброс, позволяя сторожевому таймеру легко, поскольку сторожевой таймер будет отключен после сброса. На новых AVR, когда сторожевой таймер включен, он остается включенным даже после сброса! Для этих новых AVR функция должна быть добавлена ​​в секцию .init3 (т. Е. Во время кода запуска, до main()), чтобы отключить сторожевой таймер достаточно рано, чтобы он не постоянно перезагружал AVR.

Отключить сторожевой таймер во время запуска.

#include <avr/wdt.h> 

// Function Pototype 
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init3"))); 


// Function Implementation 
void wdt_init(void) 
{ 
    MCUSR = 0; 
    wdt_disable(); 

    return; 
} 

.init3 выполняется перед main функции, посмотрите на Memory Sections для более подробной информации.

Я дал эту информацию -. «Atmega128 и Pic24e имеют сброс прерывания по адресу программы 0x0

В большинстве случаев да, но если вы используете загрузчик, стартовый адрес может Задерживает .

+0

'goto 0x00000000' вообще не работал бы, чтобы перейти к определенному адресу, не так ли? –

+0

@ Rev1.0 add p указав адрес, и он будет работать правильно. 'goto * (0x00)' Он будет переходить к адресу 0 из ПЗУ в случае AVR. – Nasr

+0

@ Nasr ... однако он не сбросит AVR. Он перейдет к вектору сброса, но состояние MCU не будет сброшено. Это может привести к неисправности приложения, поскольку периферийные устройства не будут находиться в состоянии перезагрузки. – duskwuff

Смежные вопросы