Serout aktiviert globalen interrupt in SREG

ich finde das nicht gut

Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Serout aktiviert globalen interrupt in SREG

 · 
Posted: 05.03.2015 - 11:40  ·  #1
Hallo,

ich habe festgestellt, das Serout den globalen Interrupt freigibt und dafür ein Beispiel (program seroutTST) angehängt (siehe code unten und Bild)

Ich finde das für den folgenden Fall störend. Wenn ich ganz sicher sein möchte, dass der drive-enable-pin meines RS485 Transceivers unmittelbar nach dem Senden der Daten wieder zurückgenommen wird, muss ich kurzeitig die Interrupts sperren und erst nach Aufruf von SetSerEnable wieder freigeben, oder? Der Serport arbeitet im Interrupt Modus.

Code

// Codefragment
DisableInts;
SetSerEnable(USARTC0,true);
SerOutC0($AB); // buffer füllen, aber noch nicht senden
SetSerEnable(USARTC0,false);
EnableIntsX; // erst nach Freigabe des Interrupts beginn UART das Senden


Da aber Serout den globalen Interrupt eigenwillig freigibt, ist dies nicht 100% sicher gestellt.
Andere Interrupts könnten die Ausführung von SetSerEnable(USARTC0,false) hinauszögern.

Für den XMEGA hätte ich einen Workaround:
Code

// Codefragment, ungetestet
DisableInts;
tmp := PMICCTRL; 
PMICCTRL := PMICCTRL and not $07; // sperrt Interrupts, clear HILVLEN, MEDLVLEN und LOLVLEN
SerOutC0($AA);
SREG := SREG or $80; 
PMICCTRL := PMICCTRL or ( tmp and $07); // HILVLEN, MEDLVLEN und LOLVLEN wieder hesrtellen


Gäbe es auch einen für ATMEGA?

Ich möchte wissen, ob das Aktivieren des globalen Interrupts durch Serout wirklich gewollt ist
und andere Leser darauf aufmerksam machen.


Code

program seroutTST;     //   f_cpu = 32 MHz

{$W+}

Device = xmega128A1U, VCC = 3.3;

Define_Fuses
    Override_Fuses;
    NoteBook   = A;
    COMport    = USB;
    FuseBits5  = [BODLEVEL1, BODLEVEL2, BODACT0]; // BOD=2.8V if USB variant
    ProgFuses = true;
    ProgEEprom = true;


Import SysTick, SerPortC0;

Define
    OSCtype        = extXTAL=8000000, PLLmul=4, prescA=1, prescB=1, prescC=1, faildet;

    SysTick        = 10;
    StackSize      = 256, iData;
    FrameSize      = 256, iData;

    SerPortC0      = 57600;
    RxBufferC0     = 128, iData;
    TxBufferC0     = 128, iData;
    SerCtrlC0      = onSerTxComplete_C0;
    //SerCtrlC0      = PORTC, 4, positive;

implementation
{$IDATA}

{-------------------------------------------------------------------------------
Main Program
-------------------------------------------------------------------------------}
var
  sregDavor, sregDanach : byte;
begin
  EnableInts($87);
  DisableInts;
  sregDavor := SREG;
  SeroutC0($45);
  sregDanach := SREG; // Serout hat globalen Interrupt eingeschaltet!
  debug_Break; //
  EnableIntsX; // kleiner Fehler in dere Doku auf Seite 171, da steht EnableInts(x)
  
end seroutTST.

Attachments
seroutTST
Filename: seroutTST.png
Filesize: 58.29 KB
Title: seroutTST
Download counter: 117
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Serout aktiviert globalen interrupt in SREG

 · 
Posted: 05.03.2015 - 17:42  ·  #2
Hallo Thomas,

der serielle Interrupt darf durch den User nicht gesperrt werden bzw. gesperrt bleiben.
Da gibt es zwei Interrupts.
Der erste leert den TxBuffer und füttert den UART.
Der zweite muss warten bis der Buffer ganz leer ist, dann wird die RS232 Leitung geschaltet.
Diese Automatik funktioniert und da sollte nicht eingegriffen werden!

rolf
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: Serout aktiviert globalen interrupt in SREG

 · 
Posted: 05.03.2015 - 21:03  ·  #3
Okay. Wie der Mechanismus mit den beiden Interrupts txcif und dreif funktioniert kann ich mir vorstellen. Mein Beispiel ist auch nicht so gut.

Man sollte sich aber bewusst sein, dass
die Programmsequenz
Disableints
serout
atomarer Zugriff auf eine globale Variable oder sonst was
Enableintsx

den atomaren Zugriff aushebelt, da serout den globalen interrupt freigibt.
Könnte zu einem nicht auffindbaren Software Fehler führen.

Gruß und vielen Dank @ Rolf für deine Antwort.
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Serout aktiviert globalen interrupt in SREG

 · 
Posted: 05.03.2015 - 22:57  ·  #4
Hallo Thomas,

atomarer Zugriff auf welche Variable?
Der SerOut Interrupt greift nur auf den TxBuffer zu und zwar auf das byte
worauf der TxOutPtr zeigt. Dieser Pointer selbst wird nur in diesem Interrupt
benutzt und bearbeitet.
Ich sehe da überhaupt keinerlei Konflikte !!!

rolf
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: Serout aktiviert globalen interrupt in SREG

 · 
Posted: 06.03.2015 - 08:47  ·  #5
es ist alles okay mit dem Serport Treiber. Ich habe nicht gesagt, dass es mit dem Treiber einen Konflikt gibt.

Ich wollte nur darauf hinweisen, dass Serout den globalen Interrupt freigibt.

Ich war davon überrascht. Wahrscheinlich habe ich SerStat, SerInp und SerOut in einem Topf geworfen, so dass ich einfach die falsche Annahme traf, dass der Serport-Treiber allgemein keine Interrupts einschaltet.

Sorry für die Belästigung.
Avra
Schreiberling
Avatar
Gender:
Location: Belgrade, Serbia
Age: 53
Homepage: rs.linkedin.com/in…
Posts: 653
Registered: 07 / 2002
Subject:

Re: Serout aktiviert globalen interrupt in SREG

 · 
Posted: 06.03.2015 - 08:58  ·  #6
Hello Thomas,

Please forgive me for pure online translations and if that has missrepresented the real meaning. I do not understand your language without translation.

Code
Disableints
serout 
atomic access to a global variable or something 
Enableints
Serout with disabled interrupt is a big no-no. Instead you should use something like this:
Code
serout 
Disableints
atomic access to a global variable or something
Enableints
or even better:
Code
var
  MyAtomicVar: integer, locked;
  ...
  serout 
  automatic atomic access to a global variable MyAtomicVar
  ...

Quote

the atomic access cancel out because SEROUT the global interrupt releases.
Could lead to a non-searchable software error.

Not if you do it as proposed. :-)
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: Serout aktiviert globalen interrupt in SREG

 · 
Posted: 06.03.2015 - 16:22  ·  #7
Hello Avra,

thank for your feedback,
Indeed, I prefer your kind of atomic Access.

But I do not aggree to your Statement
Quote
Serout with disabled interrupt is a big no-no.

because the Driver works correctly after enabling interrupts, I tested it.

Nevertheless, the code I have posted is definitely non sense.
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 16 · Cache Hits: 15   123   138 · Page-Gen-Time: 0.026104s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI