Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Dalmas
Inlägg: 268
Blev medlem: 30 maj 2013, 07:53:17

Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

Inlägg av Dalmas »

Hej,
Jobbar med atmega328P och IAR:s Embedded Workbench och skriver i Ansi-C. Jag undrar om nån här vet hur man (OM man kan?) vid kompilering spara tiden/CRC/unikt löpnummer i EEPROM så man kan läsa av den vid uppstart av systemet (har display).
Vore bra att kunna "se" det och ha ett ID på kompileringen. Att öka på versionen ett steg för varje test är ingen lösning.
Användarvisningsbild
AndLi
Inlägg: 18251
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

Inlägg av AndLi »

Varför vill du ha det i eeprom?
__DATE__ heter väl definen som anger kompileringsdatum tex. Lägg den i en sträng som du skriver ut.

Unikt serienummer och crc lär du behöva extern precompiler till..
Användarvisningsbild
Dalmas
Inlägg: 268
Blev medlem: 30 maj 2013, 07:53:17

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

Inlägg av Dalmas »

Ja. Jag har också sneglat på _DATE_ men tror inte det anger mitt komp.datum utan istället tillhör _DATE_ en massa annat som rör version/datum av avr-libc.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

Inlägg av lillahuset »

__DATE__ är ett macro som anger kompileringstiden. Jag har aldrig sett något annat iallafall.
http://linux.die.net/man/1/pcc-cpp

Edit: Du behöver __TIME__ också.

Kod: Markera allt

#include <stdio.h>

int main(int argc, char **argv)
{

  printf(__DATE__ " " __TIME__);

  return 0;
} /* main */
Användarvisningsbild
Dalmas
Inlägg: 268
Blev medlem: 30 maj 2013, 07:53:17

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

Inlägg av Dalmas »

OK! Det var ny info för mig. Har sökt igenom avr-libc.pdf och inte hittat detta _TIME_/_DATE_. Ska testa ikväll !!

Tack! :tumupp:
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46930
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

Inlägg av TomasL »

Den finns garanterat INTE i avr-libc.pdf, utan du får titta i manualen till gcc och dess preprocessor, då detta är något som Preprocessorn fixar vid kompilering, det är alltså inbyggt i GCC och inte i några libbar eller likande.
Om du använder SVN eller liknande, så kan du på samma sätt, ungefär, genom att tala om det för SVN, få SVN att ersätta en specifik textsträng med till exempel versionsnummer eller liknande.
janno
Inlägg: 430
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

Inlägg av janno »

En lite utmaning kan vara att man måste göra rebuild för att datum tiden ska uppdateras. Compilern bygger ju normalt inte om filen om den inte har ändrats och då ändras inte tidpunkten för programmet. Det är ju inget problem om man bara har en fil men i ett lite större projekt så får man tänka på det.
Användarvisningsbild
Dalmas
Inlägg: 268
Blev medlem: 30 maj 2013, 07:53:17

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

Inlägg av Dalmas »

Jag gjorde en snabbtest av _TIME_. Lägger strängen i flash-mem och vid uppstart så skrivs strängen ut enkelt i displayen. Ett utmärkt sätt att få till ett ID på kompileringen mellan två mjukvaruversioner. Det tycks krävas en rebuild men det är inga problem.
Mr Andersson
Inlägg: 1409
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

Inlägg av Mr Andersson »

janno skrev:En lite utmaning kan vara att man måste göra rebuild för att datum tiden ska uppdateras. Compilern bygger ju normalt inte om filen om den inte har ändrats och då ändras inte tidpunkten för programmet. Det är ju inget problem om man bara har en fil men i ett lite större projekt så får man tänka på det.
De flesta IDE:er jag har sett har haft någon form av pre-build step och då kan man t.ex. ställa in så det görs en 'touch datetime.c' innan kompilering för att tvinga omkompilering av den filen. Eller om man använder make så kan man lägga in det i makefilen.
janno
Inlägg: 430
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

Inlägg av janno »

Fiffigt det där med touch, det har jag inte tänkt på, ska stoppa in det i min makefil på hallonpajen.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46930
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

Inlägg av TomasL »

Sedan är det väl en bra ide att alltid göra en "Make/Build All" för versioner som är tänkta att bli skarpa.
extradrajven
Inlägg: 18
Blev medlem: 1 juni 2013, 18:07:48

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

Inlägg av extradrajven »

Hej! Här kommer några fler varianter. :-)

Om inte preprocessorns varianter räcker till så kan man kan man exempelvis göra:
1.

Kod: Markera allt

echo "const char *info_date = \"`date`\";" > info.c
echo "const char *info_wc = \"`wc main.c`\";" >> info.c
echo "const char *info_md5 = \"`md5 main.c`\";" >> info.c
och deklarera variablerna i en include-fil:

Kod: Markera allt

extern const char *info_date;
extern const char *info_wc;
extern const char *info_md5;
Om informationen redan finns i versionshanteringsystemet, så kan det räcka med att dumpa exempelvis git hist | head -n 1 till en C-fil.

2.
För mer avancerad data kan man använda objcopy eller liknande. Exempelvis med m68k-elf-objcopy -I binary -O elf32-m68k abc.png abc.o. En symbol baserad på filnamnet skapas i abc.o. Deklarera en extern-pekare med samma namn så kan C-koden använda binär-datat. Jag känner inte till vad som finns tillgängligt i IAR:s verktygslåda, men antar att de används ELF-formatet så det bör funka.

3.
För checksumma på ROM-image så är det nog smidigast att postprocessa efter länkning. Dumpa load-imagen till binärfil och släng på checksumman efteråt. I länkarskriptet kan man stta en symbol i början och slutet av ROM-segmentet. I själva programmet så kör man sin checksummealgoritm från start-symbolen upp till slut-symbolen plus de extra byten man lagt till.

För metoderna 1. och 2. ovan så behöver man någon regel i Makefile/byggskript som ser till att filerna genereras när de ska.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46930
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator

Inlägg av TomasL »

I SVN kan man köra ett post-comitt kommando, vilket scannar igenom alla filer och letar reda på den senaste versionen (dvs SVN Rev) och stoppar in det på valfritt ställe i valfri fil, till exempel main, då får man en konstant som garanterat visar vilken revision man använder.
Skriv svar