Jump to content
rfajardo

DCAST exception for SC_THREAD call in constructor VS2012-W8

Recommended Posts

Hello everyone,

I have successfuly compiled SystemC-2.3.0 under VS2012.

Compilation:

For a system description and compilation, I had to enable static linking the following way, aside from configuring the include and library directories and the library name.

Properties->configuration properties->C/C++->Code Generation

Runtime Library set to Multi-threaded Debug (\MTd)

After that, I was able to compile the simulation project.

Execution:

During execution, Windows throws an exception for the DCAST of line 359 on sc_thread_process.cpp. This is executed by the call to SC_THREAD(run) in the "CPU" constructor. The related code can be found enclosed.

Console output:

Error: (E549) uncaught exception: Access violation - no RTTI data!

In file: c:\users\raul\documents\visual studio 2012\projects\systemc-2.3.0\src\sysc\kernel\sc_except.cpp:98

Visual Studio output:

First-chance exception at 0x0135EF3F in coprocessor_func.exe: 0xC0000005: Access violation reading location 0x00000005.

First-chance exception at 0x74D54B32 in coprocessor_func.exe: Microsoft C++ exception: std::__non_rtti_object at memory location 0x007EF570.

First-chance exception at 0x74D54B32 in coprocessor_func.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.

First-chance exception at 0x74D54B32 in coprocessor_func.exe: Microsoft C++ exception: sc_core::sc_report at memory location 0x007EE304.

The program '[4260] coprocessor_func.exe' has exited with code 1 (0x1).

Could this be related to the issue that dynamic cast should not be called from within a constructor because the object is not yet fully built?

References:

Under item 6:

http://en.cppreferen...ge/dynamic_cast

This is an example that I am using without issues under Linux. Any ideas of what can be going wrong?

Thanks in advance,

Raul Fajardo

Code:

#include <systemc.h>

#include <iostream>

using namespace std;

class CoProcessor

{

sc_time m_process_time;

public:

CoProcessor()

{

m_process_time = sc_time(20, SC_US);

}

unsigned int sum(unsigned int a, unsigned int B)

{

unsigned int tmp = a + b;

wait(m_process_time);

return tmp;

}

};

class CPU : public sc_module

{

CoProcessor co_cpu;

public:

SC_HAS_PROCESS(CPU); //enables the definition of SC_THREAD or SC_METHOD (SC_METHOD has sensitivity and never ends)

CPU(sc_module_name nm) : sc_module(nm)

{

SC_THREAD(run); //registers the function to the simulation kernel, enables wait()

}

void run()

{

unsigned int a, b, c;

b = 10;

c = 5;

a = co_cpu.sum(b, c);

cout << "Computation result of " << b << " + " << c << ": " << a << endl;

cout << "Algorithm was run in " << sc_time_stamp() << endl;

}

};

int sc_main(int argc, char * argv[])

{

CPU processor("main_processor");

sc_start(500, SC_US); //simulate for 500 microseconds

return 0;

}

Share this post


Link to post
Share on other sites

Make sure you have the RTTI-information enabled in your VC++ project and that the /vmg switch is added to your compiler settings.

See INSTALL file in the SystemC package:

6. From the C/C++ tab, select the Language properties and set

'Enable Run-Time Type Info' to Yes

7. From the C/C++ tab, select the Command Line properties and add /vmg

to the 'Additional Options:' box.

Greetings from Oldenburg,

Philipp

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×