mikrocontroller.net

Forum: Compiler & IDEs Cortex M3 nested IRQs?


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 Olaf (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo da draussen,

Ich brauch mal etwas Erleuchtung.

Prozessor: EFM32GG230 = Cortex-M3
Compiler:  gcc

Ich habe einen Systick IRQ mit 1ms laufen. Der macht nichts besonderes 
ausser eine Variable fuer eine delay Funktion runter zu zaehlen. 
Funktioniert bestens.


Ich habe eine Funktion fuer I2C-Bus uebertragung unter Verwendung von 
I2C0_IRQn.
Funktioniert auch bestens. Ich kann damit z.B problemlos ein uebliches 
SSD1306 Oled ansprechen.

Sobald ich eine der I2C-Bus Funktionen innerhalb des Systicks aufrufe 
steht mein System. Der Versuch auch nur ein Byte zu senden haelt alles 
an. Es sieht so aus als wenn der I2C0_IRQn innerhald des Systick alles 
anhaelt.

Probiert habe ich schon die IRQ-Prioritaeten festzulegen. (Systick auf 
niedrige Prioritaet, i2c0 auf hoch) Hat aber nichts geaendert.

Hab ich was uebersehen?


Olaf

von Bauform B. (bauformb)


Bewertung
0 lesenswert
nicht lesenswert
Olaf schrieb:
> Ich habe einen Systick IRQ mit 1ms laufen.

In 1ms kannst du max. 10 Byte per I2C senden (bei 100kHz).

> Sobald ich eine der I2C-Bus Funktionen innerhalb des Systicks aufrufe
> steht mein System.

Das ganze System oder wartet nur die I2C-Funktion auf den Interrupt? 
Oder gibt es einen Fault?

> Probiert habe ich schon die IRQ-Prioritaeten festzulegen. (Systick auf
> niedrige Prioritaet, i2c0 auf hoch) Hat aber nichts geaendert.

Das muss auch sein. Der I2C-Interrupt müsste eine höhere Priorität haben 
als der systick, gleiche Priorität reicht nicht. Also muss im 
NVIC->IP[I2C_IRQn] eine kleinere Zahl stehen als im SCB für den systick. 
Die nächste Schikane: nur die höchsten Bits dieser Register sind 
implementiert, typisch 3 oder 4. Die Priorität muss also entsprechend 
verschoben werden.

von Olaf (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> In 1ms kannst du max. 10 Byte per I2C senden (bei 100kHz).

Das ist nicht das  Problem. Einen Tickern von 1ms heisst ja nicht das 
ich darin nicht noch langsamere Prozesse laufen lassen kann.

Das Problem war eher das ich nicht alles mit dieser Gruppenbildung 
verstanden hatte. Genauer gesagt frage ich mich jetzt noch was der kack 
ueberhaubt soll.

Aber jetzt laeuft alles so wie ich mir das vorstelle.

Olaf

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.

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