Task travando no RTX Keil uVision4

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Task travando no RTX Keil uVision4

Mensagempor btpavao » 06 Mar 2012 15:41

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}
btpavao
Bit
 
Mensagens: 37
Registrado em: 18 Set 2009 13:46

Mensagempor chrdcv » 06 Mar 2012 16:17

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).
Avatar do usuário
chrdcv
Dword
 
Mensagens: 1580
Registrado em: 13 Out 2006 14:13

Mensagempor barboza » 06 Mar 2012 23:01

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;
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor btpavao » 07 Mar 2012 22:49

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!
btpavao
Bit
 
Mensagens: 37
Registrado em: 18 Set 2009 13:46


Voltar para ARM

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x