Hallo, Ich versuche gerade Ulrich Radigs DMX-ARTNET-Interface www.ulrichradig.de/home/index.php/avr/dmx-avr-artnetnode nachzubauen. Ich möchte es auf einem STM32F429 zum laufen zu bringen. In der Berechnung der Checksumme im TCP-Stack gibt es ein Problem: Nach einigen Durchläufen wird in der ersten While-schleife der Funktion checksum() der Hard-Fault-Handler aufgerufen, ich kann mir nicht erklären wieso. Hat jemand eine Idee? Hat es was damit zu tun, das der Code von einem 8 Bit-Prozessor kommt? Hier die Funktion checksum()
1 | unsigned int checksum (unsigned char *pointer, unsigned int result16, unsigned long result32) |
2 | {
|
3 | unsigned int result16_1 = 0x0000; |
4 | unsigned char DataH; |
5 | unsigned char DataL; |
6 | |
7 | //Jetzt werden alle Packete in einer While Schleife addiert
|
8 | while(result16 > 1) |
9 | {
|
10 | //schreibt Inhalt Pointer nach DATAH danach inc Pointer
|
11 | DataH=*pointer++; |
12 | |
13 | //schreibt Inhalt Pointer nach DATAL danach inc Pointer
|
14 | DataL=*pointer++; |
15 | |
16 | //erzeugt Int aus Data L und Data H
|
17 | result16_1 = ((DataH << 8)+DataL); |
18 | //Addiert packet mit vorherigen
|
19 | result32 = result32 + result16_1; |
20 | //decrimiert Länge von TCP Headerschleife um 2
|
21 | result16 -=2; |
22 | }
|
23 | |
24 | //Ist der Wert result16 ungerade ist DataL = 0
|
25 | if(result16 > 0) |
26 | {
|
27 | //schreibt Inhalt Pointer nach DATAH danach inc Pointer
|
28 | DataH=*pointer; |
29 | //erzeugt Int aus Data L ist 0 (ist nicht in der Berechnung) und Data H
|
30 | result16_1 = (DataH << 8); |
31 | //Addiert packet mit vorherigen
|
32 | result32 = result32 + result16_1; |
33 | }
|
34 | |
35 | //Komplementbildung (addiert Long INT_H Byte mit Long INT L Byte)
|
36 | result32 = ((result32 & 0x0000FFFF)+ ((result32 & 0xFFFF0000) >> 16)); |
37 | result32 = ((result32 & 0x0000FFFF)+ ((result32 & 0xFFFF0000) >> 16)); |
38 | result16 =~(result32 & 0x0000FFFF); |
39 | |
40 | return (result16); |
41 | }
|