Robótica Livre
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Ir para baixo
alvaro 123456
alvaro 123456
Mensagens : 476
Data de inscrição : 27/04/2019
Idade : 17

4.16 Resolvido Empty 4.16 Resolvido

Qui Mar 17, 2022 2:19 pm
/*
* CURSO DE ROBOTICA 2021
*
* Exercicio: 4.16
* Tema: Ponteiros e Volume de Dados
* Atividade: Comparar a performance de analise de vetor versus ponteiro
* Descrição: Usar um vetor do tamanho da memória e carregar com dados pela porta serial, medir o tempo da soma dos dados usando metodo de vetor e de ponteiro,
* Hardware: Inicializar a porta serial
* Comandos: Serial.begin(9600), Serial.println(); * ; & ;
* Dica1: Ponteiro é uma variável especial e guarda o endereço de uma posição de memória
* Dica2: Para declarar um ponteiro usa-se o operador *
* Dica3: * também é usado para acessar o conteudo do endereço
* Dica4: O operador & é usado para indicar o endereço de uma variável
* Dica5: A memória do Arduino nano tem 2048 bytes logo pode ser endereçada do 0x000 até 0x7FF
* Dica6: No Serial.print é possível formatar o dado usando (int) ou outro tipo. Ex. Serial.print((int)&p8bits);
* Dica7: Usar a função while() para leitura da porta serial até completar o vetor em todas as posições de memoria
* Dica8: Realizar a soma de todas as posições usando acesso diretamente aos elementos do vetor
* Dica9: Realizar a soma usando o ponteiro para acessar os elementos do vetor diretamente na memória
* Dica10: Cronometrar o tempo de execução das somas e comparar
*/

//DEFINICOES INICIAIS
#define TMAX 1500//definição de toda memoria do arduino

//DECLARAcAO DE VARIAVEIS GLOBAIS
byte vetor1[TMAX];//declaração do vetor com toda memoria do arduino
byte *p; //declaração do ponteiro
bool carregado;//variavel de controle
double soma = 0; //variavel de soma
long cronometro;//variavel usada para o tempo
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600);//inicializacão da porta serial
p = &vetor1[0];//atribui o endereço do vetor1 para o ponteiro p
}

//FUNÇÕES COMPLEMENTARES


//PROGRAMA PRINCIPAL
void loop() {

while(Serial.available()) {//Enquanto tiver recebendo dados pela porta serial faz leitura da porta serial até completar o vetor em todas as posições de memoria
if ( p < &vetor1 [TMAX] ) {//Entra se ainda não tiver preencido todo o ponteiro
*p = Serial.read();//Faz leitura do conteudo do p-onteiro
p ++;//incrementa o ponteiro para a proxima posicão
}else{//Se já preencheu toda a memoria
Serial.read();//sai ficar fazendo a leitura da porta serial
carregado = 1;//faz a atribuição do valor
}
Serial.print((int)(p - &vetor1[0]));//Vai mostrar o endereço do vetor na porta serial
Serial.print(" "); //mostra um espaço
Serial.println(Serial.available());//mostra os numeros do buffer
}

if( carregado == 1) {// se carregado igula a 1 roda o bloco abaixo
cronometro = micros();//imprime o tempo se carregado for igual a 1
for(int count = 0; count < TMAX; count ++){//Vai rodar toda a memoria
soma += vetor1[count]; //Para fazer a soma das posições do vetor
}
Serial.print(micros() - cronometro);//imporime o tempo de execusão
Serial.println(" Foi tempo de execução por vetor e a soma = ");
Serial.print(soma);//imprime o valor da soma
delay(1000);//tempo
}
soma = 0;//reseta a varial soma para fazer com ponteiros
cronometro = micros();//imprime o tempo do arduino
for(p = &vetor1[0]; p < vetor1[TMAX]; p ++) {//vai rodar enquanto for menor do que o ultimo endereço do vetor
soma += *p;//fazer a soma do conteudo do vetor
}
Serial.print(micros() - cronometro);//imporime o tempo de execusão
Serial.println("foi o tempo de execusão por ponteiro, e a soma = ");
Serial.print(soma);//imprime o valor da variavel
delay(1000);//tempo
p = &vetor1[0];//O ponteiro irá retornar para a primeira posição do vetor
carregado = 0;//reset
soma = 0;//reset
}

Paulo Augusto Batista
Paulo Augusto Batista
Admin
Mensagens : 5115
Data de inscrição : 11/02/2019
Idade : 52
Escola : Colegio Lindaura
https://roboticalivre.forumeiros.com

4.16 Resolvido Empty Re: 4.16 Resolvido

Qui Abr 28, 2022 12:51 am
Oi Alvaro, tem uns erros no programa que precisa corrigir.
O primeiro tem a ver com o bloco que inicia no comando if(carregado==1) Esse bloco deve englobar toda a segunda parte do programa, pois trata de fazer as contas quando o vetor estiver totalmente carregado, e voce fechou esse bloco antes da execuxão da conta, dai ele fica executando as contas a cada ciclo, sendo que deveria executar somente quando carregado estiver igual a 1.

O segundo erro está no for que faz o calculo usando vetor. Veja o comando abaixo:
for(p = &vetor1[0]; p < vetor1[TMAX]; p ++)
esse contador deve iniciar no endereço pa posição 0 e contar até o endereço da posição TMAX, e para pegar o endereço precisa usar o operador &

Nota 5.0
alvaro 123456
alvaro 123456
Mensagens : 476
Data de inscrição : 27/04/2019
Idade : 17

4.16 Resolvido Empty Re: 4.16 Resolvido

Qui Abr 28, 2022 2:56 pm
/*
* CURSO DE ROBOTICA 2021
*
* Exercicio: 4.16
* Tema: Ponteiros e Volume de Dados
* Atividade: Comparar a performance de analise de vetor versus ponteiro
* Descrição: Usar um vetor do tamanho da memória e carregar com dados pela porta serial, medir o tempo da soma dos dados usando metodo de vetor e de ponteiro,
* Hardware: Inicializar a porta serial
* Comandos: Serial.begin(9600), Serial.println(); * ; & ;
* Dica1: Ponteiro é uma variável especial e guarda o endereço de uma posição de memória
* Dica2: Para declarar um ponteiro usa-se o operador *
* Dica3: * também é usado para acessar o conteudo do endereço
* Dica4: O operador & é usado para indicar o endereço de uma variável
* Dica5: A memória do Arduino nano tem 2048 bytes logo pode ser endereçada do 0x000 até 0x7FF
* Dica6: No Serial.print é possível formatar o dado usando (int) ou outro tipo. Ex. Serial.print((int)&p8bits);
* Dica7: Usar a função while() para leitura da porta serial até completar o vetor em todas as posições de memoria
* Dica8: Realizar a soma de todas as posições usando acesso diretamente aos elementos do vetor
* Dica9: Realizar a soma usando o ponteiro para acessar os elementos do vetor diretamente na memória
* Dica10: Cronometrar o tempo de execução das somas e comparar
*/

//DEFINICOES INICIAIS
#define TMAX 1500//definição de toda memoria do arduino

//DECLARAcAO DE VARIAVEIS GLOBAIS
byte vetor1[TMAX];//declaração do vetor com toda memoria do arduino
byte *p; //declaração do ponteiro
bool carregado;//variavel de controle
double soma = 0; //variavel de soma
long cronometro;//variavel usada para o tempo
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600);//inicializacão da porta serial
p = &vetor1[0];//atribui o endereço do vetor1 para o ponteiro p
}

//FUNÇÕES COMPLEMENTARES


//PROGRAMA PRINCIPAL
void loop() {

while(Serial.available()) {//Enquanto tiver recebendo dados pela porta serial faz leitura da porta serial até completar o vetor em todas as posições de memoria
if ( p < &vetor1 [TMAX] ) {//Entra se ainda não tiver preencido todo o ponteiro
*p = Serial.read();//Faz leitura do conteudo do p-onteiro
p ++;//incrementa o ponteiro para a proxima posicão
}else{//Se já preencheu toda a memoria
Serial.read();//sai ficar fazendo a leitura da porta serial
carregado = 1;//faz a atribuição do valor
}
Serial.print((int)(p - &vetor1[0]));//Vai mostrar o endereço do vetor na porta serial
Serial.print(" "); //mostra um espaço
Serial.println(Serial.available());//mostra os numeros do buffer
}

if( carregado == 1) {// se carregado igula a 1 roda o bloco abaixo
cronometro = micros();//imprime o tempo se carregado for igual a 1
for(int count = 0; count < TMAX; count ++){//Vai rodar toda a memoria
soma += vetor1[count]; //Para fazer a soma das posições do vetor
}
Serial.print(micros() - cronometro);//imporime o tempo de execusão
Serial.println(" Foi tempo de execução por vetor e a soma = ");
Serial.print(soma);//imprime o valor da soma
delay(1000);//tempo

soma = 0;//reseta a varial soma para fazer com ponteiros
cronometro = micros();//imprime o tempo do arduino
for(p = &vetor1[0]; p < &vetor1[TMAX]; p ++) {//vai rodar enquanto for menor do que o ultimo endereço do vetor
soma += *p;//fazer a soma do conteudo do vetor
}
Serial.print(micros() - cronometro);//imporime o tempo de execusão
Serial.print(" foi o tempo de execusão por ponteiro, e a soma = ");
Serial.println(soma);//imprime o valor da variavel
delay(1000);//tempo
p = &vetor1[0];//O ponteiro irá retornar para a primeira posição do vetor
carregado = 0;//reset
soma = 0;//reset
}
delay(500);
}
Agora sim
Paulo Augusto Batista
Paulo Augusto Batista
Admin
Mensagens : 5115
Data de inscrição : 11/02/2019
Idade : 52
Escola : Colegio Lindaura
https://roboticalivre.forumeiros.com

4.16 Resolvido Empty Re: 4.16 Resolvido

Sex maio 06, 2022 1:15 am
Aí sim, funcionou mesmo. Nota 10.0
Espero que tenha aprendido um pouco sobre o uso dos ponteiros.
Conteúdo patrocinado

4.16 Resolvido Empty Re: 4.16 Resolvido

Ir para o topo
Permissões neste sub-fórum
Não podes responder a tópicos