Automatisierung von Anwendungen

Gast #6147474
Lesenswert?

Guten Abend,
ich habe folgendes Problem:

In der Anwendung Arduino habe ich ein Programm erstellt, welches ich auf 
ATTINYs flashen möchte. An sich kein Problem, aber sehr 
arbeitsaufwendig, da ich 100 ATTINYs flashen möchte. Jeder ATTINY 
bekommt dabei eine individuelle I2C-Adresse und ID.
Sobald die richtige Adresse bei Arduino eingestellt ist, erzeuge ich mit 
Arduino eine HEX-Datei. Diese HEX-Datei öffne ich mit einem Flash-Tool, 
welches die ATTINYs dann letztendlich flasht.
Dieser Prozess ist somit überhaupt nicht optimiert, was ich ändern 
möchte. Den momentan benötige ich +- 1 Minute pro ATTINY, was definitiv 
zu lange ist, vor allem bei 100 Stück...

Meine Frage richtet sich an dieser Stelle an die Prozessoptimierung.
Der Wunschzustand ist das öffnen einer Anwendung, die in der Anwendung 
Arduino die beiden Parameter (ID, Adresse) verändern kann, dann 
automatisch das HEX-File erzeugt und danach das Flashen initialisert und 
durchführt, sodass ich, als Bediener, nur noch die Attinys in den Sockel 
legen muss.

Mein Ansatz war eine Batch-Datei, in der ich mittels Shortcuts die 
nötigen Befehle aufrufe, doch mit meinem Wissensstand kann man keine 
Shortcuts mit einer Batch-Datei ausführen.
Gibt es eine andere Anwendung/Programmiersprache, mit der man auch bei 
Arduino die entsprechenden Zeilen hochzählen lassen kann, bzw. mittels 
Shortcuts alles steuern kann?
Gast #6147525
Lesenswert?

Falscher Ansatz.

Modifiziere direkt das .Hex File, dafür musst du dich natürlich ein 
bisschen mit linker und make befassen um die adressbereiche zu 
definieren und frei zu halten.

Oder du nutzt das eeprom zum speichern der Adressen, dann gibt's dafür 
ein extra Hex mit wenig inhalt.


Das modifizierte Hex wird dann geflasht.

Dafür gibt's fertige Tools, Segger zb bietet das in jflash sogar ab 
werk..
Gast #6147607
Lesenswert?

Bin nicht 100%ig sicher, ob ich die Problemstellung richtig verstanden 
habe, daher erzähle ich evtl. gerade Unsinn. Aber eventuell wäre 
folgender Ansatz möglich/sinnvoll:

- Statt der Arduino-IDE nimmst Du PlatformIO zum kompilieren und flashen
- die sich mit bei jedem Attiny verändernden Parameter I2C-Adresse und 
ID übergibst Du als #define per "-D" Kommandozeilenparameter, z.B. 
"-DI2C_ADDRESS=23 -DID=32"
- Das ganze packst Du in ein Shell-Script/Batch-Datei, die dann in einer 
Schleife nach und nach für jeden der Attinys zuerst die passende 
Firmware kompiliert und dann flasht
Gast #6147694
Lesenswert?

Gibt es dafür nicht sed? Also in die Originaldatei einen markanten 
Platzhalter an die Stelle der Adresse und dann in einer Schleife den 
Platzhalter gegen einen Counter ersetzen, dabei die Datei ans Ziel 
schreiben (das macht der sed),  dann neu compilieren und flashen. Wie 
die entsprechenden Konsolenbefehle dafür aussehen, das sollte sich doch 
herausfinden lassen.
Gast #6147726
Lesenswert?

ThomasW schrieb:

> Gibt es dafür nicht sed?

Und 100000 andere Tools, die das Gleiche (und mehr) leisten könnten.

Das Problem ist: in alle muss man sich einarbeiten und dafür ist der TO 
offensichtlich zu faul.

Er ist ja sogar schon zu faul dazu gewesen, selbst so ein Tool zu 
suchen...
Gast #6147750
Lesenswert?

c-hater schrieb:
> Das Problem ist: in alle muss man sich einarbeiten und dafür ist der TO
> offensichtlich zu faul.

Kann man sich nicht erst dann einarbeiten, wenn man weiß worin?

c-hater schrieb:
> Er ist ja sogar schon zu faul dazu gewesen, selbst so ein Tool zu
> suchen...

weil er nicht genau weiß wonach er suchen soll und nun Rat von 
erfahrenen Leuten sucht, da stellt er ne Frage in einem Forum. Was für 
ne verrückte Welt ...
Gast #6147877
Lesenswert?

Hier geht es bereits um kleine Industriemengen.
Also könnte sich -nach dem Dauereinsatz unter Umwelteinflüssen- ja die 
Frage stellen, ob ein gewisses Exemplar nach einer Zeit immernoch das 
korrekte Programm in seinem FlashROM hat.

Wenn nun per "-DI2C_ADDRESS=23 -DID=32" (oder per "sed" oder per 
Desktopautomation oder...) Der Flashinhalt individualisiert wird, also 
jedes Exemplar andere Prüfsumme aufweist, müsste dies aufwändig 
administrativ gebuchhaltet werden um nach Zeit im Zweifelsfall 
vergleichen zu können.
Bitte für jede Version des Programms...

Die "Richtige Lösung[TM]" muss also darauf hinaus dass pro 
Programmversion die Prüfsumme für alle Exemplare gleich ist und solche 
Exemplarindividualdaten im gesonderten EEPROM-Datenbereich abgelegt ist.

Auch Ersatzduplikate anfertigen wird so machbar.
(ich weis jetzt nicht f. kleine Tinys, aber den selben Quellcode heute 
und in 1 Wo/nach reboot des Entwicklungsrechners/nach Compilerupdate 
ergibt durchaus unterschiedliche Prüfsummen d. Flashinhaltes)

Wenn solche Exemplarindividualdaten mehr werden als ins EEPROM passen, 
muss das FlashROM partitioniert werden und die Geschichte führt durchaus 
bald zu (Flash(ROM))tauglichen Dateisysteme.
Dieses Fass passt von der Größe eher nicht mehr zu ATtiny, erwähne ich 
also nur so als Ausblick, für die Welt in 32bit & co...
Gast #6147989
Lesenswert?

Hallo

ThomasW da brauchst du gar nicht zu analysieren:
So ist er einfach "unser" c-hater (und so ca. 5 andere forenbekannte 
"Spezialisten") - fachlich durchaus Ahnung, aber voll Vorurteile, 
Vorverurteilungen und im Besitz der Absoluten Wahrheit...
Gast #6147990
Lesenswert?

c-hater schrieb:
> Das Problem ist: offensichtlich zu faul.

Ich sehe das Problem eher da, dass man eine bestimmte Version bauen 
will, die bereits im Source Repository so gekennzeichnet ist. Nicht erst 
bauen (dabei als Seiteneffekt den Quelltext ändern) und dann die neue 
Versionsnummer einchecken.
Gast #6148013
Lesenswert?

Stefanus
>Man kann Arduino Sketche ohne IDE mit einer Batch-Datei compilieren und
>flashen:
>https://github.com/arduino/Arduino/blob/master/build/shared/manpage.adoc

Der Link von Stefanus sollte eigentlich schon ausreichen.
Man muss nur noch herausbekommen, wie man die "-D" Optionien die man 
überlicherweise beim GCC findet, in die Parameterliste mit aufnimmt.

( mit -D kann man in der Kommandozeile des GCC Definitionen anhängen, 
die im Programm dann wie #defines wirken ).
#6148806
Lesenswert?

Nic schrieb:

> In der Anwendung Arduino habe ich ein Programm erstellt, welches ich auf
> ATTINYs flashen möchte. An sich kein Problem, aber sehr
> arbeitsaufwendig, da ich 100 ATTINYs flashen möchte. Jeder ATTINY
> bekommt dabei eine individuelle I2C-Adresse und ID.

Im richtigen Leben definiert man sich eine struct{}, die alle 
exemplarspezifischen Konstanten sowie eine Prüfsumme (wichtig!) enthält.

Dann erstellt man im Linkerskript ein eigenes Segment, in das per 
#pragma oder __attribute__(section=...) nur diese struct plaziert wird.

Oder: Flash-Adresse definieren, per memcpy_P() direkt den Flash-Inhalt 
in die struct im RAM laden, und los gehts. Ist vielleicht einfacher, 
braucht aber extra RAM, was doof ist, wenn man nur 512 Bytes hat.

Jetzt kann man das Programm compilieren und ein Hexfile daraus machen.

Die Details dazu findest Du in der Gnu-Dokumentation.

Ich würde jetzt aus den hex mit objcopy oder hex2bin ein Binärfile 
machen, weil das einfacher zu bearbeiten ist. Wo Deine 
exemplarspezifischen Konstanten sind, weißt Du - das hast Du nämlich im 
Linkerskript festgelegt. Also ist es auch kein Problem, die Position im 
.bin zu finden, zu modifizieren und wieder ein flashbares .hex zu 
erzeugen.

Ich würde eine Prüfsumme in die struct aufnehmen, damit Du feststellen 
kannst, ob das geflashte Binery bereits passend konfiguriert ist.

Du könntest sogar erst das Programm und erst in einem zweiten Schritt 
die exemplarspezifischen Daten flashen. Dann sollten die Defaultwerte im 
Programm-Binary 0xff sein, damit Du diesen Bereich überprogrammieren 
kannst.

Und: Deine struct sollte im Flash an einer Page-Grenze beginnen. Du 
kannst das Flash nicht byteweise löschen und beschreiben, sondern immer 
nur ganze Pages. Steht alles im Datenblatt.

fchk
Gast #6148852
Lesenswert?

Nic schrieb:
> An sich kein Problem, aber sehr
> arbeitsaufwendig, da ich 100 ATTINYs flashen möchte. Jeder ATTINY
> bekommt dabei eine individuelle I2C-Adresse und ID.
> Sobald die richtige Adresse bei Arduino eingestellt ist, erzeuge ich mit
> Arduino eine HEX-Datei. Diese HEX-Datei öffne ich mit einem Flash-Tool,
> welches die ATTINYs dann letztendlich flasht.

Sehr aufwändig und man mag gar nicht an das nächste Firmware-Update 
denken.

Warum flasht du sie nicht alle auf eine Default-Adresse, die du irgendwo 
ins EEPROM schreibst?

Dann nimmst du einen zweiten Controller, dessen einzige Aufgabe es ist, 
auf dem Bus nach einem TINY mit Default-Adresse zu suchen. Sobald er 
einen findet, schiebt er ihm eine I2C-Adresse und eine ID zu und der 
ATTiny merkt sich beides für nächste Mal.

Die TINYs steckst du dann der Reihe nach kurz mal auf den 
ID-Vergabe-Controller und schickst ihnen ihre zugeordneten persönlichen 
Daten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren