PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : atmega168 / Interrupt-Vektoren eigenen Irq-Handler



makro
09.06.2017, 10:23
Hallo,

wie kann man seinen eigenen Interrupt-Handler an die entsprechende Interrupt-Adresse bringen, in assembler anstatt mit ISR- define (in C)?

in meine Assembler Datei hab ich geschrieben:

#include <avr/io.h>

.text
.section .vectors

.extern IrqCounter_gu8

.org 0x00B
rjmp _my_tim_handler

...
_my_tim_handler:
...
reti

//******************

C-Datei:

int main(void) {
....

return 0;
}

Leider funktioniert das nicht, da mein Code ab Adresse 0x01A beginnt, und nicht bei 0x000B. Wie kann man seinen Code sozusagen dort hinschieben? Oder geht das bei den atmega nicht?

Disassembly:
00000000 RJMP PC+0x001A Relative jump
00000001 RJMP PC+0x0034 Relative jump
00000002 RJMP PC+0x0033 Relative jump
00000003 RJMP PC+0x0032 Relative jump
00000004 RJMP PC+0x0031 Relative jump
00000005 RJMP PC+0x0030 Relative jump
00000006 RJMP PC+0x002F Relative jump
00000007 RJMP PC+0x002E Relative jump
00000008 RJMP PC+0x002D Relative jump
00000009 RJMP PC+0x002C Relative jump
0000000A RJMP PC+0x002B Relative jump
0000000B RJMP PC+0x002B Relative jump
0000000C RJMP PC+0x0029 Relative jump

Ich programmiere mit AtmelStudio 6.2 und es ist ein C-Projekt.
Es ist kein konkretes Projekt, es geht mir ums lernen und wie man was machen kann..

Kann diesbezüglich jemand weiterhelfen?

Grüße

Ceos
09.06.2017, 10:47
# define ISR(vector, [attributes])
#else /* real code */

#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
# define __INTR_ATTRS used, externally_visible
#else /* GCC < 4.1 */
# define __INTR_ATTRS used
#endif

#ifdef __cplusplus
# define ISR(vector, ...) \
extern "C" void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
void vector (void)
#else
# define ISR(vector, ...) \
void vector (void) __attribute__ ((signal,used)) __VA_ARGS__; \
void vector (void)
#endif

kurz gesagt
void VEKTORNAME(void) __attribute__ ((signal,used));
mit dem Signal Attribut sagst du dem compiler dass es eine ISR ist und er entsprechend die sprünge planen soll bzw. dass er das stack-handling um ein paar register erweitern muss
wenn du möchtest dass er die register nicht anfasst, weil du z.B. selber in assembler oder ähnlich sicherstellst NICHT die register zu benutzen, kannst du noch ein ,naked hinter ,used setzen, dann ist dir das stack sichern überlassen

PS mit
asm("nop;") kannst du deinen assembler code inline schreiben falls nicht bekannt :)