2015-12-05 2 views
3

J'ai un ATMega328p en cours d'exécution AmForth 6.1.AmForth a besoin d'un re-flash après -13 exception (mot indéfini)

Lors d'un débogage interactif, j'ai accidentellement appelé un mot indéfini, entraînant l'émission d'une exception -13 par AmForth (undefined word).

Une fois l'exception levée, AmForth agit de manière étrange. Les appels à des mots prédéfinis tels que words échouent ou des opérations simples telles que 1 1 + échouent.

La seule solution que j'ai trouvée est donc de re-flasher la puce, ce qui est évidemment loin d'être idéal.

Est-ce que je ne gère pas correctement les erreurs? Venant d'un contexte GForth, je suis habitué à continuer l'opération sur les exceptions. Il semble qu'AmForth ne fonctionne pas de cette façon.

Comment obtenir un comportement correct d'AmForth après avoir appelé un mot indéfini?

+1

Est-il possible de 'CATCH' l'exception? –

+2

Il semblerait que 'QUIT' d'AmForth devrait attraper l'exception: https://github.com/bewest/amforth/blob/master/core/words/quit.asm, donc je suppose que cela ne devrait pas aider. –

+0

Pourriez-vous montrer un exemple de QUIT ou CATCH? J'ai essayé QUIT, mais il est possible que ma syntaxe était éteinte. – Rick

Répondre

1

Voici un exemple d'utilisation CATCH et THROW:

\ Throw an exception. 
: check 42 throw ; 

\ Call check, and catch any exception. 
' check catch . 
\ Should print 42. 

je l'ai mentionné QUIT parce qu'il est le défaut interpréteur Forth, et dans le AmForth source code, on dirait qu'il devrait prendre des exceptions. Peut-être que vous utilisez une autre version d'AmForth, ou que vous n'interagissez pas avec l'interpréteur de texte standard.

QUIT vient d'entrer dans l'interpréteur de texte Forth. Cela peut sembler un nom particulier, mais cela a du sens si vous l'appelez à partir d'un mot. Peu importe la profondeur de la pile de retour, QUIT la vide et passe en mode interactif. Il conserve la pile de données, cependant.

: foo 1 2 3 quit ; 
: bar foo ; 
bar .s \ Should print 1 2 3.