Vart i koden skriver jag fel?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Vart i koden skriver jag fel?

Inlägg av fosfor »

Här är hela koden:
Jag har lagt till att den piper också när stoppsensorn tar i:

Kod: Markera allt

//  ---- MOTOR CONST INTARNA  ----
const int controlPin1 = 7;
const int controlPin2 = 6;
const int enablePin = 9;


#include <Wire.h>
#include <LiquidCrystal_I2C.h>


// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
char lineText[]="  Tjena!  ";
int sensor01;
int sensor02;
int stepOld;
int step;
long PulseCount;


// ---- MOTOR TEST INT ---------------------------------------------------------------------------------
int intest1Pin = 4;        // KNAPP  -  GRÅ - Går åt plus hållet    - UPP
int intest2Pin = 5;        // KNAPP  -  GRÖN - Går åt minus hållet  - NER
int intest3Pin = 11;       // KNAPP  -  BLÅ - Ej något än
int stopsensor1Pin = 12;   // SENSOR -  GRÖN - Enskild sensor
int val = 0;


// ---- Högtalare
int tonePin = 13;



// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
// initialize the library with the numbers of the interface pins
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
#define SENSOR_A 3
#define SENSOR_B 2

// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
void checkState(){
  sensor01 = digitalRead(SENSOR_A);
  sensor02 = digitalRead(SENSOR_B);

  if(sensor01 == 1 && sensor02 == 1){
    step = 0;
    if(stepOld == 1){
      PulseCount--;
    }
    if(stepOld == 3){
      PulseCount++;
    }
    stepOld = 0;
  }

  if(sensor01 == 0 && sensor02 == 1){
    step = 1;
    if(stepOld == 2){
      PulseCount--;
    }
    if(stepOld == 0){
      PulseCount++;
    }
    stepOld = 1;
  }

  if(sensor01 == 0 && sensor02 == 0){
    step = 2;
    if(stepOld == 3){
      PulseCount--;
    }
    if(stepOld == 1){
      PulseCount++;
    }
    stepOld = 2;
  }

  if(sensor01 == 1 && sensor02 == 0){
    step = 3;
    if(stepOld == 0){
      PulseCount--;
    }
    if(stepOld == 2){
      PulseCount++;
    }
    stepOld = 3;
  }
}


// VOID SETUP - KÖRS BARA EN GÅNG I BÖRJAN, EN FÖRBEREDELSE, LOOP ÄR EXEKVERING OCH GÖR DET MESTA JOBBET
// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("                ");

  attachInterrupt(0, checkState, CHANGE);
  attachInterrupt(1, checkState, CHANGE);

  PulseCount = 0;





  // TEST MOTOR  - VOID SETUP ---------------------------------------------------------------------------------
  pinMode(intest1Pin, INPUT);         //Declarar denna som input  UNO input är 4    grå
  pinMode(intest2Pin, INPUT);         //Declarar denna som input  UNO input är 5    grön
  pinMode(intest3Pin, INPUT);         //Declarar denna som input  UNO input är 11   blå
  pinMode(stopsensor1Pin, INPUT);     //Declarar denna som input  UNO input är 12   grön

  //
  pinMode(tonePin, OUTPUT);
  

//  ---- HOY LCD start presentationen
{

lcd.setCursor(2, 0);
lcd.print("HOY!"); 
delay(500);
// lcd.clear();

lcd.setCursor(11, 1);
lcd.print("9");
delay(100);

lcd.setCursor(11, 1);
lcd.print("90");
delay(100);

lcd.setCursor(11, 1);
lcd.print("90E");
delay(900);
lcd.clear();

lcd.setCursor(2, 0);
lcd.print("Prototype 1.0");
delay(200);

lcd.setCursor(0, 1);
lcd.print("www.");
delay(100);

lcd.setCursor(12, 1);
lcd.print(".se");
delay(100);

lcd.setCursor(0, 1);
lcd.print("www.HOY.se");
delay(250);

lcd.setCursor(0, 1);
lcd.print("www.HOY.se");
delay(800);
lcd.clear();

}
}





void loop()


{

  // DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
  // LCD set the cursor to column 0, line 1 (note: line 1 is the second row, since counting begins with 0):
  
  lcd.setCursor(0, 0);

  lcd.print("Pulses:");
  if(PulseCount > -1){
    lcd.print(" ");
  }

  if(PulseCount < 10 && PulseCount > -10){
    lcd.print(" ");
  }

  if(PulseCount < 100 && PulseCount > -100){
    lcd.print(" ");
  }

  lcd.print(PulseCount);
  if(sensor01 == 1){
    lcd.print(" HIGH");
  }
  else{
    lcd.print(" LOW ");
  }

  lcd.setCursor(0, 1);

  if(sensor02 == 1){
    lcd.print("            HIGH");
  }
  else{
    lcd.print("            LOW ");
  }






//  ---- MOTORNS VOID LOOP  - KNAPPSTYRNINGEN TILL MOTORERNA ----

// intest 1 går UPP
// intest 2 går NER
// stopsensor1Pin heter stoppsensorn

{

// ---- UPP ----
  val = digitalRead(intest1Pin);         // UPP - Läser input värde
  if (val == HIGH) {                     // Checkar om knappen trycks
  digitalWrite(controlPin1, HIGH);       
  digitalWrite(controlPin2, LOW);

// Dessa 3 rader visar text när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
  lcd.setCursor(0, 1);
lcd.print("Up");
delay(50);
  }

// ---- NER ----
  else {
  val = digitalRead(intest2Pin);         // NER - Läser input värde
  if (val == HIGH) {                     // Checkar om knappen trycks
  digitalWrite(controlPin1, LOW);       
  digitalWrite(controlPin2, HIGH);

// Detta är sensorn som, om täcks, hindrar motorn från att åka ner
  {
  val = digitalRead(stopsensor1Pin);         // Sensorn som stoppar motorn
  if (val == HIGH) {                     
  digitalWrite(controlPin2, LOW);

  // Dessa 3 rader visar STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
    lcd.setCursor(0, 1);
lcd.print("STOP");
delay(50);

// Dessa tre rader nedanför gör pipljudet när stopsensorn (ovan) täcks
  tone(tonePin, 880, 125);
delay(125);
noTone(tonePin);
  }

// Dessa 3 rader visar DOWN när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
    lcd.setCursor(0, 1);
lcd.print("Down");
delay(50);
  }


// Dessa två rader stoppar motorn när man släpper knappen
  }  else {
  digitalWrite(controlPin1, LOW);        
  digitalWrite(controlPin2, LOW);       
  }

  
}
}
}
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Vart i koden skriver jag fel?

Inlägg av arvidb »

fosfor skrev:Vilka övriga problem med koden bör prioriteras?
Börja med att fixa indenteringen. Väldigt svårt att följa kodflödet när den är helt fel.

I checkState(): du har ju fyra olika states som du vill hantera på olika sätt. Skapa en enum där du ger dessa beskrivande namn, som talar om vad respektive tillstånd innebär. (Jag kallar dessa STATE_X????? i exemplet nedan; ändra detta till vettiga namn.) Som det är nu är det väldigt svårt att se vad denna kod är till för. Använd sedan en switch-sats för att hantera tillstånden.

Flytta ut all kod som skriver till lcdn ur loop() (d.v.s. all kod som nu finns i loop()) till en egen funktion (t.ex. update_lcd()). Ta bort alla delay()-anrop från denna. Anropa update_lcd() från loop() om någon förändring har skett som behöver visas på lcdn. Anropa delay() en gång sist i loop().

Nåt sånt här (OBS otestat):

Kod: Markera allt

//  ---- MOTOR CONST INTARNA  ----
const int controlPin1 = 7;
const int controlPin2 = 6;
const int enablePin = 9;


#include <Wire.h>
#include <LiquidCrystal_I2C.h>

enum state {
    STATE_A?????,
    STATE_B?????,
    STATE_C?????,
    STATE_D?????,
};

// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
char lineText[]="  Tjena!  ";
volatile enum state state;
int stepOld;
int step;
volatile long PulseCount;


// ---- MOTOR TEST INT ---------------------------------------------------------------------------------
int intest1Pin = 4;        // KNAPP  -  GRÅ - Går åt plus hållet    - UPP
int intest2Pin = 5;        // KNAPP  -  GRÖN - Går åt minus hållet  - NER
int intest3Pin = 11;       // KNAPP  -  BLÅ - Ej något än
int stopsensor1Pin = 12;   // SENSOR -  GRÖN - Enskild sensor
int val = 0;


// ---- Högtalare
int tonePin = 13;



// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
// initialize the library with the numbers of the interface pins
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
#define SENSOR_A 3
#define SENSOR_B 2

// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
void checkState()
{
    state = digitalRead(SENSOR_A);
    state |= digitalRead(SENSOR_B) << 1;

    switch (state) {
    case STATE_D?????:
        step = 0;
        if (stepOld == 1) {
            PulseCount--;
        }
        if (stepOld == 3) {
            PulseCount++;
        }
        stepOld = 0;
        break;

    case STATE_C?????:
        step = 1;
        if (stepOld == 2) {
            PulseCount--;
        }
        if (stepOld == 0) {
            PulseCount++;
        }
        stepOld = 1;
        break;

    case STATE_A?????:
        step = 2;
        if (stepOld == 3) {
            PulseCount--;
        }
        if (stepOld == 1) {
            PulseCount++;
        }
        stepOld = 2;
        break;

    case STATE_B?????:
        step = 3;
        if (stepOld == 0) {
            PulseCount--;
        }
        if (stepOld == 2) {
            PulseCount++;
        }
        stepOld = 3;
        break;

    default:
        // Unknown state
    }
}


// VOID SETUP - KÖRS BARA EN GÅNG I BÖRJAN, EN FÖRBEREDELSE, LOOP ÄR EXEKVERING OCH GÖR DET MESTA JOBBET
// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN

void setup()
{
    // set up the LCD's number of columns and rows:
    lcd.begin(16, 2);
    // Print a message to the LCD.
    lcd.setCursor(0, 0);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    lcd.print("                ");

    attachInterrupt(0, checkState, CHANGE);
    attachInterrupt(1, checkState, CHANGE);

    PulseCount = 0;





    // TEST MOTOR  - VOID SETUP ---------------------------------------------------------------------------------
    pinMode(intest1Pin, INPUT);         //Declarar denna som input  UNO input är 4    grå
    pinMode(intest2Pin, INPUT);         //Declarar denna som input  UNO input är 5    grön
    pinMode(intest3Pin, INPUT);         //Declarar denna som input  UNO input är 11   blå
    pinMode(stopsensor1Pin, INPUT);     //Declarar denna som input  UNO input är 12   grön

    //
    pinMode(tonePin, OUTPUT);


    //  ---- HOY LCD start presentationen
    {

        lcd.setCursor(2, 0);
        lcd.print("HOY!");
        delay(500);
        // lcd.clear();

        lcd.setCursor(11, 1);
        lcd.print("9");
        delay(100);

        lcd.setCursor(11, 1);
        lcd.print("90");
        delay(100);

        lcd.setCursor(11, 1);
        lcd.print("90E");
        delay(900);
        lcd.clear();

        lcd.setCursor(2, 0);
        lcd.print("Prototype 1.0");
        delay(200);

        lcd.setCursor(0, 1);
        lcd.print("www.");
        delay(100);

        lcd.setCursor(12, 1);
        lcd.print(".se");
        delay(100);

        lcd.setCursor(0, 1);
        lcd.print("www.HOY.se");
        delay(250);

        lcd.setCursor(0, 1);
        lcd.print("www.HOY.se");
        delay(800);
        lcd.clear();
    }
}

int update_lcd()
{
    int beep = 0;

    // DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
    // LCD set the cursor to column 0, line 1 (note: line 1 is the second row, since counting begins with 0):

    lcd.setCursor(0, 0);

    lcd.print("Pulses:");
    if (PulseCount > -1) {
        lcd.print(" ");
    }

    if (PulseCount < 10 && PulseCount > -10) {
        lcd.print(" ");
    }

    if (PulseCount < 100 && PulseCount > -100) {
        lcd.print(" ");
    }

    lcd.print(PulseCount);
    if (state == STATE_B?????) || (state == STATE_D?????)) {
        lcd.print(" HIGH");
    } else {
        lcd.print(" LOW ");
    }

    lcd.setCursor(0, 1);

    if (state == STATE_C?????) || (state == STATE_D?????)) {
        lcd.print("            HIGH");
    } else {
        lcd.print("            LOW ");
    }


    //  ---- MOTORNS VOID LOOP  - KNAPPSTYRNINGEN TILL MOTORERNA ----

    // intest 1 går UPP
    // intest 2 går NER
    // stopsensor1Pin heter stoppsensorn

    {

        // ---- UPP ----
        val = digitalRead(intest1Pin);         // UPP - Läser input värde
        if (val == HIGH) {                     // Checkar om knappen trycks
            digitalWrite(controlPin1, HIGH);
            digitalWrite(controlPin2, LOW);

            // Dessa 3 rader visar text när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
            lcd.setCursor(0, 1);
            lcd.print("Up");
        }

        // ---- NER ----
        else {
            val = digitalRead(intest2Pin);         // NER - Läser input värde
            if (val == HIGH) {                     // Checkar om knappen trycks
                digitalWrite(controlPin1, LOW);
                digitalWrite(controlPin2, HIGH);

                // Detta är sensorn som, om täcks, hindrar motorn från att åka ner
                {
                    val = digitalRead(stopsensor1Pin);         // Sensorn som stoppar motorn
                    if (val == HIGH) {
                        digitalWrite(controlPin2, LOW);

                        // Dessa 3 rader visar STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
                        lcd.setCursor(0, 1);
                        lcd.print("STOP");

                        // Dessa tre rader nedanför gör pipljudet när stopsensorn (ovan) täcks
                        beep = 1;
                    }

                    // Dessa 3 rader visar DOWN när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
                    lcd.setCursor(0, 1);
                    lcd.print("Down");
                }


                // Dessa två rader stoppar motorn när man släpper knappen
            } else {
                digitalWrite(controlPin1, LOW);
                digitalWrite(controlPin2, LOW);
            }
        }
    }
    return beep;
}

void loop()
{
    enum state oldState;
    long oldPulseCount;
    int beep;

    if ((state != oldState) || (PulseCount != oldPulseCount)) {
        beep = update_lcd();
        oldState = state;
        oldPulseCount = PulseCount;
    }

    if (beep) {
        tone(tonePin, 880, 125);
    }

    delay(125);
    noTone(tonePin);
}
Edit: Fixade några syntaxfel...
Edit2: La till volatile (även om det svider ;))
Senast redigerad av arvidb 22 januari 2018, 22:47:51, redigerad totalt 2 gånger.
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Vart i koden skriver jag fel?

Inlägg av arvidb »

Dessutom ser det ut som att du aldrig använder värdet som skrivs till variabeln 'step'? Så du bör kunna ta bort alla rader som har med 'step'-variabeln att göra.

... Och byt namn på SENSOR_A och SENSOR_B till något beskrivande. T.ex. PIN_BTN_UP och PIN_BTN_DOWN eller vad det nu är de representerar. Och varför inte definiera alla "Pins" på detta sätt, istället för som nu med "const int" och "int"? Alltså även t.ex.

Kod: Markera allt

#define PIN_BTN_STOP 12;
och

Kod: Markera allt

val = digitalRead(PIN_BTN_STOP);
Det trevliga med detta är att koden blir självbeskrivande, så du kan ta bort kommentaren som beskriver vad som händer.
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Vart i koden skriver jag fel?

Inlägg av hawkan »

Globala variabler som ändras i interruptrutinen behöver deklareras som "volatile", t ex sensor01.
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Vart i koden skriver jag fel?

Inlägg av arvidb »

Vad finns det för semaforer/mutexes i Arduinomiljön? I just detta fall kanske (?) volatile är tillräckligt (det beror väl på hur känsligt det är att sensor01 och sensor02 uppdateras synkroniserat), men för synkronisering & serialisering generellt så räcker det ju inte.
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Vart i koden skriver jag fel?

Inlägg av hawkan »

Det är inte för synkronisering eller serialisering utan för att variabeln verkligen ska läsas och skrivas från ram och inte från ett register och därmed inte uppdateras som tänkt, både globalt och i irq. Detta är kutym in arduino-miljön. Av lathet, och för att det förklaras bättre där, så bifogar jag en länk https://www.arduino.cc/reference/en/lan ... /volatile/
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Vart i koden skriver jag fel?

Inlägg av arvidb »

Jo jag vet... problemet är bara att volatile inte räcker i de flesta situationer där du har preemption (t.ex. i form av interrupt). Nu är ju detta ett single-core-system och sensor0X är ju enbitars flaggor så det bör väl fungera ändå (tills det dyker upp multicore-arduinos).

volatile var aldrig tänkt att användas för att lösa trådsynkronisering eller minnesserialisering, och dessutom hindrar det kompilatorn från att optimera koden på ett bra sätt. Lika bra att använda riktiga metoder direkt då, tycker jag i alla fall!

Se t.ex. Volatile: Almost Useless for Multi-Threaded Programming.

Därav frågan om vad det finns för metoder att hantera synkronisering och serialisering i Arduinomiljön.

Ta denna kod t.ex. (från https://mcuoneclipse.com/2013/08/14/vol ... e-harmful/):

Kod: Markera allt

static volatile uint32_t nofTxBytes = 0;

void myTxInterrupt(void) {
  ...
  nofTxBytes++;
  ...
}

void main(void) {
  ...
  nofTxBytes = 0;
  TxData(); /* send data, will raise myTxInterrupt() */
  while(nofTxBytes < nofDataSent) { /* compare against how much we sent */
    /* wait until transaction is done */
  }
  ...
}
volatile garanterar inte atomisk åtkomst till nofTxBytes, så på en 8- eller 16-bitars CPU (eller bara beroende på hur CPUn är uppbyggd) så kan while-loopen läsa ett halv-uppdaterat, felaktigt värde i while()-loopen. Det är alltså inte säkert att transaktionen verkligen är färdig efter while()-loopen. volatile är riskabelt på det här sättet och bör undvikas om man inte verkligen vet vad man gör. Verkligen illa att arduinoreferenssidan rekommenderar att man använder det! :roll:

Edit2: Jag skrev förut att problemet med nofTxBytes bara gällde på ett multicore-system eller där det förekommer preemption mellan trådar, men det stämmer inte. Om det kommer ett interrupt när nofTxBytes läses i while-loopen i main så skulle problemet kunna uppstå även på en vanlig AVR-mikrokontroller.
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Vart i koden skriver jag fel?

Inlägg av hawkan »

Nu är du way off. Använd volatile i fosfors kod. Det blir inte sämre, det kan till och med lösa problemet fosfor har. Jag har inte dykt in i det djupare än så, men volatile är nödvändigt för att slippa en typ av bekymmer.
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Vart i koden skriver jag fel?

Inlägg av arvidb »

Du gör som du vill förstås, men jag rekommenderar att du läser artiklarna som jag länkade till. Kan spara mycket huvudkliande någon gång i framtiden. :)

I detta fall är volatile mycket bättre än ingenting, det håller jag med om. Jag har lagt till volatile i min kod ovan.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Vart i koden skriver jag fel?

Inlägg av johano »

i avrgcc finns makrot ATOMIC_BLOCK() som garanterar att kod som exekveras däri inte kommer avbrytas
av något interrupt. Finns säkert något motsvarande in arduino också, kanske tom samma makro går att referera
till?

/johan
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Vart i koden skriver jag fel?

Inlägg av lillahuset »

Jösses, varför inte använda "disable interrupt" och "enable interrupt"?
Användarvisningsbild
ecenier
Inlägg: 1104
Blev medlem: 13 december 2007, 17:51:42
Ort: Älvsjö
Kontakt:

Re: Vart i koden skriver jag fel?

Inlägg av ecenier »

Angående stepOld.
Varje case kan förenklas.

Kod: Markera allt

:
    case STATE_D?????:
        if (step == 1) {
            PulseCount--;
        }
        if (step == 3) {
            PulseCount++;
        }
        step = 0;
        break;
  :
osv. för resterande case-fall.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Vart i koden skriver jag fel?

Inlägg av johano »

lillahuset skrev:Jösses, varför inte använda "disable interrupt" och "enable interrupt"?
Det är exakt det som ATOMIC_BLOCK gör med finessen att kunna "återställa" interruptflaggan som "den såg ut innan" blocket.

/j
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Vart i koden skriver jag fel?

Inlägg av arvidb »

Fast varken disabling av interrupt eller volatile är tillräckligt, ens tillsammans, generellt sett. (Det är möjligt att det räcker på AVR; jag har inte tillräcklig koll på vare sig arkitekturen eller kompilatorn för att kunna avgöra det.)

Det som behövs är en minnesbarriär plus en instruktionsbarriär. Minnesbarriären ser till att alla köade minnesoperationer utförs innan exekveringen fortsätter, och instruktionsbarriären hindrar kompilatorn från att omordna instruktioner över barriären.

avr-libc definierar en memory barrier så här:

Kod: Markera allt

asm volatile ("" : : : "memory");
- detta är så vitt jag förstår specifikt för gcc (och llvm) men bör fungera på alla arkitekturer, och fungerar även som instruktionsbarriär i dessa kompilatorer. Så kanske nåt sånt här funkar på AVR (se länk):

Kod: Markera allt

#define lock() __asm volatile( "cli" ::: "memory" )
#define unlock() __asm volatile( "sei" ::: "memory" )
:?:
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Vart i koden skriver jag fel?

Inlägg av sodjan »

Om detta vore ett reellt problem på den aktuella arkitekturen (som tråden handlar
om) så hade det varit nämnt och dokumenterat i den stora mängd information som
faktiskt existerar. Frågor av generell art (dock i och för sig väldigt intressanta i sig)
kanske kan tas någon annanstans.
Skriv svar