avr-ar: core.a: Permission denied

Hallo,

beim kompilieren des Sketches erhalte ich zeitweise folgende Fehlermeldung. Manchmal auch andere, aber immer etwas mit core.a. Kompiliere ich dann nochmal funktioniert das. Flashen funktioniert auch.

C:\Portable Apps\Arduino IDE\hardware\tools\avr\bin\avr-ar: core.a: Permission denied
Binäre Sketchgröße: 17.732 Bytes (von einem Maximum von 258.048 Bytes)

Allerdings verhält sich das Programm seltsam. Am Ende von setup steht:

Serial.println("Initialization done.");
lcd.setCursor(0, 0);
lcd.print(" SD Init done ");

Das erscheint nicht nachdem Upload. Auf dem Display bleibt es bei der Anzeige davor "SD Card present". Nur nach einem weiteren Reset bzw. öffnen des seriellen Monitors erscheint "SD Init done". Die beiden Temperaturen werden jedoch immer aktualisiert wie gewollt auf dem Display.

Ist doch nicht normal.
Mega defekt?
IDE durcheinander?

Windows 7 64 Bit
Arduino IDE 1.0.5-r2

Edit: oder diese aktuelle Meldung

C:\Portable Apps\Arduino IDE\hardware\tools\avr\bin\avr-ar: unable to rename 'core.a'; reason: File exists
Binäre Sketchgröße: 23.192 Bytes (von einem Maximum von 258.048 Bytes)

Sketch

/*
Mit Hardware SPI
EA GOGM Display Beschaltung:
** LCD SI  - Pin MOSI - Pin 11 on Arduino Uno und bei Mega2560 Pin 51
** LCD CLK - Pin SCK  - Pin 13 on Arduino Uno und bei Mega2560 Pin 52
** LCD RS  - Pin 24 Mega2560 frei gewählt
** LCD CSB - Pin 25 Mega2560 frei gewählt (CS)
             CSB - Depends on your SD card shield or module.
                   Pin 4 used here for consistency with other Arduino examples

Exp-Tech SD Modul Beschaltung:
** MOSI - pin 11 on Arduino Uno und bei Mega2560 Pin 51 (DI)
** MISO - pin 12 on Arduino Uno und bei Mega2560 Pin 50 (DO)
** CLK  - pin 13 on Arduino Uno und bei Mega2560 Pin 52 (CLK)
** CS   - pin 26 frei gewählt Mega2560                  (CS)
          Pin 4 belegt mit Arduino WiFi/SD Shield
*/

#include <SPI.h>
#include <DogLcdSPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SD.h>

// initialize the library with the numbers of the interface pins
DogLcdSPI lcd(24, 25);  // Pins für RS und CSB

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 26; 

// Dallas DS1820 Settings
OneWire  ds(2); //pin für ds1820
// DeviceAdressen der einzelnen ds1820 Temperatursensoren angeben. (loop anpassen)
DeviceAddress sensor1 = { 0x10, 0x40, 0xDD, 0xC3, 0x2, 0x8, 0x0, 0xB4 };
DeviceAddress sensor2 = { 0x10, 0x8A, 0xB, 0xAC, 0x2, 0x8, 0x0, 0x2C };

char sensor1Name[] = "Garten: ";
char sensor2Name[] = "Wohnzimmer: ";

void setup(void) 
{
  Serial.begin(9600);

  SPI.begin();                 // ganz wichtig, sonst geht gar nix los, "Sketch wie tot"
  lcd.begin(DOG_LCD_M163);     // set up the LCD type and the contrast setting for the display 
  
  // SD Card Test, Initializing:
    Serial.print("\nInitializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
  pinMode(53, OUTPUT);     // change this to 53 on a mega

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    lcd.setCursor(1, 0);
    lcd.print("SD Init failed");
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card is inserted?");
    Serial.println("* Is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    return;
  } else {
   lcd.setCursor(0, 0);
   lcd.print("SD Card present"); 
   Serial.println("Wiring is correct and a card is present."); 
  }
  

  // print the type of card
  Serial.print("\nCard type: ");
  switch(card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }

  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();
  
  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);
  
  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
  
  Serial.println("Initialization done.");
  lcd.setCursor(0, 0);
  lcd.print(" SD Init done  ");
  
}  // Ende setup

void loop(void) 
{
  float temp1 = getTemperature(sensor1);
  float temp2 = getTemperature(sensor2);
    
  lcd.setCursor(1, 1);
  lcd.print(temp1,1);
  
  lcd.setCursor(1, 2);
  lcd.print(temp2,1);
  
  delay(1000);
  
  /*
  Serial.print(sensor1Name);
  Serial.print(temp1);
  Serial.println(" Celsius");

  Serial.print(sensor2Name);
  Serial.print(temp2);
  Serial.println(" Celsius");
  
  Serial.println();
  delay(1000);
  */
}  // Ende loop


// *** Funktionen für DS1820 ***
void writeTimeToScratchpad(byte* address)
{
  ds.reset();            // reset the bus  
  ds.select(address);    // select our sensor  
  ds.write(0x44,1);      // CONVERT T function call (44h) which puts the temperature into the scratchpad  
  delay(1000);           // sleep a second for the write to take place
}

void readTimeFromScratchpad(byte* address, byte* data)
 {
  ds.reset();            // reset the bus
  ds.select(address);    // select our sensor
  ds.write(0xBE);        // read the scratchpad (BEh)
  for (byte i=0;i<9;i++)
   {
    data[i] = ds.read();
   }
 }

float getTemperature(byte* address)
{
  int tr;
  byte data[12];

  writeTimeToScratchpad(address);

  readTimeFromScratchpad(address,data);

  tr = data[0];    // put in temp all the 8 bits of LSB (least significant byte)

  if (data[1] > 0x80)    // check for negative temperature
   {
    tr = !tr + 1;   // two's complement adjustment
    tr = tr * -1;   // flip value negative.
   }

  int cpc = data[7];    // COUNT PER Celsius degree (10h)
  int cr = data[6];     // COUNT REMAIN (0Ch)

  tr = tr >> 1;         // drop bit 0

  return tr - (float)0.25 + (cpc - cr)/(float)cpc;
}

Ist doch nicht normal. -> Ja, nicht normal :wink:
Mega defekt? -> dafür sehe ich kein Anzeichen
IDE durcheinander? -> ja, vermutlich fängts da an.

core.a ist eine temporäre Datei, die von avr-ar erzeugt wird. ( im xxxxx.tmp Verzeichnis, das normalerweise bei jedem IDE Start neu angelegt wird. )
Darin werden die Übersetzungen der Sandard-Libraries gesammelt. avr-ar rcs
Schau dir mal die ausführlichen Ausgaben beim Übersetzen an, da findest du dann als erstes ein Dutzend solcher Zeilen

C:\Program Files (x86)\Arduino\arduino-1.0.5-r2\hardware\tools\avr\bin\avr-ar rcs C:\Users\michael_x\AppData\Local\Temp\build4253568333842278897.tmp\core.a C:\Users\michael_x\AppData\Local\Temp\build4253568333842278897.tmp\malloc.c.o

( Min. ein gutes Dutzend von malloc.c.o bis WString.cpp.o )
Danach wird core.a und die Übersetzung deines eigenen Sketch in eine .elf Datei gelinkt.

http://forum.arduino.cc/index.php?topic=4649.25;wap2

Ich rate mal, irgendwas mit deinem temp Verzeichnis ist verquer.

Wenn du aus irgend einem Grund eine falsche core.a Datei haben solltest, kann man natürlich nicht wissen, was auf dem Arduino nach dem upload passiert. Das sind dann aber Folge-Erscheinungen, denke ich.

Hallo,

ich nutze die Portable Version von der IDE. Ist also nicht installiert auf dem üblichen Weg.
Wo finde ich den temp Ordner? Sehe keinen.

Oder ich lade mir die IDE nochmal runter in einen neuen Ordner und kopiere nur die Librarys rein die ich benötige. Fang also sachte von vorn an. Vielleicht klärt sich dann auch das Problem mit dem WiFi Shield und SD Karte.

Wo finde ich den temp Ordner? Sehe keinen.

Dann guck halt, was die IDE macht. -> Verbose Output / Ausführliche Ausgaben

Hallo,

hmm, da wird man noch mehr versunsichert ob da was nicht stimmt oder ob das zu den normalen Meldungen gehört?

Neuen IDE Ordner angelegt und frische .zip darin entpackt.
Vorher temps und preferences.txt gelöscht.

Wenn ich jetzt das Bsp. Analog In aufrufe und kompiliere und dabei zuschaue was für Meldungen erzeugt werden, dann kommt sowas bei raus. Normal oder nicht normal? Die rot markierten.

C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp: In function 'void store_char(unsigned char, ring_buffer*)':
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp:98: warning: comparison between signed and unsigned integer expressions
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp: In function 'void __vector_25()':
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp:127: warning: unused variable 'c'
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp: In function 'void __vector_36()':
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp:153: warning: unused variable 'c'
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp: In function 'void __vector_51()':
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp:168: warning: unused variable 'c'
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp: In function 'void __vector_54()':
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp:183: warning: unused variable 'c'
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp: In member function 'void HardwareSerial::begin(long unsigned int, byte)':
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp:368: warning: unused variable 'current_config'
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp: In member function 'virtual size_t HardwareSerial::write(uint8_t)':
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp:467: warning: comparison between signed and unsigned integer expressions

C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\Print.cpp: In member function 'size_t Print::print(const __FlashStringHelper*)':
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\Print.cpp:44: warning: '__progmem__' attribute ignored

C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\arduino\cores\arduino\Tone.cpp:94: warning: only initialized variables can be placed into program memory area

Das sind Warnungen über Kleinigkeiten. Die kann man ignorieren.

Die letzte Zeile ist ein Bug. d.h. es wird eine Warnung angezeigt die gar nicht kommen sollte. In aktuellen Version von avr-gcc wurde das behoben. Aber Arduino verwendet leider eine antike Version.

Hallo,

das heißt, ich kann die Meldungen wieder abschalten und mit dieser neuen IDE neu anfangen?
Kann man vielleicht die neue avr-gcc Version in die Arduino IDE kopieren? Woher?
Oder muß die erst angepaßt werden?
Sind die Sketche dann noch 100% kompatibel?

Edit:
Das kann doch nicht wahr sein. Schon wieder eine Fehlermeldung beim kompilieren. Vorher kamen mal seitenweise sowas wie Deklarationsfehler, was aber nicht sein konnte, weil ich daran nichts geändert hatte.

Jetzt kommt zum Bsp. wieder

C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\tools\avr\bin\avr-ar: unable to rename 'core.a'; reason: File exists

dann kompiliere ich erneut ohne Meldung, dann nochmal und schon erscheint was anderes wie das hier:

cc1plus.exe: error: SDcard_Write_mit_Taster_und_LCD_001.cpp: Permission denied

dann kompiliere ich wieder ohne Fehlermeldungen.

Ideen was hier los ist?

Doc_Arduino:
Kann man vielleicht die neue avr-gcc Version in die Arduino IDE kopieren? Woher?
Oder muß die erst angepaßt werden?
Sind die Sketche dann noch 100% kompatibel?

Es gibt eine Anleitung und angepasste Core Files:

Das geht aber glaube ich nur für den UNO. Ich habe es aber mit dem Mega probiert und dabei stürzt "ld" ab. Andere Leute haben das auch wenn man sich die Kommentare ansieht. :frowning:

Hallo,

okay, dann lass ich das mit der avr-gcc. Hab z.Z.ne ander Baustellen.

Ich bekomme in letzter Zeit immer öfters diese Meldung:
C:\Portable Apps\Arduino IDE 1.0.5-r2\hardware\tools\avr\bin\avr-ar: unable to rename 'core.a'; reason: File exists

Beim erneuten kompilieren wiederum ohne Fehlermeldung. Ist ein Wechselspiel ohne Ende so in der Art. Ich hatte bis vor kurzem keine Probleme mit der IDE. Ich bin echt ratlos was hier schief läuft.

Oder sowas hier:
Assembler messages:
Fatal error: can't create wiring.c.o: Permission denied

cc1plus.exe: error: SDcard_Write_Taster_LcdSPI_DS1820_001.cpp: No such file or directory

Assembler messages:
Fatal error: can't create USBCore.cpp.o: Permission denied

Hallo,

ich hatte diese oder eine ähnliche Meldung bezüglich 'core.a' in den letzten Tagen auch öfter erhalten.
Ich verwende auch die IDE 1.0.5-r2 unter Win 7(64).
Trotz der Meldung wurde der Sketch bei mir aber bisher immer fehlerfrei zum Arduino übertragen.

Kann es sein dass die Meldung erst seit dem letzten Microsoft Patchday (16.02. ?) auftaucht?
Zudem ist mir aufgefallen dass die IDE eine Unmenge (bei mir über 500) temporäre Dateien im TEMP-Ordner hinterlässt.
Ich habe die heute alle mal gelöscht. Vielleicht hilft das, jedenfalls ist die Fehlermeldung heute bei mir ausgeblieben.

Hallo,

seit wann das genau auftritt habe ich mir nicht notiert. Seit paar Tagen ist das aber schon. Jetzt wo ich weis wo der temp Ordner liegt, hatte ich mich vorhin auch gewundert das hier ein Haufen Müll rumliegt. Kommt die IDE vielleicht mit alten Dateien durcheinander? Ich räume nun erstmal regelmäßig auf.

Edit:
Um das aufräumen zu vereinfachen, habe ich 3 Zeilen in eine Batchdatei geschrieben. Heißt bei mir Batch.bat
In die Datei kopiert man folgende Zeilen und paßt den Pfad an.
Unter Win7 geht das damit am einfachsten. Erst löscht man den Ordner temp ohne Nachfrage komplett und erstellt ihn wieder. Dann wird die IDE aufgerufen.

rmdir /s /q C:\Users\NAME\AppData\Local\Temp
mkdir C:\Users\NAME\AppData\Local\Temp
"C:\Portable Apps\Arduino IDE 1.0.5-r2\arduino.exe"

Ab sofort muß man nur noch die Batchdatei starten und hat vorm Aufruf der IDE einen sauberen Temp Ordner.

Das mit der Batchdatei würde ich persönlich nicht so machen.

Wenn irgenwelche anderen Programme noch geöffnete Dateien im Temp-Verzeichnis vorhalten wird sich das Verzeichnis vermutlich nicht löschen lassen.
Auch Programmupdates die oft heimlich im Hintergrund laufen (Windows, Virenscanner, Browser, ect.) könnten Informationen im Temp-Verzeichnis ablegen um nach einem Rechnerneustart das Update fertig zu stellen.

Ich lösche deshalb den Inhalt des Temp-Verzeichnisses bei Bedarf immer von Hand zu Fuß kurz nach einem Neustart des PC's.
Ich lösche aber nie das Verzeichnis selbst und lege es neu an.

Hallo,

hmm, irgendwie haste recht. :wink:
Hab das geändert und in TempClean umbenannt ohne IDE Aufruf. Temp habe ich auch manchmal manuell gelöscht. Jetzt gibts die .bat ... :slight_smile: Hab nur Angst das dann wieder die seltsamen Kompilierfehler auftreten, denn seitdem löschen ist Ruhe.

Wenn ich nicht aufräume, bleiben immer 2 Ordner bestehen mit vielen angehängten wilden Nummern.
console...xxxxx...
untitled...xxxxx...

Was nach schließen der IDE verschwindet ist nur build und eine jn... Datei. Je öfter ich die IDE öffne und wieder schließe, umso mehr Ordner console/untitled bleiben stehen. Alle mit je dem gleichen Inhalt.