Sida 1 av 1
Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Postat: 16 februari 2016, 14:13:09
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.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Postat: 16 februari 2016, 14:18:39
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..
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Postat: 16 februari 2016, 14:30:03
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.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Postat: 16 februari 2016, 15:10:18
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 */
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Postat: 16 februari 2016, 15:34:21
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!

Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Postat: 16 februari 2016, 17:28:20
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.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Postat: 16 februari 2016, 17:51:57
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.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Postat: 16 februari 2016, 18:49:01
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.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Postat: 16 februari 2016, 19:09:19
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.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Postat: 16 februari 2016, 19:24:57
av janno
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
Postat: 16 februari 2016, 19:25:14
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.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Postat: 18 februari 2016, 20:33:13
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.
Re: Spara kompileringstid i EEPROM, Atmega, IAR:s kompilator
Postat: 18 februari 2016, 20:47:48
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.