-
Notifications
You must be signed in to change notification settings - Fork 4
Bug EPS - avoid_infinit_loops() #13
Description
Describe the bug
Existe uma função no EPS chamada avoid_infinit_loops() em que ela é usada para determinar um tempo fixo para ficar dentro de loops, isso para evitar que loops infinitos ocorram caso aconteça algum bug. Está função tem o seguinte comportamento:
uint8_t avoid_infinit_loops(void)
{
return (TA2CCTL0 & CCIFG);
}
void config_avoid_infinit_loops(uint16_t i)
{
TA2CCR0 = i;
TA2CCTL0 &= ~CCIFG;
}
onde é usada o TIMER2 como referencia de tempo no modo em que conta continuamente até o valor especificado no registrador "TA2CCR0", quando o contador chegar no valor deste registrador, a contagem volta para zero (continuando a contagem), e é setado a flag CCIFG. A flag é usada para sair do while quando é setada. Resumindo, a função config_avoid_infinit_loops(i) vai antes de cada loop, e configura o tempo que vai ficar dentro do loop. e a função avoid_infinit_loops() vai dentro da condição do while e retorna um estado lógico, para sair do while caso a flag seja setada. um exemplo no programa:
config_avoid_infinit_loops(1000);
while((BAKCTL & LOCKBAK) && !avoid_infinit_loops())
BAKCTL &= ~(LOCKBAK);
Inicialmente a função avoid_infinit_loops() retorna 0, onde é invertida na condição do while. Quando a flag é setada por chegar no tempo, a função retorna 1, como está invertido, a condição vai ser "falsa" e vai sair do while.
Porém a partir do momento que o TIMERA2 foi configurado, o contador começou a contar, e quando ele chegar na função config_avoid_infinit_loops(time) para determinar quanto tempo ele vai ficar dentro do while, o contador já vai ter contado para um valor arbitrario, e já vai estar com algum valor. Isso quer dizer que a contagem não irá ser de [0,valor] vai ser de [valor_atual_contador, valor], e isso não foi levado em consideração na hora de projetar isso. Foi levado em consideração que antes de chagar no while o valor do contador é 0. Então o tempo estipulado para cada while, n vai estar correto.
Problemas que podem acontecer são os de que por não termos uma referencia de tempo inicial fixa, o tempo que ele fica no while pode não ser o que foi estipulado, e ficar um tempo menor, fazendo com que nem tudo que deveria ser executado no while, seja executado.
Outro problema: O timer é configurado depois de varios outros códigos, por exemplo o clock.c é executado antes que o timer é configurado. E o clock.c usa a função avoid_infinit_loops() pois tem alguns whiles no programa. Isso quer dizer que a função avoid não vai funcionar, pois o não terá o contador.
O avoid não funcionando não é problema critico, pois se a outra condição do while for satisfeita ele ainda vai sair do loop. Como se não existisse a função avoid.
To Reproduce
Steps to reproduce the behavior:
- Bote um breakpoint em algum while
- Veja o valor atual do registrador referente ao contador (TA2R register)
- O valor do contador deve ser zero, antes de entrar no while.
Expected behavior
A clear and concise description of what you expected to happen.
Screenshots
If applicable, add screenshots to help explain your problem.
Desktop (please complete the following information):
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
Smartphone (please complete the following information):
- Firmware version:
- Code Composer Studio version:
- Compiler version:
Additional context
Add any other context about the problem here.