Entrar    Registrar

LOGICA com IFs e SWITCH

Software e Hardware para uC STM

Moderadores: aluis-rcastro, 51

  • Autor
    Mensagem

LOGICA com IFs e SWITCH

Mensagempor Guri » 13 Jul 2019 16:13

Me ajudem! :roll:

Eu preciso fazer isso:

unsigned int BUFFER
unsigned int TEMP

if(BUFFER>=100) {TEMP=BUFFER-100}

A minha dúvida é: COMO EU FAÇO ISSO UTILIZANDO "SWITCH". É que na rotina que estou trabalhando, eu não posso utilizar IFs...

Como eu sou novato, ainda não consegui desdobrar o raciocinio sobre como fazer isso 8)
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 273
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: LOGICA com IFs e SWITCH

Mensagempor eliveltonpsantos » 13 Jul 2019 19:07

Pesquise por "c switch case greater than" que você encontrará umas ideias.

Vi algumas interessantes, mas não testei.

Código: Selecionar todos
#include <limits.h>
...

switch(a)
{
case 1000 ... INT_MAX: // note: cannot omit the space between 1000 and ...
    printf("hugely positive");
   break;
case 100 ... 999:
    printf("very positive");
   break;
...
}


Código: Selecionar todos
#include <iostream>
 
using namespace std; //introduces namespace std
 
int main ( void )
{
   int x=5, y=8;
     
   switch(x > y ? true : false) // or 1 : 0
   {
      case true:  cout << x
                       << " is greater than "
                       << y;
           
                       break;
         
      case false: cout << y
                       << " is greater than "
                       << x;
           
                       break;
   };   
     
   return 0;
}
eliveltonpsantos
Bit
 
Mensagens: 39
Registrado em: 30 Jun 2017 09:14

Re: LOGICA com IFs e SWITCH

Mensagempor Guri » 13 Jul 2019 19:34

Obrigado pela dica.

Vou testar, e aviso os resultados...
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 273
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: LOGICA com IFs e SWITCH

Mensagempor pamv » 13 Jul 2019 20:23

Eu temo em perguntar, mas por que você não pode usar if() e apenas switch? A switch é uma cadeia de if then else if, você está editando algum fonte pronto pra enfiar essa condição?
pamv
Word
 
Mensagens: 833
Registrado em: 20 Jun 2016 21:47

Re: LOGICA com IFs e SWITCH

Mensagempor Guri » 13 Jul 2019 20:40

Então palm,


O caso é o seguinte, eu estou avançando nos trabalhos com nosso synth e agora estarei utilizando a captação de sinais wavetable de uma memória externa, isso por causa do tamanho, não tendo nada a ver, apenas como fonte de informação.

Eu preciso identificar o ponto de looping da amostragem e para isso teria que fazer a comparação, para saber se houve a chegada do endereço desejado, isso poderia ser feito com o "if and else", porém existe um problema em utilizar IF.

Quando uso IF, aparece um "chiado" no audio, isso ocorre com a introdução do IF, e veio a confirmar a dica do meu amigo PROEX que já tinha me alertado sobre o fato.

Por isso estou querendo usar o switch, :roll:
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 273
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: LOGICA com IFs e SWITCH

Mensagempor Guri » 13 Jul 2019 20:41

Se bem que o chiado só aparece em frequencias mais altas, acima de 5khz...mas como não quero deixar o projeto com arestas, é melhor resolver o incoveniente... :D
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 273
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: LOGICA com IFs e SWITCH

Mensagempor pamv » 13 Jul 2019 21:55

Mudando a otimização não muda esse comportamento?
pamv
Word
 
Mensagens: 833
Registrado em: 20 Jun 2016 21:47

Re: LOGICA com IFs e SWITCH

Mensagempor aluis-rcastro » 14 Jul 2019 00:38

Código: Selecionar todos
if(BUFFER>=100) {TEMP=BUFFER-100}

A minha dúvida é: COMO EU FAÇO ISSO UTILIZANDO "SWITCH".


Se voce considerar aceitavel escrever noventa e nove linhas com case, pode implementar dessa maneira:

cpp code
switch(BUFFER)
{
case 0:
case 1:
...
case 99:
// nao faz nada ate aqui (voce nao mencionou o 'else')
break;

case default:
TEMP=BUFFER-100; // os casos onde BUFFER ≥ 100
break;
}
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
aluis-rcastro
Dword
 
Mensagens: 5311
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: LOGICA com IFs e SWITCH

Mensagempor pamv » 14 Jul 2019 20:03

Eu peguei um exemplo de código usando switch (3 níveis mais default) e converti para if else.

Em seguida eu compilei ambos em um ARM rodando armbian com

Código: Selecionar todos
gcc -S -O3


e comparei os tamanhos dos dois códigos

Código: Selecionar todos
$ ls -l *.s
-rw-rw-r-- 1 pamv pamv 570 Jul 14 20:02 if.s
-rw-rw-r-- 1 pamv pamv 574 Jul 14 20:02 switch.s


os 4 bytes de diferença correspondem à diferença de nome dos arquivos em C:

Código: Selecionar todos
$ diff if.s switch.s
2c2
<       .file   "if.c"
---
>       .file   "switch.c"


o resto do código compilado é idêntico como eu esperava:

Código: Selecionar todos
$ cat switch.s
        .arch armv8-a
        .file   "switch.c"
        .text
        .section        .text.startup,"ax",@progbits
        .align  2
        .p2align 3,,7
        .global main
        .type   main, %function
main:
        stp     x29, x30, [sp, -16]!
        adrp    x0, .LC3
        add     x0, x0, :lo12:.LC3
        add     x29, sp, 0
        bl      puts
        mov     w0, 0
        ldp     x29, x30, [sp], 16
        ret
        .size   main, .-main
        .section        .rodata.str1.8,"aMS",@progbits,1
        .align  3
.LC0:
        .string "Case1:"
        .zero   1
.LC1:
        .string "Case2:"
        .zero   1
.LC2:
        .string "Case3:"
        .zero   1
.LC3:
        .string "Default:"
        .ident  "GCC: (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0"
        .section        .note.GNU-stack,"",@progbits


a minha dúvida é: Por que o compilador do Guri gera códigos diferentes entre if e switch ?
pamv
Word
 
Mensagens: 833
Registrado em: 20 Jun 2016 21:47

Re: LOGICA com IFs e SWITCH

Mensagempor aluis-rcastro » 14 Jul 2019 20:12

a minha dúvida é: Por que o compilador do Guri gera códigos diferentes entre if e switch ?


Li nao sei aonde que certos compiladores dependendo do tamanho da lista de If-then-else e da otimizacao, pode implementar o switch-case com uma tabela look-up, o que faria bastante sentido já que os valores do case tem de ser constantes.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
aluis-rcastro
Dword
 
Mensagens: 5311
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: LOGICA com IFs e SWITCH

Mensagempor Guri » 14 Jul 2019 21:16

:cry:
Vixxi, agora que a cabeça do veio vonnilmam ficou bagunçada.

Eu uso "ainda" o mikroc, ele é bom, apesar de eu não utilizar as libs nativas dele, pois prefiro criar a libs para cada aplicação, pois já peguei erros quando essas libs de exemplos, rodam em conjunto com rotinas mais complexas.
De qualquer forma nada melhor que criar as suas próprias libs.

Realmente, o amigo PROEX, mencionou sobre esse detalhe e até confesso que não dei muita bola. Até eu precisar usar a comparação para identificar a posição do ponteiro na tabela de onda. Se eu boar if o fica com chiado, derrepente estou cometendo alguma gafe!...

Vou estudar mais o fenômeno e ver se eu não estou errando em algum ponto.

Obrigado pelas dicas,
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 273
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: LOGICA com IFs e SWITCH

Mensagempor pamv » 14 Jul 2019 22:02

aluis-rcastro escreveu:
Li nao sei aonde que certos compiladores dependendo do tamanho da lista de If-then-else e da otimizacao, pode implementar o switch-case com uma tabela look-up, o que faria bastante sentido já que os valores do case tem de ser constantes.


A tabela seria mais rápida mas parece que o problema dele é um if de uma linha apenas sendo substituído por um switch, então parece que o que ele precisa é enfiar um delay entre o if e a ação, mudar, por exemplo de

Código: Selecionar todos
if(BUFFER>=100)
  TEMP=BUFFER-100;


para

Código: Selecionar todos
if(BUFFER>=100) {
  TEMP=BUFFER-100;
  delay(10);            // ou alguma outra forma de atrasar a execução do if
  }
pamv
Word
 
Mensagens: 833
Registrado em: 20 Jun 2016 21:47

Re: LOGICA com IFs e SWITCH

Mensagempor Budweiser » 15 Jul 2019 17:15

Guri escreveu::cry:
Vixxi, agora que a cabeça do veio vonnilmam ficou bagunçada.

Eu uso "ainda" o mikroc, ele é bom, apesar de eu não utilizar as libs nativas dele, pois prefiro criar a libs para cada aplicação, pois já peguei erros quando essas libs de exemplos, rodam em conjunto com rotinas mais complexas.
De qualquer forma nada melhor que criar as suas próprias libs.

Realmente, o amigo PROEX, mencionou sobre esse detalhe e até confesso que não dei muita bola. Até eu precisar usar a comparação para identificar a posição do ponteiro na tabela de onda. Se eu boar if o fica com chiado, derrepente estou cometendo alguma gafe!...

Vou estudar mais o fenômeno e ver se eu não estou errando em algum ponto.

Obrigado pelas dicas,


Eu preciso perguntar... Se você usa o MikroC sem as suas libs... Já cogitou usar o MPLAB?
Teve coisas que eu só consegui resolver depois que voltei ao MPLAB ...
Budweiser
Nibble
 
Mensagens: 63
Registrado em: 28 Mar 2008 15:37
Localização: Florianópolis - SC

Re: LOGICA com IFs e SWITCH

Mensagempor Aquino » 15 Jul 2019 19:34

Guri, pra analisar e poder opinar é preciso ter o código todo e algumas formas de onda.
Senão é chute.
Manipulando diretamente os registradores deve funcionar se o problema for overhead de biblioteca.
Mas chuto que o problema deve ser muito além do IF, talvez um tempo crítico entre as interrupções ou algo assim.
Buscando um coach para me tornar coach em sistemas embarcados.
Avatar do usuário
Aquino
Dword
 
Mensagens: 1902
Registrado em: 12 Out 2006 22:24

Re: LOGICA com IFs e SWITCH

Mensagempor pamv » 15 Jul 2019 19:58

Aquino

Eu acho que é tão complexo quanto usar um osciloscópio para caracterizar de forma definitiva o "defeito" que o IF produz e tão simples quanto o Guri comparar o código gerado pelo mikroC para o IF e para o switch e como isso impacta o reset do buffer. Eu começaria pelo mais simples, olharia o código gerado pelo compilador para ver se tem alguma diferença de fato entre o código produzido pelo if o produzido pelo switch.
pamv
Word
 
Mensagens: 833
Registrado em: 20 Jun 2016 21:47

Próximo

Voltar para STMicroelectronics

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante