Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
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.
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.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
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..
__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..
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
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.
- 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
__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å.
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 */
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
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!
Tack!

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
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.
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.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
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.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
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.
-
- Inlägg: 1409
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
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 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.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Fiffigt det där med touch, det har jag inte tänkt på, ska stoppa in det i min makefil på hallonpajen.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
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.
-
- Inlägg: 18
- Blev medlem: 1 juni 2013, 18:07:48
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Hej! Här kommer några fler varianter. 
Om inte preprocessorns varianter räcker till så kan man kan man exempelvis göra:
1.
och deklarera variablerna i en include-fil:
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.

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
Kod: Markera allt
extern const char *info_date;
extern const char *info_wc;
extern const char *info_md5;
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.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
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.