Jump to content

DCAST exception for SC_THREAD call in constructor VS2012-W8


rfajardo

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;

}

Link to comment
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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...