This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

6678核间触发出错怎么办



问题描述如下:两个核完成同一个任务的一半,中间需要同步。这里采用事件触发产生旗语的方式,下面是简化的程序:

Int main(Int argc, Char* argv[])
{
       semHandle = Semaphore_create(0,NULL,NULL);

}

void  task()

{

         if(MultiProc_self()==0)
                {
                         tskProcess();
                        Notify_sendEvent(dstProc, INTERRUPT_LINE, EVENTID, 0, TRUE);

                      System_printf("tsk1_func: Sent request #%d to %s\n", seq, MultiProc_getName(dstProc));

                     Semaphore_pend(semHandle, BIOS_WAIT_FOREVER);

                 System_printf("tsk1_func: Received request #%d from %s\n", seq, MultiProc_getName(recvProcId));

                 }
        if(MultiProc_self()==1)
          {
           Semaphore_pend(semHandle, BIOS_WAIT_FOREVER);
          System_printf("tsk1_func: Received request #%d from %s\n", seq,  MultiProc_getName(recvProcId));
          }

}

正常情况下,应该是核0完成 tskProcess()后触发事件并停止等待核1的回音,

核1只有接收事件后才能运行并返回一个事件。

但运行结果显示,核1一开始就运行了,好像Semaphore_pend(semHandle, BIOS_WAIT_FOREVER)这条语句不存在一样。

直接就被触发了,这是为什么呢?请指点。

  • 上面的代码并不能保证core0先获得信号量,所以在运行后有可能是core1先获取信号量,而core0处于一直等待信号量的过程。如果要保证core0先运行,需要软件同步两个核保证core0先获得,然后再释放给core1.

  • 可是我在创建semHandle时,使用 Semaphore_create(0,NULL,NULL);

    即初始信号量为0 ,core1不可能先运行,因为他第一句就是:  

    Semaphore_pend(semHandle, BIOS_WAIT_FOREVER);

    除非他得到core0发来的EVENT才能触发的