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}