Giter Site home page Giter Site logo

aps1-embarcados's People

Watchers

 avatar  avatar

aps1-embarcados's Issues

Boas práticas de formatação

APS1-Embarcados/src/main.c

Lines 148 to 180 in 472c51d

for (int i=0;i <m.size;i++){
if (m.notes[i] ==0){
turn_off(m.order);
delay_ms(m.tempo[i]);
} else{
float temp = (1.0/(float)m.notes[i])*1000.0;
turn_on(m.order);
for (int j=0;j<(m.tempo[i]/temp)*0.9;j++){
if(ORDER !=m.order){
pio_set(LED1_PIO,LED1_PIO_IDX_MASK);
pio_set(LED2_PIO,LED2_PIO_IDX_MASK);
pio_set(LED3_PIO,LED3_PIO_IDX_MASK);
return;}
if(PAUSE){
j=0;
pio_clear(LED_PIO,LED_PIO_IDX_MASK);}
else {
pio_set(LED_PIO,LED_PIO_IDX_MASK);
if(m.notes[i]!=0){
pio_set(BUZ_PIO,BUZ_PIO_IDX_MASK);
delay_us(temp*1000.0);
pio_clear(BUZ_PIO,BUZ_PIO_IDX_MASK);
delay_us(temp*1000.0);
}
}
}
turn_off(m.order);
delay_ms(60);
}
}

Apesar de não está errado.

Tem momentos no código que após um if ou else, não há espaços para as chaves { e e outros momentos há. Alguns pula linha, outros não. Algumas linha estão em branco dando espaco para outro if, tem hora que não.

O recomendado é seguir um padrão de estilo de codificação ("coding style"). Para C, a maioria é similar.

Segue alguns para sua curiosidade, adotado por grandes entidades:

Google - Projetos em C/C++ (Chrome, e entre outros)

Gnome - Linux - Projetos em C

Switch poderia ser evitado

APS1-Embarcados/src/main.c

Lines 306 to 324 in 472c51d

switch (ORDER){
case 1:
gfx_mono_draw_string(" ", 10,10, &sysfont);
ORDER = 1;
play_song(music1);
break;
case 2:
gfx_mono_draw_string(" ", 10,10, &sysfont);
ORDER = 2;
play_song(music2);
break;
case 3:
gfx_mono_draw_string(" ", 10,10, &sysfont);
ORDER = 3;
play_song(music3);
break;
default:
break;
}

Não entendi porque redefine o valor da variavel ORDER para o mesmo valor para cada case do Switch.

Enfim poderiamos ter um vetor de ponteiros para as musicas:

music *musicas[] = {&music1, &music2, &music3};

Ai o switch poderia virar

if(order) {
   gfx_mono_draw_string("            ", 10,10, &sysfont);
   play_song(music[ORDER]);
 }

Vantagens:

  • Código fica mais fácil de ser compreendido.
  • Para adicionar uma música basta adicionar no vetor musicas.
  • Menor chance de bugs (já que é o mesmo código para qualquer música)

Criar uma função

gfx_mono_draw_string(" ", 10,10, &sysfont);

Sugestão: cria uma função oled_clear_screen.

Vantagens:

  • Fica mais claro o que está acontecendo
  • Se amanha trocar o modelo de OLED, e não for mais essa quantidade de espaços e nessas coordenadas. Ou mesmo ter que trocar a função? Você terá que abrir arquivo por arquivo e editar linha por linha, sendo que se você colocar isso numa função oled_clear_screen, só terá que alterar a mesma. Menor manutenção, menos bugs.

Grandes vetores constantes de dados

APS1-Embarcados/src/music.h

Lines 129 to 150 in 472c51d

int pirate_melody[] = {
NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0,
NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
NOTE_A4, NOTE_G4, NOTE_A4, 0,
NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0,
NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
NOTE_A4, NOTE_G4, NOTE_A4, 0,
NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0,
NOTE_A4, NOTE_C5, NOTE_D5, NOTE_D5, 0,
NOTE_D5, NOTE_E5, NOTE_F5, NOTE_F5, 0,
NOTE_E5, NOTE_D5, NOTE_E5, NOTE_A4, 0,
NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
NOTE_D5, NOTE_E5, NOTE_A4, 0,
NOTE_A4, NOTE_C5, NOTE_B4, NOTE_B4, 0,
NOTE_C5, NOTE_A4, NOTE_B4, 0,
NOTE_A4, NOTE_A4,

No arquivo musicas.h existem diversos vetores com informações constantes (uma vez definido, nunca é alterado).

Uma grande recomendação de quando trabalhamos com sistemas embarcados, e também acaba sendo uma excelente prática de programação, sempre que tivermos dados constantes que não alteram (imutáveis), declarar eles com a propriedade const.

Exemplo:

const int music[] = ...

Quais as vantagens para um sistema embarcado?
Bom, o nosso SAME70, é uma CPU com 2048KB de ROM e 384KB de RAM (fonte) Quando você não utiliza a propriedade const, o compilador assume, que o vetor pode ser alterado a qualquer instante, por este motivo, ele é armazenado na RAM do processador. Agora, com o const, estes dados serão armazenados na ROM! Já que eles não se alteram! Dando uma enorme economia de memória RAM.

Lembre-se que geralmente em sistemas embarcados, um dos maiores gargalos é a quantidade de memória RAM disponível (RAM = custo = aumenta preço).

Erro na flag e função pio_pull_up não necessária

APS1-Embarcados/src/main.c

Lines 210 to 211 in 472c51d

pio_set_input(BUT_PIO, BUT_PIO_IDX_MASK, PIO_PULLUP & PIO_DEBOUNCE);
pio_pull_up(BUT_PIO,BUT_PIO_IDX_MASK,1);

Ao usar a função pio_set_input e passar os flags PIO_PULLUP e PIO_DEBOUCE, acredito que vocês gostariam de utilizar os dois certos?

Esses são flags binários, se você usa o operador &, você está fazendo uma lógica E (And) com os dois flags, desligando ambos (são bits diferentes, logo o And irá dar um zero), ou seja, vocês não ligaram nenhum dos dois dessa forma...

O jeito correto é o usar o operador | (ou bit a bit).
Ficando portanto

	pio_set_input(BUT_PIO, BUT_PIO_IDX_MASK, PIO_PULLUP | PIO_DEBOUNCE);

Por fim, como você ligou o pull-up atráves das flags, vocês não precisariam utilizar a função pio_pull_up.

Criar um define para cada prioridade

APS1-Embarcados/src/main.c

Lines 226 to 248 in 472c51d

NVIC_EnableIRQ(BUT_PIO_ID);
NVIC_SetPriority(BUT_PIO_ID, 4); // Prioridade 4
//interrupt da muscic1
pio_handler_set(BUT1_PIO, BUT1_PIO_ID, BUT1_PIO_IDX_MASK, PIO_IT_RISE_EDGE, order1);
pio_enable_interrupt(BUT1_PIO, BUT1_PIO_IDX_MASK);
NVIC_EnableIRQ(BUT1_PIO_ID);
NVIC_SetPriority(BUT1_PIO_ID, 5); // Prioridade 5
//interrupt da muscic2
pio_handler_set(BUT2_PIO, BUT2_PIO_ID, BUT2_PIO_IDX_MASK, PIO_IT_RISE_EDGE, order2);
pio_enable_interrupt(BUT2_PIO, BUT2_PIO_IDX_MASK);
NVIC_EnableIRQ(BUT2_PIO_ID);
NVIC_SetPriority(BUT2_PIO_ID, 5); // Prioridade 5
//interrupt da muscic3
pio_handler_set(BUT3_PIO, BUT3_PIO_ID, BUT3_PIO_IDX_MASK, PIO_IT_RISE_EDGE, order3);
pio_enable_interrupt(BUT3_PIO, BUT3_PIO_IDX_MASK);
NVIC_EnableIRQ(BUT3_PIO_ID);
NVIC_SetPriority(BUT3_PIO_ID, 5); // Prioridade 5

Exemplo

// (Colocar este define junto com os outros do botão)
#define BUT2_PRIORITY 6

NVIC_SetPriority(BUT2_PIO_ID, BUT2_PRIORITY);

Vantagens:

  • Fica explicito junto com as demais configurações do botão, permitindo fácil alteração da prioridade se necessário.
  • Evita número "mágico" no meio do código, ficando bem óbvio o que se trata (código se auto documenta).

Objetivo no Readme

O objetivo da mesma é familizar o estudante com o Kit de desenvolvimento - ATSAME70-XPLD.

Na verdade, o objetivo deste projeto é que vocês adquiram conhecimento de programação em eletrônica embarcada, o Atmel SAME70 é apenas um kit específico de um fornecedor, gostariamos que vocês pegassem conceitos para que pudessem abstrair para outros modelos e fabricantes, já que todos eles possuem características muito similares (hardware ARM, programação em linguagem C, memória RAM limitada, ausência de sistema operacional convencional, periféricos dedicados, pinos programáveis e afins).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.