Bonjour.

C'est au sujet d'un code C/assembleur pour microcontroleur (AVR32).

Le code assembleur définit une sorte de vecteur d'exceptions avec une exigence d'alignement.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.section  .exception, "ax", @progbits
.balign 0x200
.global _evba
.type _evba, @function
_evba:
        .org  0x000
_handle_Unrecoverable_Exception:
        rjmp $
        .org  0x004
_handle_TLB_Multiple_Hit:
        rjmp $
.....
	.org  0x100
	// Supervisor Call.
_handle_Supervisor_Call:
	rjmp $
Les exceptions relatives à des intéruptions sont trouvées d'après la formule : (EVBA | event_handler_offset), event_handler_offset étant une valeur renseignée dans un registre du controleur d'intéruptions.

Je définis donc mon handler d'interruption de la manière suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
__attribute__ ((__interrupt__))
__attribute__ ((section (".exception")))
void _default_interrupt_handler(void)
{
  while(1) {}
}
Après le link, j'obtiens la disposition suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
.exception      0x0000000080004c00      0x208
 .exception     0x0000000080004c00      0x200 exception.o
                0x0000000080004c00                _evba
 .exception     0x0000000080004e00        0x8 main.o
                0x0000000080004e00                _default_interrupt_handler
Le linker m'a décalé la fonction à un multiple de l'alignement du vecteur d'exceptions.

Ma question est donc, comment "placer" les fonctions directement à la suite du vecteur d'exceptions, ou simplement définir sa taille ?

Merci pour votre aide.