Hallo Zusammen, Ich habe hier 3x STM32L443CB Nucleo rumliegen und 2x STM32L443CB als Ic auf eigener Prototypenschaltung verlötet. Es gibt im Controller eine 96bit (12byte) Unique ID. Da ich für Statistikzwecke eine ID benötige welche maximal 4 byte gross ist, suche ich nach einer Lösung um die UID vom STM32 zu shrinken. Die ID besteht aus folgenden Bytes: Byte 0-3 : X-Y Position des Die auf dem Wafer Byte 4: Wafer-Numer Byte 5-11: Lot-Nummer Anbei ein Screenshot meiner Auswertung der Controller. MCU 1 und 2 kommen von Mouser, MCU3-5 sind Nucleos. Was ins Auge sticht ist, das die Lot-Number jeweils die selbe ist, was auch in gewissem Masse logisch ist, da die IC wohl von der selben Serie kommen. Auch ist relativ aufällig das Byte 1 und 3 immer 0 sind, das ist natürlich bei nur 5 IC's auch gut möglich das es sich um einen Zufall handelt. Das jedoch ein einzelner Wafer 65535 x 65535 Die's beinhaltet ist auch sehr unwarscheilich, weshalb ich annehme das es nur 255x255 sein werden, und die Bit nur als Platzhalter dort sind. Auf einem Wafer für den STM32L433 gibt es sicher weniger Die's als für ein Modell mit nur wenig Funktionen & Pins. Meine Implementation für einen Shrink der ID hätte ich aktuell so vorgestellt: CRC16 aus Byte 0..4 errechnen CRC16 aus Byte 4..11 errechnen aus den 2x2 byte einen fiktiven uint_32 zusammensetzen also CRC1 | CRC2<<16 In einer Serienproduktion von Platinen, ist zudem davon auszugehen das die Lot Nummer wohl pro Serie zu grossen Teilen gleich ist, somit ist es sehr schwer ein Duplikat zu in der Lot-Nummer zu erhalten. Was haltet ihr von der Idee? Hat jemand vielleicht schon etwas ähnliches Realisiert? Möchte mir jemand allenfalls noch weitere UID's zusenden, um nach einem Muster zu suchen?
Gast
#5976473
Johnny S. schrieb: > Es gibt im Controller eine 96bit (12byte) Unique ID. Da ich für > Statistikzwecke eine ID benötige welche maximal 4 byte gross ist, suche > ich nach einer Lösung um die UID vom STM32 zu shrinken. Je nach verwendetem Verfahren kann es bei einer Reduktion von 12 auf 4 Byte passieren, dass IDs doppelt auftreten. Wenn dich diese Restwahrscheinlich für Mehrfachvergabe nicht stört, kannst du einen Hash-Wert berechnen und als ID verwenden. Andernfalls brauchst du eine verlustfreie Kompression, was fetailierte Kenntnisse über die Struktur der Unique ID und/oder deiner Stichprobe voraus setzt.
Gast
#5976661
Ich verwende diesen code für UID, SID und RNG.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
Johnny S. schrieb: > Meine Implementation für einen Shrink der ID hätte ich aktuell so > vorgestellt: > > CRC16 aus Byte 0..4 errechnen > CRC16 aus Byte 4..11 errechnen > > aus den 2x2 byte einen fiktiven uint_32 zusammensetzen also CRC1 | > CRC2<<16 Und wieso benutzt Du nicht die interne CRC calculation unit?
Gast
#5976754
chris schrieb: > init_uid() { > uint64_t a,b,c; uint8_t i; uint16_t w; > a=build64(*uniq_id_3,*uniq_id_2); > b=build64(*uniq_id_1,*uniq_id_3); (...) > for(w=0xff-i;w--;) { xorshift64(&rng); sid+=xorshift(&c)<<(17+(++j&7); > sid^=xorshift(&c)>>15; } > } Für den Code würdest du bei uns sofort eine Abmahnung kassieren.
Mehmet K. schrieb: > Johnny S. schrieb: >> Meine Implementation für einen Shrink der ID hätte ich aktuell so >> vorgestellt: >> >> CRC16 aus Byte 0..4 errechnen >> CRC16 aus Byte 4..11 errechnen >> >> aus den 2x2 byte einen fiktiven uint_32 zusammensetzen also CRC1 | >> CRC2<<16 > > Und wieso benutzt Du nicht die interne CRC calculation unit? Es geht ja nicht darum wie der CRC berechnet wird, also mit welcher Logik, sondern um die Art Ich hatte vor mit der internen CRC die beiden CRCs zu rechnen und dann zusammenzusetzen
Gast
#5976803
Byte 0-4 ist schwach da dies xy coordinates sind. 16 bit aber bei der Die Größe sind dies nur 2 byte. Nimm 8-11 und jeweils 0-3, 4-7
cdef schrieb: > Für den Code würdest du bei uns sofort eine Abmahnung kassieren. Bei uns würde da schon ein eiskalter Wind durch den Arbeitsvertrag wehen!
Gast
#5977052
Mw E. schrieb: > cdef schrieb: >> Für den Code würdest du bei uns sofort eine Abmahnung kassieren. > > Bei uns würde da schon ein eiskalter Wind durch den Arbeitsvertrag > wehen! Gegen eiskalten Wind hilft ein dickes Fell ;-)
Gast
#5977206
Man muss sehr auf Kollisionen aufpassen, z.B. die oft propagierte methode von MD5 oder SHA1 ist in der Praxis unbrauchbar, da auf 32bit reduziert extrem viele gleiche Nummern auftreten. Ich verwende mehrere LFR welches uid relative einfach und sid sowie rng aufwändiger generiert. RNG wird nur intern sowie für Bootloader/Auth/Freischalungscodes benutzt. Danach wird es mit rng=build64(xorshift(rng),TID) ersetzt. TID ist eine UnixTime Konstante welche bei jedem release geändert wird und dient auch im EEprom zum Check ob dies Initialisiert ist usw.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
Anbei noch das Bild, was beim ersten Post vergessen wurde. Ich habe mir folgende Gedanken zu den Nummern gemacht: Lotnummer: Die Lotnummer wird in der Serienproduktion vermutlich den grössten Teil gleich sein, beziehungsweise es wird pro Produktionsserie nur 2-3 verschiedene Lots geben. Es ist stark anzunehmen das auf einenm Reel jeweils die selbe Lot-Nummer vorhanden ist, es macht ja keinen Sinn x-Lots zu mischen. Somit sind die Bytes 5-11 relativ wenig unterschiedlich. Selbst wenn man 20 verschiedene Lots kaufen würde, wäre das sicher viel. Die Bytes 0-4 ändern jedoch stark, kombiniert mit der wenig ändernden Lots, gäbe dies eine Relativ einfache ID. In meinem Fall reden wir vielleicht von insgesamt rund 25'000 Endprodukten, somit auch nicht die allergrösste Menge. Klar, wenn man nun z.b. 1 Million Endgeräte über einige Jahre baut steigt die Kollisionsgefahr. Zusätzlich kommt bei mir noch dazu, das pro "Anlage" nur 500-1000 Geräte verbaut sind. Zwei identische Nummern wären solange Egal, solange sie nicht in der gleichen Anlage im Einsatz sind, da Sie ja "nichts von einander Wissen" Die Anforderung ist folgende: Eine Unique 32bit ID zum einfügen von datensätzen in eine Datenbank, ist die ID gleich wie ein bestehnder Eintrag, soll statt "Insert" nur ein "Update" passieren. Es besteht keine Notwendigkeit von der generierten ID irgendwelche Rückschlüsse auf die tatsächliche ID zu machen. Früher wurde sowas mit "Silicon Serial Number" gemacht. Das würde ich mir aber gern sparen. Bei einer anderen Lösung wurde jeweils das EEPROM eines Mikrocontrollers beim Laden der Firmware mit einem aktuellen Zeitstempel bebrannt. Da der STM32L433 aber kein EEPROM hat, geht das hier nicht.
Wenn es um ganze Baugruppen geht, wäre eventuell der Einsatz eines externen ICs passender. Mit dem könntes du garantieren, dass es keine Kollisionen gibt.
Gast
#5977716
Wenn es darum geht, wandel die 16bit bcd in 8bit signed int um. WAF ist
1-25,
da reichen dann 5 bits, bleiben 11 bits frei für die LOT.
Beispiel:
uint32_t make_uid() {
#define HASH_MULTIPLIER 36 // can be 1 too for intel type checksum
uint8_t i,j; uint16_t w; uint32_t res;
w=((uint16_t*)uniq_id_1)[0]; j=w; if(w&0x8000) j|=0x80; else j&=~0x80;
i=j; // X and Y Position, int8_t format. i==X, j==Y;
w=((uint16_t*)uniq_id_1)[1]; j=w; if(w&0x8000) j|=0x80; else j&=~0x80;
res=i<<24|j<<16; w=j=*uniq_id_2; res|=j<<11; // store X,Y,WAF
// build LOT id, start with WAF id, then xor all bytes, then hash it.
for(i=1;i<4;i++) { j=*uniq_id_2>>(i<<3); w^=j; }
for(i=0;i<4;i++) { j=*uniq_id_3>>(i<<3); w^=j; }
for(i=1;i<4;i++) { j=*uniq_id_2>>(i<<3); w*=HASH_MULTIPLIER; W+=j; }
for(i=0;i<4;i++) { j=*uniq_id_3>>(i<<3); w*=HASH_MULTIPLIER; W+=j; }
w&=0x7ff; res|=w; return res; // FORMAT MSB-LSB:
X(8)Y(8)WAF(5)LOT_HASH(11);
}
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
