This commit is contained in:
Matthias Biermann
2025-02-16 16:21:44 +01:00
parent b221edf9f4
commit 28c434011b
+44 -7
View File
@@ -39,6 +39,16 @@ uint32_t calcCRC32(
int main(int argc, char** argv)
{
int testRuns;
char logFileName[100];
time_t now = time(NULL);
struct tm *t = localtime(&now);
strftime(logFileName, sizeof(logFileName)-1, "log_%Y-%m-%d_%H-%M-%S.txt", t);
FILE *logFile = fopen(logFileName, "w");
if (logFile == NULL) {
printf("Oeffnen/Erstellen der Logdatei fehlgeschlagen!\n\n");
}
if (argc < 2) {
testRuns = TEST_RUNS;
@@ -103,9 +113,9 @@ int main(int argc, char** argv)
uint32_t uio16PhysBase = 0x30000000; // UIO16 physical Baseaddress
uint32_t* pDataPhy = (uint32_t*) uio16PhysBase;
// Speicher fuer die Ergebnisse der CRC Berechnungen durch Hardware und Software
uint32_t crc_sw[MAX_NUMBER_PACKETS];
uint32_t crc_hw[MAX_NUMBER_PACKETS];
// Speicher fuer die Ergebnisse der CRC Berechnungen durch Hardware und Software
uint32_t crc_sw[MAX_NUMBER_PACKETS];
uint32_t crc_hw[MAX_NUMBER_PACKETS];
bool allTestrunsOK = true;
@@ -124,10 +134,13 @@ int main(int argc, char** argv)
// Ausgabe
printf("------------- Starten von Testdurchlauf %i -------------\n\n", TestRun);
fprintf(logFile, "------------- Starten von Testdurchlauf %i -------------\n\n", TestRun);
printf("Paketgroesse: %i\tPaketanzahl: %i\n\n", packet_size, number_packets);
fprintf(logFile, "Paketgroesse: %i\tPaketanzahl: %i\n\n", packet_size, number_packets);
// Testdaten erzeugen
printf("Testdaten erzeugen\n\n");
fprintf(logFile, "Testdaten erzeugen\n\n");
for (int packet = 0; packet < number_packets; packet++) {
for (int word = 0; word < packet_size; word++) {
data[packet][word] = (uint32_t) rand();
@@ -149,10 +162,12 @@ int main(int argc, char** argv)
// CRC Berechnung mit Hardware starten
printf("CRC-Berechnung in Hardware starten\n\n");
fprintf(logFile, "CRC-Berechnung in Hardware starten\n\n");
CRC->Control |= (1<<0);
// CRC Berechnung in Software durchfuehren
printf("CRC-Berechnung in Software durchfuehren\n\n");
fprintf(logFile, "CRC-Berechnung in Software durchfuehren\n\n");
for (int p = 0; p < number_packets; p++) {
crc_sw[p] = calcCRC32((uint8_t*) (&data[p][0]),
packet_size*4,
@@ -164,49 +179,56 @@ int main(int argc, char** argv)
);
// printf("Packet %i:\t0x%08x\n", p, crc_sw[p]);
// fprintf(logFile, "Packet %i:\t0x%08x\n", p, crc_sw[p]);
}
// Auf INT warten
printf("Auf Interrupt warten...\n");
fprintf(logFile, "Auf Interrupt warten...\n");
int pending;
read(fdCRC, (void*) &pending, 4);
CRC->InterruptStatus = 0;
write(fdCRC, (void*) &reenable, 4);
printf("Interrupt erhalten\n");
fprintf(logFile, "Interrupt erhalten\n");
// Hardwareergebnis in Array ablegen
for (int p = 0; p < number_packets; p++) {
crc_hw[p] = DataDest[p][packet_size];
}
#ifdef DEBUG
// data und DataDest komplett ausgeben
printf("\ndata\tDataDest:\n");
fprintf(logFile, "\ndata\tDataDest:\n");
for (int p = 0; p < number_packets; p++) {
for (int w = 0; w < packet_size+1; w++) {
// dataDest ausgeben
if (w < packet_size) {
printf("0x%08x: 0x%08x\t0x%08x: 0x%08x\n", &DataDest[p][w], DataDest[p][w], &data[p][w], data[p][w]);
fprintf(logFile, "0x%08x: 0x%08x\t0x%08x: 0x%08x\n", &DataDest[p][w], DataDest[p][w], &data[p][w], data[p][w]);
} else {
printf("0x%08x: 0x%08x\n", &DataDest[p][w], DataDest[p][w]);
fprintf(logFile, "0x%08x: 0x%08x\n", &DataDest[p][w], DataDest[p][w]);
}
}
}
printf("\n\n");
fprintf(logFile, "\n\n");
#endif
// Daten und Ergebnisse vergleichen
unsigned int wrongWords = 0; // Zaehler fuer Anzahl der fehlerhaften Worte im (Ziel-)Speicher
printf("Daten und Ergebnisse vergleichen\n\n");
fprintf(logFile, "Daten und Ergebnisse vergleichen\n\n");
bool allPaketsOK = true;
for (int p = 0; p < number_packets; p++) {
bool dataOK = true;
bool crcOK = true;
printf("Paket %i:\t", p);
fprintf(logFile, "Paket %i:\t", p);
for (int w = 0; w < packet_size; w++) {
// Daten vergleichen
@@ -214,21 +236,30 @@ int main(int argc, char** argv)
dataOK = false;
wrongWords++;
printf("Fehler bei Datenwort %i\t", w);
fprintf(logFile, "Fehler bei Datenwort %i\t", w);
}
}
if (dataOK) {printf("Daten OK\t");}
if (dataOK) {
printf("Daten OK\t");
fprintf(logFile, "Daten OK\t");
}
// CRC Ergebnis vergleichen
if (crc_hw[p] != crc_sw[p]) {
crcOK = false;
wrongWords++;
printf("Fehler bei CRC\t");
fprintf(logFile, "Fehler bei CRC\t");
}
if (crcOK) {printf("CRC OK\t");}
if (crcOK) {
printf("CRC OK\t");
fprintf(logFile, "CRC OK\t");
}
printf("CRC: 0x%08x\n", crc_hw[p]);
fprintf(logFile, "CRC: 0x%08x\n", crc_hw[p]);
if (!(crcOK && dataOK)) {
allPaketsOK = false;
@@ -237,20 +268,26 @@ int main(int argc, char** argv)
if (allPaketsOK) {
printf("Alle Pakete OK\nTestdurchlauf erfolgreich abgeschlossen!\n\n");
fprintf(logFile, "Alle Pakete OK\nTestdurchlauf erfolgreich abgeschlossen!\n\n");
} else {
allTestrunsOK = false;
printf("Ein oder mehrere Pakete nicht OK.\n");
fprintf(logFile, "Ein oder mehrere Pakete nicht OK.\n");
double percentageWrong = (double) wrongWords / (number_packets*packet_size + number_packets);
printf("%f Prozent der geschriebenen Worte sind fehlerhaft!\n\n", percentageWrong);
fprintf(logFile, "%f Prozent der geschriebenen Worte sind fehlerhaft!\n\n", percentageWrong);
}
}
if (allTestrunsOK) {
printf("Alle Testdurchlaeufe erfolgreich abgeschlossen!\n");
fprintf(logFile, "Alle Testdurchlaeufe erfolgreich abgeschlossen!\n");
} else {
printf("Ein oder mehrere Testdurchlaufe sind fehlerhaft!\n");
fprintf(logFile, "Ein oder mehrere Testdurchlaufe sind fehlerhaft!\n");
}
fclose(logFile);
return 0;
}