collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[22 de Abril de 2024, 14:14]


Arame de Estendal por almamater
[18 de Abril de 2024, 16:16]


O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]

Autor Tópico: Iniciar-me em ARM  (Lida 33731 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.950
  • NERD!
Re: Iniciar-me em ARM
« Responder #60 em: 16 de Setembro de 2015, 10:37 »
eu estou a refazer o código
numa das uart a receção pode ser de muitos comandos. são tantos comandos que as 800 posições não são suficientes e por isso é que tenho que aumentar o vetor.
numa das partes (no switch) já tem uma máquina de estados
Não vi o código, mas guardar uma série de comandos no buffer de texto de receção não faz muito sentido. Processa-os e guarda-os numa lista. Ocupa muito menos memória e é mais eficiente.
Como estás a fazer se quiseres implementar um protocolo de deteção de erros só vais dar por ela muito mais tarde, vai ser complicado pedir uma retransmissão...

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.483
Re: Iniciar-me em ARM
« Responder #61 em: 16 de Setembro de 2015, 11:47 »
eu estou a refazer o código
numa das uart a receção pode ser de muitos comandos. são tantos comandos que as 800 posições não são suficientes e por isso é que tenho que aumentar o vetor.
numa das partes (no switch) já tem uma máquina de estados

Mas qual o motivo dos comandos? precisas de guardar / analisar / processar esses dados posteriormente?

Geralmente nesse tipo de aplicacoes o que tu pretendes 'e executar comandos ou receber parametros, nao precisas de guardar as mensagens ou comandos pois sao processados em tempo real ah medida que chegam.

Offline Addax

  • Mini Robot
  • *
  • Mensagens: 68
Re: Iniciar-me em ARM
« Responder #62 em: 16 de Setembro de 2015, 11:55 »
eu estou a refazer o código
numa das uart a receção pode ser de muitos comandos. são tantos comandos que as 800 posições não são suficientes e por isso é que tenho que aumentar o vetor.
numa das partes (no switch) já tem uma máquina de estados

Mas qual o motivo dos comandos? precisas de guardar / analisar / processar esses dados posteriormente?

Geralmente nesse tipo de aplicacoes o que tu pretendes 'e executar comandos ou receber parametros, nao precisas de guardar as mensagens ou comandos pois sao processados em tempo real ah medida que chegam.
eu não preciso de guardar ou analisar.. eu posso receber e enviar em tempo real à medida que recebo.
qual a melhor forma para fazer isso?

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.950
  • NERD!
Re: Iniciar-me em ARM
« Responder #63 em: 16 de Setembro de 2015, 12:23 »
Maquina de estados no ciclo principal do programa (correndo o risco de repetir o que já foi dito algumas vezes)

Offline Addax

  • Mini Robot
  • *
  • Mensagens: 68
Re: Iniciar-me em ARM
« Responder #64 em: 16 de Setembro de 2015, 15:22 »
quando referes uma máquina de estados bem feita é por exemplo:
Código: [Seleccione]
int conta=1;
void contaEstado(){
   conta++;
}
void main(){
switch(conta){
   case 1: printf("1"); contaEstado(); break;
   case 2: printf("2"); contaEstado(); break;
   default: printf("Nenhum");
}
tu referis-te fazer listas.. eu não sei fazer, é melhor aprender e implementar?


Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.483
Re: Iniciar-me em ARM
« Responder #66 em: 16 de Setembro de 2015, 15:47 »
outra sugestao:
o teu codigo nao esta modular / em camadas.

numa impementacao correcta nao podes misturar "aplicacao e codigo do MCU" no mesmo ficheiro
tens de criar as camadas para leitura / escrita serie por exemplo e outro ficheiro / modulo implementa as comunicacoes usando essas funcoes.
PAra alem de ser perceber melhor o codigo, isso permite que testes individualmente as funcoes. para nao haver a duvida: "isto nao funciona porque o MCU esta mal configurado e estou a implementar mal as coisas ou e' a minha aplicacao que esta com problemas?"

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Iniciar-me em ARM
« Responder #67 em: 16 de Setembro de 2015, 16:27 »
Em vários sítios tens "variável = variável;" é para quê?
A indentação que usas é má, considera usar pelo menos 4 espaços, em todos os níveis o mesmo número de espaços.
Dentro de cada linha também está tudo muito encavalitado, mais difícil de ler.
Os estados devem ter nomes e não números, podes criar um enumerado para isso.
Em vez de coisas como "ch[k-1]=='\n' && ch[k-2]=='\r' && ch[k-3]=='K' && ch[k-4]=='O'" podes usar a função strncmp().
Como disse o kammutier precisas de separar mais os níveis; criar abstrações, enfiar coisas esquisitas especificas do MCU em macros ou funções com nomes de jeito. Por exemplo não se mete "GPIOD->BSRRL |=((0x01<<15));" no meio de um main sem sequer um comentário; o correcto seria definir uma macro ou função inline com um nome muito sugestivo e usá-la.
Para mim é estranho teres uma interrupção de UART e ainda teres que fazer uma espera activa no inicio da interrupção antes de fazer a leitura; ou estás usar mal, ou é um workaround para um bug de hw, ou a UART desse chip é uma treta.
Também acho estranho teres que fazer, num ARM, um delay de ms com ciclos activos; ainda por cima o código não está feito para se ajustar automaticamente à frequencia do CPU.
Tens 2s a 3s de delays no ciclo principal que processa comandos, ia dizer que não me admira que tenhas que os guardar para não perderes, mas as coisas parecem-me mais complicadas do que isso e não vi bem, com as 2 UARTs mas o mesmo apagaRecebe(), não sei o q se passa aí.
« Última modificação: 16 de Setembro de 2015, 16:29 por Njay »

Offline Addax

  • Mini Robot
  • *
  • Mensagens: 68
Re: Iniciar-me em ARM
« Responder #68 em: 16 de Setembro de 2015, 16:57 »
Obrigado KammutierSpule e Njay.. Vou ter em atenção ao que vocês disseram e vou tentar reconstruir o código.
-"variavel=variavel;" não serve para nada.. era na altura em que estava a fazer debug para para naquele ponto
- não percebi este comentário "A indentação que usas é má, considera usar pelo menos 4 espaços, em todos os níveis o mesmo número de espaços."
- o "GPIOD->BSRRL |=((0x01<<15));" era só mesmo para piscar enquanto o código corre
- "Para mim é estranho teres uma interrupção de UART e ainda teres que fazer uma espera activa no inicio da interrupção antes de fazer a leitura" como é que posso fazer de outra forma? quando entra na interrupção da uart eu tenho forma de guardar os dados sem ter a espera da flag?
- o delay é porque como mudo logo de estado depois de enviar pela uart, coloco um delay para não ir logo para a função de receber

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Iniciar-me em ARM
« Responder #69 em: 16 de Setembro de 2015, 18:01 »
Esquece a parte "em todos os níveis o mesmo número de espaços", desculpa vi mal.

Nas interrupções faz-se o mínimo de trabalho. Ler o byte (ou bytes) da UART e avisar o ciclo principal que há um byte novo, apenas isto; o ciclo principal é que faz o processamento todo. Não devia ser preciso esperar por nada na interrupção, pois a interrupção serve mesmo para avisar que (pelo menos) um byte foi recebido e está pronto a ser lido (ou que se pode enviar um byte). Não conheço esse chip (nem sei o que programa é suposto fazer) pelo que não posso opinar sobre como usar os periféricos.
« Última modificação: 16 de Setembro de 2015, 18:06 por Njay »

Offline Addax

  • Mini Robot
  • *
  • Mensagens: 68
Re: Iniciar-me em ARM
« Responder #70 em: 17 de Setembro de 2015, 12:22 »
agora é que eu vejo que o código estava uma grande confusão..
tenho uma dúvida que talvez me possam ajudar.. tenho por exemplo a seguinte string1 "OLA LUSOROBOTICA", pretendo comparar com outra string mas não na totalidade.. ou seja, existe já alguma função numa biblioteca que permita procurar na string1 a existência por exemplo de "ROBOTICA"?
ou o melhor é fazer eu uma função para isso?
obrigado

(não sei se me fiz entender)

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.950
  • NERD!
Re: Iniciar-me em ARM
« Responder #71 em: 17 de Setembro de 2015, 13:00 »
Vá lá... o Google não é uma ferramenta tão complicada de usar :D

http://www.google.com/search?q=C+search+substring

Quaisquer dos primeiros resultados tem a solução.

Offline artur36

  • Mini Robot
  • *
  • Mensagens: 795
Re: Iniciar-me em ARM
« Responder #72 em: 17 de Setembro de 2015, 13:06 »
Não sei se existe uma opção melhor mas aqui vai o "meu" algoritmo (devo ter lido algures pelas "internet"):
Corres a string maior comparando cada letra com a primeira da string a comparar, se encontrares uma correspondência testas a letra seguinte com a segunda letra a comparar, se também esta for igual contínuas até ter uma correspondência completa. Se pelo meio não corresponder tens de voltar à letra imediatamente a seguir à primeira que encontras-te e recomeçar daí a busca.
Espero que dê para perceberes, entretanto logo quando chegar ao PC tento escrever um pseudocódigo melhor que agora estou no telemóvel

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.950
  • NERD!
Re: Iniciar-me em ARM
« Responder #73 em: 17 de Setembro de 2015, 13:09 »
Para quem teve preguiça de abrir o link acima, tens a função "strstr" na biblioteca "strings.h"  ::)

http://www.cplusplus.com/reference/cstring/strstr/

StarRider

  • Visitante
Re: Iniciar-me em ARM
« Responder #74 em: 17 de Setembro de 2015, 22:04 »

"Born to code in C" ... mais alguém leu ?

Grande livro, na altura (1989) em que nem sequer net existia, pelo menos para
os "civis" ...

Addax, pelo menos dá uma vista de olhos pelo "string.h" ... é o mínimo que
se pede a quem realmente quer saber programar em C.

Abraços
PA