PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupts - von der Vektortabelle zur ISR Definition



uC
15.04.2006, 16:01
Guten Tag Leute!

Hab mich lange um die Interrupts gedrückt, aber irgendwie will ichs heut
wissen, und die Dinger nun endlich angehn.

Es würde mich freuen, wenn hier ein kleines aber feines Tutorial entsteht. Betonung liegt auf klein und fein. ;)

Zunaechst mal wo liegt ueberhaupt mein Problem/was ist mein Stand?:
Hab nun so weit im Atmega8 Datenblatt gewühlt und folgendes zusammengetragen:



//Wissenswertes zu Interrupts auf AVRs:
// Global Interrupt Enable I-Bit im GICR Register ist normalerweise LOW wenn Interupt ausgeführt wird
// Interrupts haben zwar eine Priorität, können sich aber normalerweise nicht gegenseitig unterbrechen
// Interrupt Schachtelung mittels manuellem I-Bit setzen möglich
// Information im Statusregister SREG geht bei Interruptausführung verloren wenn man nicht sorgetraegt
// Befehle: _SEI() = Set I Bit - Aktiviert Interruptfaehigkeit
// _CLI()= Clear I Bit - Schaltet Interruptfaehigkeit aus
// _SLEEP() = uC geht in den Sleep Modus und wartet auf naechsten Interrupt


Auch die Intterruptvektortabelle des Atmega 8 (auf Seite 44) ist mir ins Auge gestochen. Gut so weit. Was ich nun aber nicht gefunden habe, ist
wo /wie schreibe ich nun eine ISR für einen Interrupt???

Prinzipiell sollte es ja so gehen wie bei folgendem Programmbeispiel - einem RS232 Mirror:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#define SYSCLK 7372800
#define BAUD 38400UL
#define UBRR_BAUD ((SYSCLK/(16*BAUD))-1)

/* USART initialisieren */
void uart_init(void);


int main(void)
{
/* USART initialisieren */
uart_init();

sei();

/* Nichts tun. Die Interrupts erledigten den Rest */
while (1)
;
}

void uart_init(void)
{
/* Baudrate einstellen ( Normaler Modus ) */
UBRRH = (unsigned char) (UBRR_BAUD>>8);
UBRRL = (unsigned char) UBRR_BAUD;

/* Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts */
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);

/* Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit */
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

/* Interrupt wird ausgelöst sobald neue Daten im USART-Empfangspuffer liegen */
SIGNAL(SIG_UART_RECV)
{
unsigned char buffer;

/* Daten aus dem Puffer lesen ... */
buffer = UDR;

/* ... warten bis der Sendepuffer leer ist ... */
while ( !( UCSRA & (1<<UDRE)) )
;
/* ... und gleich wieder zurück schicken */
UDR = buffer;
}


Aber woher weiß ich bzw. der Verfasser dieses Codes das der Interrupt ausgerechnet SIG_UART_RECV heißt? Dazu habe ich weder im Datenblatt noch sonst wo was gefunden.

Wär super, wenn mir da jemand auf die Sprünge helfen könnte!

Vielen Dank schon mal im Voraus !

uC

izaseba
15.04.2006, 16:08
Hallo,
Bist Du auf die Idee gekommen mal io.h von Deinem µC zu lesen ?
Wenn nicht dann schau mal rein :-)

Gruß Sebastian

uC
15.04.2006, 16:46
/* Interrupt vectors */

#define SIG_INTERRUPT0 _VECTOR(1)
#define SIG_INTERRUPT1 _VECTOR(2)
#define SIG_OUTPUT_COMPARE2 _VECTOR(3)
#define SIG_OVERFLOW2 _VECTOR(4)
#define SIG_INPUT_CAPTURE1 _VECTOR(5)
#define SIG_OUTPUT_COMPARE1A _VECTOR(6)
#define SIG_OUTPUT_COMPARE1B _VECTOR(7)
#define SIG_OVERFLOW1 _VECTOR(8)
#define SIG_OVERFLOW0 _VECTOR(9)
#define SIG_SPI _VECTOR(10)
#define SIG_UART_RECV _VECTOR(11)
#define SIG_UART_DATA _VECTOR(12)
#define SIG_UART_TRANS _VECTOR(13)
#define SIG_ADC _VECTOR(14)
#define SIG_EEPROM_READY _VECTOR(15)
#define SIG_COMPARATOR _VECTOR(16)
#define SIG_2WIRE_SERIAL _VECTOR(17)
#define SIG_SPM_READY _VECTOR(18)

#define _VECTORS_SIZE 38


Waer der Abschnitt der iom8.h die in die io.h eingebunden im Falle eines Atmega8 eigebunden wird. Danke für den spartanischen aber brauchbaren Tipp.

Zum Gesamtverstaendnis und zur Eigenkontrolle: Es sind Hardwaremaessig Flags reserviert, welche ueber ein entsprechendes
Ereigniss informieren (z.B. Int0, Toggle an Pin PD2), sobald aktueller
Befehl abgearbeitet ist UND das IVCE-Bit im GICR Register ist Null sowie das Bit 7 (berühmtes I-Bit ) in SREG gesetzt ist.


Danke für die Hilfe! Den Blick in die io.h hät ich wirklich eher waagen sollen...

uC

uC
15.04.2006, 16:49
Noch ne Frage, beim durchblaettern, hab ich die Anweisung _SFR_IO8(0x3A)
gefunden. Ist das der Zauberbefehl, mit dem man Zeigerbiegen kann? Sprich
Einen Zeiger auf eine Speicherstelle definieren kann?
Danke wieder im Voraus

izaseba
15.04.2006, 17:10
Den Blick in die io.h hät ich wirklich eher waagen sollen...

Ja, das würde ich auch immer empfehlen, ist auch der einfachste Weg :cheesy:

Zu Deiner anderen Frage, es ist ziemlich einfach zu erklären, die Vektoren liegen alle ganz am Anfang von Flash, bei Adresse 0 reset, also die Stelle, wo der µC immer anfängt, Adresse 1 externer Interrupt INT0 usw. wie in der io8.h aufgelistet.

Wenn man das jetzt im Assembler schreibt sollte man die ganze Tabelle am Anfang ausschreiben z.B.
[code]
org 0x0000
rjmp reset
rjmp siginterrupt0
reti
reti
...
[code]

Wenn jetzt ein Ereignis eintrifft wird wie Du schon sagtest ein Flag gesetzt
hier z.B Register GIFR Bit INTF0.
Wenn jetzt Interrupts erlaubt sind (sei) und hier Register GICR bit INT0 wird zu Adresse 0x01 gesprungen, wo wiederum rjmp siginterrupt0
steht, womit Du dann irgendwo im label siginterrupt0 landest.
Andere Interrupts stoßen da direkt auf reti, kommen also sofort wieder zurück.
Die Vectortabelle ist stark µC abhängig!
also immer nachgucken wie sie heißen, der Kompiler prüft die Namen nicht
und wenn Du Dich vertippt hast klappt die ganze Sache nicht...

Ich hoffe das ist verständig genug, und alles so 100% richtig.

P.S. Welche avr-gcc Version hast Du eigentlich, ist aber nicht die neueste
man sollte nicht mehr mit SIG..... arbeiten, ich würde mal updaten sehe hier (http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html)

Gruß Sebastian

uC
15.04.2006, 17:27
Noch eine Frage: Welche Rolle spielen die Interrupt.h und die Signal.h

izaseba
15.04.2006, 18:48
signal.h gilt als veraltet (avr 3.4.4) und wird irgendwann aus avr-gcc raufliegen, man soll nur die interrupt.h benutzen.

Gruß Sebastian

uC
15.04.2006, 19:49
Hi, habe nun also ein wenig mit den Interrupts gespielt. Im Anhang ein nettes kleines Demoprogramm, dass beide externen Interrupts bedient.

Kurzbeschreibung: Wird am Int0 Pin eine steigende Flanke produziert,
so wird Zustand des PortsB um 1 erhöht.

Wird INT1 ausgeloest, wird PortB einfach 0x0a aufgeprägt.

Funktioniert so weit ganz gut, nur ein paar Schönheitsfehler die denke ich
charakteristisch für Interrupts sind würde ich gerne noch geklärt wissen:

Beim Erhöhen von PortB mußte ich intervenieren, da der nicht einfach
ueberlief und wieder bei Null haengen blieb, sondern immer die oberen
beiden Bits "haengen" bleiben.

Die Sache mit dem Schalterprellen konnte ich nicht einfach dadurch beseitigen, dass ich den Interrupt in der entsprechenden ISR ausgeschaltet
habe. Abhilfe?



// Demoprogramm zur Verwendung von Interrupts am Beispiel der externen Interruptquellen (Int1 Int0)
// Autor: Bachmayer
// Review Status: NONE
//Wissenswertes zu Interrupts auf AVRs:
// Global Interrupt Enable I-Bit im GICR Register ist normalerweise LOW wenn Interupt ausgeführt wird
// Interrupts haben zwar eine Priorität, können sich aber normalerweise nicht gegenseitig unterbrechen
// Interrupt Schachtelung mittels manuellem I-Bit setzen möglich
// Information im Statusregister SREG geht bei Interruptausführung verloren wenn man nicht sorgetraegt
// Befehle: _SEI() = Set I Bit - Aktiviert Interruptfaehigkeit
// _CLI()= Clear I Bit - Schaltet Interruptfaehigkeit aus
// _SLEEP() = uC geht in den Sleep Modus und wartet auf naechsten Interrupt
//
//
// Die Verfuegbaren Interrupt Signale entnommen aus der io.h wo diese den entsprechenden Interruptvektoren zugeordnet werden:
// #define SIG_INTERRUPT0 _VECTOR(1)
// #define SIG_INTERRUPT1 _VECTOR(2)
// #define SIG_OUTPUT_COMPARE2 _VECTOR(3)
// #define SIG_OVERFLOW2 _VECTOR(4)
// #define SIG_INPUT_CAPTURE1 _VECTOR(5)
// #define SIG_OUTPUT_COMPARE1A _VECTOR(6)
// #define SIG_OUTPUT_COMPARE1B _VECTOR(7)
// #define SIG_OVERFLOW1 _VECTOR(8)
// #define SIG_OVERFLOW0 _VECTOR(9)
// #define SIG_SPI _VECTOR(10)
// #define SIG_UART_RECV _VECTOR(11)
// #define SIG_UART_DATA _VECTOR(12)
// #define SIG_UART_TRANS _VECTOR(13)
// #define SIG_ADC _VECTOR(14)
// #define SIG_EEPROM_READY _VECTOR(15)
// #define SIG_COMPARATOR _VECTOR(16)
// #define SIG_2WIRE_SERIAL _VECTOR(17)
// #define SIG_SPM_READY _VECTOR(18)
//
//

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>

int8_t m;

void main(void)
{
DDRB=0xff;
DDRD=0x00; // Kompletter D Port wird hier als Input definiert. Beachte, auch als Output Interrupt möglich!
//Konfiguration eines externen Interrupts (Alternativfunktion int0 int1 Pins) im MCUCR Register:
// ISC11/ISC10 fuer INT1; ISC01/ISC00 fuer INT0;
//ISC11 ISC10 Description
//0 0 The low level of INT1 generates an interrupt request.
//0 1 Any logical change on INT1 generates an interrupt request.
//1 0 The falling edge of INT1 generates an interrupt request.
//1 1 The rising edge of INT1 generates an interrupt request.
cli(); // i Bit in Statusregister gelöscht=> Interrupts deaktiviert
MCUCR=(1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(1<<ISC00); // Definition der Ereignisse fuer die entsprechenden Interrupts
GICR=(1<<INT1)|(1<<INT0); // Nun sind die Interrupts scharf
sei(); // i Bit in Statusregister gesetzt=> Interrupts koennen ab jetzt auftreten
for(;;)
{
}
}

SIGNAL(SIG_INTERRUPT0) // ISR fuer die erste Service Routine: Zaehlt einfach den PortB hoch
{
GICR=0x00; //A: Versuch Schalterprellen zu beseitigen, maessiger Erfolg ...
m=PINB;
if (m>0x2e) {m=0;}
PORTB=m+1;
_delay_ms(250); // warten... um garantiert nicht schneller zu sein wie Schalterprellen...
_delay_ms(250); //
GICR=(1<<INT1)|(1<<INT0); // A: Externe Interrupts wieder aktiviert
}

SIGNAL(SIG_INTERRUPT1) // ISR fuer zweiten externen Interrupt: Setzt einfach charakteristisches Muster...
{
PORTB=0x0a;
}


In jedem Falle vielen vielen herzlichen Dank an izaseba!

uC

uC
15.04.2006, 20:21
Ich bin ja ein verspieltes Kind, wenn ich schon dabei bin neue Sachen auszuprobieren, wollt ich den AVR mal in den Schlaf wiegen, aber das will nicht funzen. Kann mir jemand das oben gepostete Programm so ergänzen,
dass der AVR immer wieder aus dem Schlaf gerissen wird, ein paar Sekunden
wach bleibt (_delay_ms()... o.ä.) damit man das Ergebniss des Interrupts bewundern kann und dann wieder wegschläft...?

uC
16.04.2006, 02:26
Ok, nun eine neue Spielerei, ich wollte den 16Bit Timer als PWM Quelle
nutzen, und das PWM Verhältniss sinusförmig variieren.

Das ganze sollte nicht in ner Schleife passieren, sondern mittels eines
Interrupts, der auf das Output Compare Match reagiert, und den OCR1A Eintrag des Timers Sinusförmig mit der Zeit ändert.

Schön so weit, nur wenn ich sei(); mache, also die Interrupts aktiviere
ist plötzlich Tote Hose!!!! Vertraegt sich der PWM nicht mit Interrupts???

SprinterSB
16.04.2006, 20:44
Wahrscheinlich ist dir dein µC schlicht und einfach abgestürzt ;-)

Übrigens bringt es nichts, in einer INT0-ISR den INT0 zu deaktivieren, zu warten, und dann wieder zu aktivieren. Das zugehörige INT0-Flag wird dennoch gesetzt. Du kannst den INT0 einfach aktiv lassen, und am Ende der ISR das Flag löschen (durch Schreiben einer 1).

Übrigens wird dein Code besser lesbar, wenn du ihn einrückst...

Um den Wert aus einem Port zurücklesen (wie du es versuchst), liest man wieder PORTx und nicht PINx. PINx liest den Input, der dich aber gar nicht nicht interessiert in dem Beispiel...

Wenn du einen sin() durch varieren deiner Zeitbasis erhalten willst, dann müssen die Zeitstückchen nicht sinusförmig sein, sindern proportional zu C+1/sin'(x) sein, also i.w. cosec().


signal.h gilt als veraltet (avr 3.4.4) und wird irgendwann aus avr-gcc raufliegen, man soll nur die interrupt.h benutzen.
Momentan braucht man sie noch.
In avr/interrupt.h werden zB die Makros sei() und cli() definiert.
In avr/signal.h werden zB die Makros SIGNAL und INTERRUPT definiert.

izaseba
16.04.2006, 20:53
Hallo Sprinter,

hier ist der Inhalt meiner signal.h :


/* Copyright (c) 2002,2005 Marek Michalkiewicz
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.

* Neither the name of the copyright holders nor the names of
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE. */

/* $Id: signal.h,v 1.11 2005/11/04 22:55:15 joerg_wunsch Exp $ */

#ifndef _AVR_SIGNAL_H_
#define _AVR_SIGNAL_H_

#warning "This header file is obsolete. Use <avr/interrupt.h>."

#endif /* _AVR_SIGNAL_H_ */


Also hier nix Makros für sei und cli, die sind in die interrupt.h gewandert...
Die signal.h brauch ich auch nicht mehr einzubinden
Es kann ja auch sein, daß Winavr noch nicht so weit ist, ich arbeite ja mit Linix, wie oben schon geschrieben 3.4.4

Sollte das wirklich so sein, daß Winavr die noch braucht, halte ich lieber den Mund, bevor ich die Leute hier verunsichere 8-[
Gruß Sebastian

uC
16.04.2006, 20:57
Negativ, ich will nicht den Sinus durch variieren der Zeitbasis erhalten.
Ergebniss wäre wenn z.B. ein RC Glied angeschlossen wäre ein synthetischer
relativ sauberer Sinus (Sauberer als einfach nur ein ausschalten...)

Aber das sind plänkeleien wie die Sache ob ich über den verzögerten PIN oder über Port rücklese, was wichtig ist, Interrupt & Timers im PWM Betrieb sollte
eigentlich funzen??

izaseba
16.04.2006, 21:06
Interrupt & Timers im PWM Betrieb sollte
eigentlich funzen??

Und wer hat gesagt, daß es nicht funktioniert?

Was mir zu Sinusgenerierung einfällt hier (http://www.avr-asm-tutorial.net/avr_de/avr_dac.html) es ist zwar eine Assemblerbibel, aber vielleicht ganz brauchbar...

Gruß Sebastian

SprinterSB
16.04.2006, 21:07
@uC: Ja.

@izaseba: Und hier meine:

/* Copyright (c) 2002, Marek Michalkiewicz
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE. */

/* $Id: signal.h,v 1.6.2.1 2003/10/09 17:26:14 troth Exp $ */

#ifndef _AVR_SIGNAL_H_
#define _AVR_SIGNAL_H_

/** \name Macros for writing interrupt handler functions */

/*@{*/

/** \def SIGNAL(signame)
\ingroup avr_interrupts

\code#include <avr/signal.h>\endcode

Introduces an interrupt handler function that runs with global interrupts
initially disabled. */

#ifdef __cplusplus
#define SIGNAL(signame) \
extern "C" void signame(void); \
void signame (void) __attribute__ ((signal)); \
void signame (void)
#else
#define SIGNAL(signame) \
void signame (void) __attribute__ ((signal)); \
void signame (void)
#endif

/** \def INTERRUPT(signame)
\ingroup avr_interrupts

\code#include <avr/signal.h>\endcode

Introduces an interrupt handler function that runs with global interrupts
initially enabled. This allows interrupt handlers to be interrupted. */

#ifdef __cplusplus
#define INTERRUPT(signame) \
extern "C" void signame(void); \
void signame (void) __attribute__ ((interrupt)); \
void signame (void)
#else
#define INTERRUPT(signame) \
void signame (void) __attribute__ ((interrupt)); \
void signame (void)
#endif

/** \def EMPTY_INTERRUPT(signame)
\ingroup avr_interrupts

\code#include <avr/signal.h>\endcode

Defines an empty interrupt handler function. This will not generate
any prolog or epilog code and will only return from the ISR. Do not
define a function body as this will define it for you.
Example:
\code EMPTY_INTERRUPT(SIG_ADC);\endcode */

#ifdef __cplusplus
#define EMPTY_INTERRUPT(signame) \
extern "C" void signame(void); \
void signame (void) __attribute__ ((naked)); \
void signame (void) { __asm__ __volatile__ ("reti" ::); }
#else
#define EMPTY_INTERRUPT(signame) \
void signame (void) __attribute__ ((naked)); \
void signame (void) { __asm__ __volatile__ ("reti" ::); }
#endif



/*@}*/

#endif /* _AVR_SIGNAL_H_ */

izaseba
16.04.2006, 21:22
@Sprinter,
und jetzt ?
Deine ist über 2 Jahre älter als meine.
Ich hab nur das geschrieben, was in der signal.h drin steht, und die Warnung, die der Kompiler ausgibt, wenn man damit arbeitet, und das was man hier (http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html)
nachlesen kann.
Du hast in Deinem Wikiartikel (sei Dir dafür gedankt) geschrieben, man soll keine Warnungen ignorieren, Jörg Wünsch hat mal in einem anderem Forum geschrieben, man soll nicht mit jahrealten Versionen arbeiten, und hinterher meckern, wenn was nicht klappt.
Du weißt was Du tust, aber manche Leute nicht.

Gruß Sebastian

SprinterSB
16.04.2006, 21:40
Ja stimmt, es ist echt blöde, wenn sich dauernd unnötigerweise die API ändert. Das nervt!

Die Wikiartikel könnte man anpassen, zB mit #if versehen. Aber die Quellen werden dadurch schlechter lesbar -- vor allem für Neulinge.
In der 4-er Version hat sich noch mehr geändert...

Zu meiner Schande muss ich gestehen, daß ich recht träge bin, was Neuinstallationen von Software angeht. Meine Version von gcc geht fehlerfrei und macht exzellenten Code.

izaseba
16.04.2006, 21:58
Ja stimmt, es ist echt blöde, wenn sich dauernd unnötigerweise die API ändert. Das nervt!

Da hast Du vollkommen recht, andererseits sollen wir froh sein, daß es Leute gibt, die überhaupt daran arbeiten und sich gedanken machen, und das für Lau.

Für die Wiki würde vielleicht helfen wenn man dick, auf http://www.nongnu.org/avr-libc/user-manual/index.html hinweist, von wegen auf neue Versionen hinweisen usw.


In der 4-er Version hat sich noch mehr geändert...

Gott sei dank ist sie noch nicht stable, ich will nicht darüber nachdenken, wie lange mein Rechner braucht um alles umzukompilieren...


Zu meiner Schande muss ich gestehen, daß ich recht träge bin, was Neuinstallationen von Software angeht.

das hab ich schön als cronjob wöchentlich laufen...

schönen Abend noch, Sebastian

SprinterSB
22.04.2006, 19:33
Zu meiner Schande muss ich gestehen, daß ich recht träge bin, was Neuinstallationen von Software angeht.

das hab ich schön als cronjob wöchentlich laufen...

Und der cron ändert auch automatisch die Quellen auf die neuesten Standards? Wow! *verneig*

izaseba
22.04.2006, 19:52
Und der cron ändert auch automatisch die Quellen auf die neuesten Standards? Wow! *verneig*



ehhh, wo hast Du das her ?

Gruß Sebastian

SprinterSB
22.04.2006, 20:00
Also wenn ich jede Woche ne neue gcc-Version untergejubelt bekäme... oje.

Weisst du eigentlich, was sich in der avr-gcc 3.4.5 geändert hat? Ausser dem Rumrefummel an der API mit signal.h?

In der Maschinenbeschreibung hat sich wahrscheinlich nix grändert. Ausser nervige Warnings, wenn man einen Nicht-Starnderd-ISR-Namen verwendet (wie bekommt man die weg?)

Ich würde gerne mal nen Scheduler oder so was proggen, aber ohne __builtin_return_address(0) ist da nix zu wollen... Und der Bug ist immer noch drin. Anstatt "leere" Änderungen zu machen, sollten die Jungs das mal fixen. Sind nur ein paar Zeilen...

izaseba
22.04.2006, 20:06
Hmmm,
mach mal einen Vorschlag auf sourceforge.net, vielleicht wird es berücksichtigt ???

Naja außerdem kommen die updates nicht jede Woche....

gruß Sebastian

pebisoft
23.04.2006, 09:29
SIG_INT.....

gibt es nach dem neuen standart nicht mehr.
dieses wort hat auch nie zu einem interrupt gepasst.

SprinterSB
23.04.2006, 10:03
Ja. Aller bleibt anders...


#define SIG_INTERRUPT0 _VECTOR(1)
#define SIG_INTERRUPT1 _VECTOR(2)

oberallgeier
16.12.2007, 16:46
Nachdem ja von den hiesigen Autoren wohl noch alle leben:

wieso heisst es in "AVR-gcc" von RNWissen
https://www.roboternetz.de/wissen/index.php/Avr-gcc#ISR_mit_eigenem_Prolog.2FEpilog

".. Dabei ist darauf zu achten, daß die ISR mit reti (return from interrupt) zurückkehrt und evtl. verwendete Register und den Status (SREG) sichert..."

Ich bastel grad an meiner ersten ISR in C herum - und beim compilieren bekomme ich für reti nur rote Karten (na ja, Punkte im build). "push sreg" oder so hab ich dann schon mal garnicht probiert :(

PicNick
16.12.2007, 17:01
Na, da wird eine Extrawurst beschrieben "naked"
Normalerweise macht der C ja die schamanistischen Rituale vor und nach einer Funktion (also auch ISR) voll elektrisch automatisch.
Also mit SREG und RETI etc. Geht dich sozusagen garnix an.

aaaaaaaber:
wenn du die "naked" attribute setzt, so wie im WIKI-Beispiel, wirst du zur Kasse gebeten und mußt das alles selbst machen.

aber eben nur dann

oberallgeier
16.12.2007, 17:29
Ach du heiliger Strohsack - aber danke, jetzt ist es mir klar. Es ist halt so schwer alles zu lesen und nix zu übersehen:
"Mit naked befreit man die Routine vom Standard-Prolog/Epilog."

Ich hatte es mittlerweile einfach "experimentell" programmiert, das reti auskommentiert und siehe da, die Roten Karten (Punkte) waren weg :).

Danke.

Auch meine Bandit (Suzuki) ist naked - da muss man aber genauso wenig "selber machen" wie bei den verkleideten Mopeds :)

PicNick
17.12.2007, 08:27
..meine Bandit (Suzuki) ist naked .

*seufz* ich hab vor Jahren aufgehört, Moped zu fahren. (honda, Shadow)