Am Samstag, den 24.09.2016, 10:09 +0200 schrieb Uwe Kleine-König: … > Ich kenne mich mit dem openssl-Krams auch nicht so aus, aber ich bin > neulich einem anderen Problem begegnet, das durchaus komplexer ist, als > ursprünglich vermutet. Wenn Du Dich daran versuchen willst: > > Es geht darum ein Rechteck-Signal mit x HZ abzutasten. Die > Abtasthardware hat eine Eingangsclock von y Hz und einen Divider um eine > Frequenz einzustellen, mit der man möglichst gut das gegebene Signal > abtasten kann. Dieser Divider wird über zwei Bitfelder eingestellt: A > ist 16 Bit breit und B ist 3 Bit breit. > Die Frequenz, die die Hardware verwendet ist: > > y / (16 * (A + B / 8)) > > . Aufgabe ist, ein C-Programm ohne Gleitkomma-Arithmetik zu schreiben, > das für gegebenes x und y die idealen A und B ermittelt. > > Wenn Du (oder auch wer anders) einen Lösungsvorschlag hast: schickt ihn > gerne an die Liste, ich suche dann Fehler :-) > Selbst, wenn Du es auf Anhieb richtig hinbekommst, stelle ich mir vor, > dass Du nachher verstehst, wie solche Fehler zustande kommen. Wenn wir nur A betrachten, wird es mit 16 multipliziert. B wird zuerst mit 8 dividiert und dann mit 16 multipliziert. Ergibt das selbe wie gleich mit 2 mutiplizieren. So betrachtet ist der Teiler 20 Bit breit wobei nur gerade Zahlen zulässig sind. Teiler = (A << 4) + (B << 1) Ergibt: AAAA AAAA AAAA AAAA BBB0 16 Bit | 3 Bit + 1 Füllbit C-Code: uint32_t divisor = ((A << 4) | ((B << 1) & 0x0f) & 0x000fffff); Ich vermute dieses Beispiel basiert auf einen Microcontroller der nur 16 Bit breit arbeiten kann. Das bedeutet, du berechnest den Teiler und musst deisen dann als 16 Bit und 8 Bit zurück schreiben. Nach dem berechnen des Teilers bekommst du die 2 Teile mit: if (divisor & 0x000fffff) { fprintf(stderr, "divisor too big!\n"); return 1; } A = ((divisor >> 4) & 0xffff); B = ((divisor >> 1) & 0x07); Nun kannst du A und B in die zugehörigen Register schreiben. -- mfG Sascha Wir haben nichts darwider, was der andre von sich hält, wenn er nur von uns noch mehr hält. -- Jean Paul
Attachment:
signature.asc
Description: This is a digitally signed message part