Hello,
I created an object in my linux-application. Now I want to call
memberfunctions of this object from RT-Threads. I included the files from
the examples/cpp directory, defined a pointer on the object an did this
__do_global_ctors thing. From the linux application I start the
RT-Thread like in the examples/frank example and hand the pointer to
the object down through a FIFO. The RT-Thread then calls
the function (ptr_b -> calculate()), incrementing the object variable. 
Meanwhile, my application just counts to 10^9 doing nothing else,  and I
can watch the thread counting (it sends the actual value to console). 
THIS ALL WORKS FINE!
Now I tried to also print the actual value in my linux-application, while
the thread runs. AND THEN: the thread suddenly stops running (at
different points: once it counts to 7, to 15, to 8 ...). The variable
is not incremented any more.

Here are some cutouts (which I hope are important ...) from my programs:
[CObjekt.cpp] 
CObjekt::CObjekt() { a=1; b=1; }
CObjekt::~CObjekt() {}
void CObjekt::calculate(void) { a += b; }
int CObjekt::show(void) { return a; }

[rt_app.cpp] RTLinux module
 
CObjekt* ptr_b; 
pthread_t thread;
 
void * huelle (void* arg) {
  struct sched_param p;
  int a;
 
  p.sched_priority = 1;
  pthread_setschedparam (pthread_self(), SCHED_FIFO, &p);
  while (1) {
    pthread_wait_np (); 
    ptr_b -> calculate();
    a = ptr_b -> show();
    rtl_printf("Result: %d\n", a);
  }
  return 0; 
}
 
int command_handler(unsigned int fifo) {
  struct my_msg_struct msg;
  int err;
 
  while ((err = rtf_get(1, &msg, sizeof(msg))) == sizeof(msg)) {
    switch (msg.command) {
    case START_TASK:
      ptr_b = msg.data;
      pthread_make_periodic_np(thread, gethrtime(),100000000);
      break;
    case STOP_TASK:
      pthread_suspend_np(thread);
      break;
    }
  }
  return 0;
} 
[init_module omitted]
[cleanup omitted]

main_app.cpp //linux application 
int main(void) {
  CObjekt * ptr_a = new CObjekt; // Objekt instanciated
  int fd0;
  struct my_msg_struct msg;
  int i;
 
  if ((fd0 = open("/dev/rtf1", O_WRONLY)) < 0 ) {
    exit(1);
  }
  msg.command = START_TASK;
  msg.data = ptr_a;
  if (write(fd0, &msg, sizeof(msg)) < 0) {
  }
  for (i=0; i<=1000000000; i++) {       // if I leave this block empty 
    if ( (i%1000000) == 0) {            // all is ok
      cout << ptr_a -> show() << "\n"; // if I access the variable
    }                                   // thread hangs up
  }
  msg.command = STOP_TASK;
  if (write(fd0, &msg, sizeof(msg)) < 0) {
  }
  fprintf(stdout,"Value: %d\n", ptr_a->show());
  delete ptr_a;
  return close(fd0);
}    

I'd appreciate any help, comments, etc. since I'm new to all of this.
---
Dirk Pohl
University of Kaiserslautern



-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
---
For more information on Real-Time Linux see:
http://www.rtlinux.org/rtlinux/

Reply via email to