Ich habe ein einfaches Programm geschrieben, das Daten von einem 2D-Array von einem Modul zu einem anderen Modul sendet, aber es scheint nicht zu funktionieren, und ich bin mir nicht sicher, warum. Hier ist mein Code:SC_FIFO schreiben: Erste Chance Ausnahme
Server.h
#include <iostream>
#include "stdafx.h"
using namespace std;
SC_MODULE(Server){
sc_in <bool> clock;
sc_fifo_out <sc_uint<20> > writePath;
bool init_flag;
int numRobots;
void Server_Main();
SC_CTOR(Server){
init_flag = 0;
numRobots = 4;
SC_METHOD(Server_Main){ sensitive << clock.pos(); }
}
};
Server.cpp
#include "stdafx.h"
#include "Server.h"
void Server::Server_Main(){
if (init_flag == 0){
int robotPath[4][5] = {
{ 1, 2, 3, 4, 1 },
{ 2, 1, 6, 3, 4 },
{ 3, 2, 9, 5, 1 },
{ 4, 1, 6, 8, 7 }
};
//Write robot path to Sensor
for (int i = 0; i < numRobots; i++){
for (int j = 0; j < 5; j++){
cout << "SERVER MODULE: Write Robot Paths " << i << ": " << robotPath[i][j] << endl;
writePath.write(robotPath[i][j]);
}
}
init_flag = 1;
}
else{ sc_stop(); }
}
Sensor.h
#include <iostream>
#include "stdafx.h"
using namespace std;
SC_MODULE(Sensor){
//sc_in <bool> clock;
sc_fifo_in <sc_uint<20> > readPath;
int robotPath[4][5];
void loadPath();
//void Sensor_Main();
SC_CTOR(Sensor){
//SC_METHOD(Sensor_Main){ sensitive << clock.pos(); }
SC_THREAD(loadPath){}
}
};
Sensor.cpp
#include "stdafx.h"
#include "Sensor.h"
void Sensor::loadPath(){
int i = 0;
int j = 0;
while (1){
robotPath[i][j] = readPath.read();
cout << "SENSOR MODULE: Read Robot " << i << " Path " << j << " : " << robotPath[i][j] << endl;
if (j == 4){
j = 0; //Set index to beginning of array
i++; //Move to next robot
}
else{ j++; } //Continue loading path for current robot
}
}
Main.cpp
#include "stdafx.h"
#include <iostream>
#include "Sensor.h"
#include "Server.h"
using namespace std;
int sc_main(int argc, char* argv[])
{
sc_clock clock("sysclock", 50, SC_MS, .5);
sc_fifo <sc_uint<20> > robotPath;
Sensor sensor_mod("Sensor");
sensor_mod.readPath(robotPath);
Server server_mod("Server");
server_mod.clock(clock);
server_mod.writePath(robotPath);
sc_start();
return 0;
}
Hier ist, was meine Ausgabe wie folgt aussieht:
Hier ist der Fehler, den ich von VS2013 erhalten:
Das Programm eine Ausnahme zu werfen scheint, wenn Es versucht robotPath[3][1]
in den Fifo zu schreiben, aber ich bin mir nicht sicher warum. Ich habe meine Fifo-Größe auf 20 eingestellt, so dass sie 20 Werte gleichzeitig speichern kann, aber ich sende nicht mehr als 20 Werte und diese Ausnahme passiert, wenn ich versuche, den 17. Wert zu schreiben, so dass ich die Verwendung von sc_fifo_out
falsch verstehe. Es könnte ein offensichtlicher Fehler sein, den ich übersehe, aber an diesem Punkt bin ich irgendwie ausgebrannt und ich kann nicht herausfinden, was es ist, wenn ich mich versehe.
Jede Hilfe wird geschätzt, danke.
Wenn Sie sagen, dass die Konvertierung von SC_METHOD zu SC_THREAD das Verhalten ungültig machen würde, was meinst du? Wenn ich einen Thread schreiben und einen anderen Thread lesen, aber nur lesen möchte, nachdem ich 20 Beispiele für den Fifo geschrieben habe, würde ich dieses Verhalten nicht brauchen? – Javia1492
@ Javia1492 Wenn Sie dieses Verhalten haben müssen, dass sobald das Fifo mit 20 Beispielen geschrieben wird und dann die Ausführung von Sensor :: loadPath() [thread] auslöst, dann müssen Sie in statische und dynamische Empfindlichkeit der SystemC-Spezifikationen schauen . – AmeyaVS