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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Brille5000 (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.