This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

RTX kernel. Task always sleeps

Hi all,
I am porting RTX on LH7A404. Now SWI and Clock interrupt worked well. I used the example1 as test program. The code is below.

As you can see in the code, there are two tasks for testing basic function of the OS. I use counter to check the state of the task. "task1cnt" is used to check task1 state and "task2cnt" to task2. When I run the program. I always get the result, task1cnt=0 task2cnt=1. Os is always in the idle task.

I tried to trace the condition more deeply. I found that context_switch always select task2 as next run task. But when task2 occupies the OS, it resumes the previous session and executed the os_block. At this time, os did the next context-switch immediately and task2 almost did nothing. So I think this is why my test program is blocked.

Is there anyone help me? how can I do? Give me some hints about this problem.

#include "RTL.h"
OS_TID id1, id2;

void task1 (void) __task;
void task2 (void) __task;



void task1 (void) __task {
//      EnableARMIRQ();
  /* Obtain own system task identification number */
  static int task1cnt=0;
  id1 = os_tsk_self ();
  /* Assign system identification number of task2 to id2 */
  id2 = os_tsk_create (task2, 1);
  for (;;) {    /* do-this */
    /* Indicate to task2 completion of do-this */
    os_evt_set (0x0004, id2);
    /* Wait for completion of do-that (0xffff means no time-out)*/
    os_evt_wait_or (0x0004, 0xffff);
    task1cnt++;
    /* Wait now for 50 ms */
    os_dly_wait (5);
  }
}


void task2 (void) __task {
        static int task2cnt=0;
  for (;;) {
    /* Wait for completion of do-this (0xffff means no time-out) */
    os_evt_wait_or (0x0004, 0xffff); /* do-that */
    task2cnt++;
    /* Pause for 20 ms until signaling event to task1 */
    os_dly_wait (2);
    /* Indicate to task1 completion of do-that */
    os_evt_set (0x0004, id1);
  }
}
int main (void) {

  os_sys_init (task1);
}