Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug EPS - avoid_infinit_loops() #13

Open
zdaniz22 opened this issue Apr 29, 2019 · 0 comments
Open

Bug EPS - avoid_infinit_loops() #13

zdaniz22 opened this issue Apr 29, 2019 · 0 comments
Labels

Comments

@zdaniz22
Copy link
Contributor

zdaniz22 commented Apr 29, 2019

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:

  1. Bote um breakpoint em algum while
  2. Veja o valor atual do registrador referente ao contador (TA2R register)
  3. 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.

@zdaniz22 zdaniz22 added the bug label Apr 29, 2019
ramonborba added a commit that referenced this issue Aug 19, 2019
Added a command to reset the TIMERA2 counter in the function. #13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant