Página 1 de 1

Task travando no RTX Keil uVision4

MensagemEnviado: 06 Mar 2012 15:41
por btpavao
Eae Galera, blz?

Tenho o seguinte cenário: 2 tasks rodando, ambas com a mesma prioridade e em cada uma delas eu seto um flag para a outra ser executada, além disso em uma eu monto um mailbox(mb) e na outra eu leio e exibo os dados do MB no LCD, porém em um dado momento as tasks travam. Debugando percebi que o que acontece é que a task os_idle_demon por algum motivo sai de Running para Ready e uma das task faz o mesmo, com isso a task que estava em Wait_OR fica travada esperando o flag que nunca vem! Abaixo o que eu tenho nas Tasks...

Código: Selecionar todos
__task void task1 (void)
{
   Entradas *mptr;

    id1 = os_tsk_self();

   id2 = os_tsk_create(task2,1);

   for(;;)
   {
      os_mbx_init(MsgBox,sizeof(MsgBox));

      mptr = _alloc_box (mpool);         
        mptr->Frequencia = usFrequencia;     
        mptr->CicloTrabalho = usCicloTrabalho;
      mptr->Periodo = usPeriodo;
        os_mbx_send (MsgBox, mptr, 0xFFFF);

      if(GPIO_ReadInputDataBit(GPIOC, PINO_Bico)) Bico(0)
      else                              Bico(1);
      
      os_evt_set(0x0004, id2);

      os_evt_wait_or(0x0004, 0xFFFF);
      
      os_dly_wait(50);
   }
}


Código: Selecionar todos
__task void task2 (void)
{
   Entradas *rptr;

   LCD_RW(0);
   vInicializaLCD();
   vLimpaLCD();   

   for(;;)
   {
      os_evt_wait_or(0x0004, 0xFFFF);
      
        os_dly_wait(50);

      if(GPIO_ReadInputDataBit(GPIOC, PINO_Bobina))   Bobina(0)
      else                                 Bobina(1);
      
      if(os_mbx_wait (MsgBox, (void **)&rptr, 0xFFFF) == OS_R_OK )
      {
         sprintf(&cLCD1[0], "%4d RPM\0", rptr->Frequencia);
         vPosCursorLCD(0,0);
         vEscreveFraseLCD(cLCD1);
      }

      _free_box (mpool, rptr); 

      os_evt_set(0x0004, id1);
   }
}


Nesse arquivo tem as 2 fotos do debug, uma o FW rodando e outra com ele travado.

http://dl.dropbox.com/u/3463690/Debug.rar

Alguma ideia?

Valeu!

[b]Bruno Pavão[/b}

MensagemEnviado: 06 Mar 2012 16:17
por chrdcv
DeadLock. Use um semáforo binário ou um mutex, e verifique se as tasks não esperam por um recurso que uma delas nunca irá liberar pq. espera algo das outras tasks que não liberaram o recurso enquanto a outra não liberar primeiro (um grafo orientado cíclico).

MensagemEnviado: 06 Mar 2012 23:01
por barboza
não analisei no detalhe, mas veja se não é problema com variavel local definida na task.

Código: Selecionar todos
Entradas *rptr;


tenta com static:

Código: Selecionar todos
static Entradas *rptr;

MensagemEnviado: 07 Mar 2012 22:49
por btpavao
Debugando descobri que a task2 estava dando overflow, aí aumentei o tamanho do stack (dobrei de 50 para 100) e funfou de boas.

Valeu Galera!