Forum: Mikrocontroller und Digitale Elektronik Vector Table Offset setzen: Nur multiple of 0x200 ?


von Brille5000 (Gast)


Lesenswert?

Hallo,

ich habe ein kleines Projekt (STMF103CB..) mit ST HAL Treibern via 
STM32CubeMX erstellt. Wenn ich den Vector Table Offset setzen möchte, 
finde ich dazu in der Datei system_stm32f1xx.c:

#define VECT_TAB_OFFSET  0x4100 /*!< Vector Table base offset field.
                                  This value must be a multiple of 
0x200. */

Warum sind hier nur multiple of 0x200 vorgesehen? Ich habe den Grund 
noch nicht gefunden. Es scheint auch mit multiple of 0x100 zu gehen. 
Zumindest habe ich noch keine Einschränkung festgestellt. So habe ich es 
bisher in der ARM Doku gefunden. :-\

Kann mir bitte jemand den richtigen Hinweis geben?

Danke im Voraus!

von Darth Moan (Gast)


Lesenswert?

Aus dem STM32F10xxx/20xxx/21xxx/L1xxxx Cortex-M3 programming manual:
4.4.4 Vector table offset register (SCB_VTOR)

Bits 8:0 Reserved, must be kept cleared

von Jim M. (turboj)


Lesenswert?

Ist das nicht ein Cortex-M3?

In dessen ARM Architekture Reference Manual geht VTOR bis Bit 7, d.h. es 
wäre  ein Alignment auf 128 Byte nötig.

Es könnte sein das ST da aus dem falschen oder veraltetem Dokument 
abgeschrieben hat. Ähnlichees habe ich in NXP Doku gefunden.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Hehe, und ich hab gelesen, dass das auchnoch/zusätzlich von der Länge 
der IVT abhängig ist.
Um die Länge der IVT zur nächsten 2er Potenz muss aligned werden.

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Ciheijba.html

(Der Begleittext unter der Tabelle)

Bit 6..0 sind reserved, bei JEDEM M3.
Wenn eine Implementierung mehr Einträge hat als 128Byte (also 32 
Einträge), dann wird der Offset noch größer.

Son STM32 mit M3 Kern hat ja schonmal gut und gerne 100 IRQ Quellen und 
somit Einträge.

0x200 = 512/4 = 128 Einträge oder weniger

: Bearbeitet durch User
von Darth Moan (Gast)


Lesenswert?

Moin,

naja, aber ARM erstellt die IP, während ST das Silizium bäckt.
Wenn ST ein anderes VT Alignment braucht oder haben will, dann machen
sie das halt einfach.
Kann aber auch ein Fehler sein.
Aber darauf sollte man sich nicht verlassen.

Von Armv7-M Architecture:
The offset address is 32-word aligned. Where more than 16
external interrupts are used, the offset word alignment must be
increased to accommodate vectors for all the exceptions and
interrupts supported and keep the required table size naturally
aligned.

Die Vector Tabelle hat ja etwas mehr als nur 16 Einträge.

von Jim M. (turboj)


Lesenswert?

Jim M. schrieb:
> In dessen ARM Architekture Reference Manual geht VTOR bis Bit 7, d.h. es
> wäre  ein Alignment auf 128 Byte nötig.

Gnarf. Im Kapitel B1.5.3 "The vector table" steht das mit dem Alignment 
genauer drin, und für "lange" Vector Tabellen muss das die nächst 
größere 2-er Potenz sein - 128 Byte ist nur das Minimum.

Praktisch jeder Cortex-M3 hat mehr als 32 Interrupts (die Faults zählen 
hier mit), und viele mehr als 64. Daraus erklärt sich die Anforderung 
auf 0x200 Alignment.

Der STM32F103CB scheint aber nur 59 Interrupts zu haben, was ein 
Alignment auf 0x100 ermöglichen würde. Hier hat ST möglichwerweise bei 
der Doku von einem "dickeren" Cortex-M3 abgeschrieben.

von Darth Moan (Gast)


Lesenswert?

Moin,

Jim M. schrieb:

> ... (die Faults zählen hier mit)...

Im Refman sieht man, dass die ersten 13 Vectoren sind nicht numeriert
sind und somit Int Nr 59 bereits an Offset 0x0000_012C steht.
Also >0x100. Daraus folgt das Alignment von 0x200.

von Darth Moan (Gast)


Lesenswert?

Oha,
hab mich in der eile vertan, die ersten 16 Vectore sind nicht 
nummeriert.
Daher liegt Int Nr. 0 bei Offset 0x40. und Int Nr 59 eben bei 0x12C.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.