Skip to content
SPONSORS
By Corsi
Picture of Corsi
Corsi

Variáveis ​

Programas para sistemas embarcados devem seguir algumas diretrizes fundamentais de qualidade de código, refletindo as melhores práticas no uso de microcontroladores e da linguagem de programação C. É importante lembrar que um sistema embarcado interage diretamente com o mundo real, onde falhas podem impactar significativamente nossa realidade.

Existem várias normas estabelecidas para orientar os desenvolvedores na criação de firmwares mais confiáveis, abordando inclusive problemas associados à especificação da linguagem C.

underfined behaviors

Os comportamentos indefinidos (undefined behaviors) na linguagem de programação C ocorrem quando o padrão da linguagem não especifica como o programa deve se comportar em determinadas circunstâncias. Isso pode ser o resultado de ações como: divisão por zero, acesso a ponteiros nulos, estouro de buffer, entre outros. Esses comportamentos podem levar a resultados imprevisíveis e causar problemas de segurança ou falhas no programa. Para minimizar tais riscos, é importante seguir as melhores práticas de programação e estar atento a possíveis comportamentos indefinidos ao escrever e revisar seu código.

Neste roteiro não vamos nos atentar à formatação do código (nomenclatura, estilo).

Variáveis Globais ​

Rule 1.1

Somente usar variáveis globais para passar informacoes de uma interrupcão (ISR) para a funcão main.

Em projetos mais complexos, essa regra pode ser flexibilizada, mas isso deve ser abordado com cautela e planejamento. Devido ao tempo limitado disponível para desenvolvermos boas práticas com vocês, estamos limitando o uso de variáveis globais apenas nessas situações.

Exemplo ​

O exemplo a seguir demonstra um uso errado de variáveis globais:

  • void foo(void): A funcão foo acessa a variável global a
  • int b: Poderia pertencer ao escopo da funcão main
c
int a = 0; // var global
int b = 0; // var global

void foo(void) {
    a = a + 1; // acessa variavel global
}

void main(void) {
    while (1) {
        foo();
        
        if (a > 5) {
            b = 1;
        }
    }
}

O código anterior viola a regra 1.1 nas duas variáveis ( a e b ) gerando o seguinte erro:

Qual alternativa a seguir seria uma solução válida para corrigir o código?

  • Declara a e b local e acessa a como global
  • Declara foo dentro da funcão main
c
void main(void) {
    int a = 0;
    int b = 0;

    void foo(void) {
        a = a + 1; // acessa variavel global
    }

    while (1) {
        foo();

        if (a > 5) {
            b = 1;
        }
    }
}
Solucão correta é ...

O código letra C!

  • [ ] Declarar foo dentro da funcão main.
  • [ ] Declarar a variável a como global.
  • [x] Declara a e b local, e acessa a com ponteiro

Praticando ​

Vamos praticar e ver como isso vai funcionar na prática durante a disciplina! Na entrega de pré lab do GPIO o exe0_variables vai ser sobre isso.