Exercício 4.16
2 participantes
- Thiaguin
- Mensagens : 203
Data de inscrição : 03/03/2020
Exercício 4.16
Dom Out 10, 2021 11:42 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 1000 //Definido o tamanho máximo de caracteres
//DECLARAcAO DE VARIAVEIS GLOBAIS
byte vetor1[TMAX];//Vetor para armazenar os caracteres e apresentar os dados e endereços deles
byte *p;//Ponteiro para correr os endereços e os dados dos caracteres
bool carregado = 0;//Variável de controle
long cronometro;//Variável para ser armazenada uma leitura do tempo decorrido até determinada parte do programa
double soma = 0;//Variável para armazenar a soma dos valores das posições do vetor1
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600);//Porta serial inicializada com uma velocidade de 9600 bps
p = &vetor1[0];//O endereço da primeira posição do vetor1 será atribuído ao ponteiro p
}
//FUNÇÕES COMPLEMENTARES
//PROGRAMA PRINCIPAL
void loop() {
//COLETA DOS DADOS
while(Serial.available()){//Enquanto houver dado na porta, roda o bloco abaixo
if( p < &vetor1[TMAX]){//Se o endereço do ponteiro p for menor que o endereço do vetor1, roda o bloco abaixo
*p = Serial.read();//O conteúdo recebido pela porta serial será atribuído ao conteúdo do endereço em que o ponteiro p se encontra
p ++;//Incrementa o ponteiro
}else{//Se a condição apresentada não for verdadeira, roda o bloco abaixo
Serial.read();//Faz a leitura do dado recebido para não atribuí-lo às posições do vetor
carregado = 1;//A variável de controle passa a ser 1
}
Serial.print((int)(p - &vetor1[0]));//Apresenta o endereço de qual posição do vetor o ponteiro está indicando
Serial.print(" ");
Serial.println(Serial.available());//Apresenta o conteúdo da posição do vetor em que o ponteiro está localizado
}
//REALIZAÇÃO DA SOMA PELO VETOR
if(carregado == 1){//Se a variável de controle passar a ser 1, roda o bloco abaixo
cronometro = micros();//Pega o tempo em que o programa já rodou em microsegundos até essa parte e guarda na variável cronometro, ou seja, é uma primeira amostra, dessa parte
for(int count=0; count < TMAX; count ++){//Incrementa o contador
soma += vetor1[count];//Soma todos os valores das posições do vetor1 e guarda na variável soma
}
Serial.print("\n");
Serial.println("METODO USANDO O VETOR");
Serial.print(micros() - cronometro);//Pega o tempo que o programa rodou até esta parte e subtrai pela 1ª amostra, resultando assim, no tempo decorrido para o processo de soma, esse valor será apresentado no monitor seerial
Serial.print(" foi o tempo de execucao por vetor, e a soma = ");
Serial.println(soma);//Apresenta o valor da soma de todas as posições do vetor1
delay(1000);
//REALIZAÇÃO DA SOMA PELO PONTEIRO
soma = 0;//A variável soma será resetada
cronometro = micros();//Pega o tempo em que o programa já rodou em microsegundos até essa parte e guarda na variável cronometro, ou seja, é uma primeira amostra, dessa parte
for(p = &vetor1[0]; p < &vetor1[TMAX]; p ++){//Incrementa o ponteiro
soma =+ *p;//Soma todos os valores das posições do vetor1 e guarda na variável soma, por meio do conteúdo de cada ndereço em que o poteiro esteja localizado
}
Serial.println("METODO USANDO O PONTEIRO");
Serial.print(micros() - cronometro);//Pega o tempo que o programa rodou até esta parte e subtrai pela 1ª amostra, resultando assim, no tempo decorrido para o processo de soma, esse valor será apresentado no monitor seerial
Serial.print(" foi o tempo de execucao por ponteiro, e a soma = ");
Serial.println(soma);//Apresenta o valor da soma de todas as posições do vetor1
Serial.print("\n");
delay(10000);
//REINÍCIO DAS VARIAVEIS E CONTADORES
p = &vetor1[0];//O pon teiro irá retornar para a primaira posição do vetor
carregado = 0;//A variável de controle será resetada
soma = 0;//A variável soma será resetada
delay(500);
}
}
* 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 1000 //Definido o tamanho máximo de caracteres
//DECLARAcAO DE VARIAVEIS GLOBAIS
byte vetor1[TMAX];//Vetor para armazenar os caracteres e apresentar os dados e endereços deles
byte *p;//Ponteiro para correr os endereços e os dados dos caracteres
bool carregado = 0;//Variável de controle
long cronometro;//Variável para ser armazenada uma leitura do tempo decorrido até determinada parte do programa
double soma = 0;//Variável para armazenar a soma dos valores das posições do vetor1
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600);//Porta serial inicializada com uma velocidade de 9600 bps
p = &vetor1[0];//O endereço da primeira posição do vetor1 será atribuído ao ponteiro p
}
//FUNÇÕES COMPLEMENTARES
//PROGRAMA PRINCIPAL
void loop() {
//COLETA DOS DADOS
while(Serial.available()){//Enquanto houver dado na porta, roda o bloco abaixo
if( p < &vetor1[TMAX]){//Se o endereço do ponteiro p for menor que o endereço do vetor1, roda o bloco abaixo
*p = Serial.read();//O conteúdo recebido pela porta serial será atribuído ao conteúdo do endereço em que o ponteiro p se encontra
p ++;//Incrementa o ponteiro
}else{//Se a condição apresentada não for verdadeira, roda o bloco abaixo
Serial.read();//Faz a leitura do dado recebido para não atribuí-lo às posições do vetor
carregado = 1;//A variável de controle passa a ser 1
}
Serial.print((int)(p - &vetor1[0]));//Apresenta o endereço de qual posição do vetor o ponteiro está indicando
Serial.print(" ");
Serial.println(Serial.available());//Apresenta o conteúdo da posição do vetor em que o ponteiro está localizado
}
//REALIZAÇÃO DA SOMA PELO VETOR
if(carregado == 1){//Se a variável de controle passar a ser 1, roda o bloco abaixo
cronometro = micros();//Pega o tempo em que o programa já rodou em microsegundos até essa parte e guarda na variável cronometro, ou seja, é uma primeira amostra, dessa parte
for(int count=0; count < TMAX; count ++){//Incrementa o contador
soma += vetor1[count];//Soma todos os valores das posições do vetor1 e guarda na variável soma
}
Serial.print("\n");
Serial.println("METODO USANDO O VETOR");
Serial.print(micros() - cronometro);//Pega o tempo que o programa rodou até esta parte e subtrai pela 1ª amostra, resultando assim, no tempo decorrido para o processo de soma, esse valor será apresentado no monitor seerial
Serial.print(" foi o tempo de execucao por vetor, e a soma = ");
Serial.println(soma);//Apresenta o valor da soma de todas as posições do vetor1
delay(1000);
//REALIZAÇÃO DA SOMA PELO PONTEIRO
soma = 0;//A variável soma será resetada
cronometro = micros();//Pega o tempo em que o programa já rodou em microsegundos até essa parte e guarda na variável cronometro, ou seja, é uma primeira amostra, dessa parte
for(p = &vetor1[0]; p < &vetor1[TMAX]; p ++){//Incrementa o ponteiro
soma =+ *p;//Soma todos os valores das posições do vetor1 e guarda na variável soma, por meio do conteúdo de cada ndereço em que o poteiro esteja localizado
}
Serial.println("METODO USANDO O PONTEIRO");
Serial.print(micros() - cronometro);//Pega o tempo que o programa rodou até esta parte e subtrai pela 1ª amostra, resultando assim, no tempo decorrido para o processo de soma, esse valor será apresentado no monitor seerial
Serial.print(" foi o tempo de execucao por ponteiro, e a soma = ");
Serial.println(soma);//Apresenta o valor da soma de todas as posições do vetor1
Serial.print("\n");
delay(10000);
//REINÍCIO DAS VARIAVEIS E CONTADORES
p = &vetor1[0];//O pon teiro irá retornar para a primaira posição do vetor
carregado = 0;//A variável de controle será resetada
soma = 0;//A variável soma será resetada
delay(500);
}
}
Re: Exercício 4.16
Qua Nov 03, 2021 12:15 am
Oi Thiago, Testei esse programa e os tempos de execução entre vetor r ponteiros ficaram bem diferentes, assim como o checksum.
Porém procurei no programa erros e não encontrei. No meu da certo as somas e tempo de execução.
então vou dar nota 9.0
No sabado podemos checar juntos se funciona direito no arduino e arrumo a nota.
Porém procurei no programa erros e não encontrei. No meu da certo as somas e tempo de execução.
então vou dar nota 9.0
No sabado podemos checar juntos se funciona direito no arduino e arrumo a nota.
- Thiaguin
- Mensagens : 203
Data de inscrição : 03/03/2020
Re: Exercício 4.16
Sáb Nov 13, 2021 9:04 am
/*
* 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 10 //Definido o tamanho máximo de caracteres
//DECLARAcAO DE VARIAVEIS GLOBAIS
byte vetor1[TMAX];//Vetor para armazenar os caracteres e apresentar os dados e endereços deles
byte *p;//Ponteiro para correr os endereços e os dados dos caracteres
bool carregado = 0;//Variável de controle
long cronometro;//Variável para ser armazenada uma leitura do tempo decorrido até determinada parte do programa
double soma = 0;//Variável para armazenar a soma dos valores das posições do vetor1
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600);//Porta serial inicializada com uma velocidade de 9600 bps
p = &vetor1[0];//O endereço da primeira posição do vetor1 será atribuído ao ponteiro p
}
//FUNÇÕES COMPLEMENTARES
//PROGRAMA PRINCIPAL
void loop() {
//COLETA DOS DADOS
while(Serial.available()){//Enquanto houver dado na porta, roda o bloco abaixo
if( p < &vetor1[TMAX]){//Se o endereço do ponteiro p for menor que o endereço do vetor1, roda o bloco abaixo
*p = Serial.read();//O conteúdo recebido pela porta serial será atribuído ao conteúdo do endereço em que o ponteiro p se encontra
p ++;//Incrementa o ponteiro
}else{//Se a condição apresentada não for verdadeira, roda o bloco abaixo
Serial.read();//Faz a leitura do dado recebido para não atribuí-lo às posições do vetor
carregado = 1;//A variável de controle passa a ser 1
}
Serial.print((int)(p - &vetor1[0]));//Apresenta o endereço de qual posição do vetor o ponteiro está indicando
Serial.print(" ");
Serial.println(Serial.available());//Apresenta o conteúdo da posição do vetor em que o ponteiro está localizado
}
//REALIZAÇÃO DA SOMA PELO VETOR
if(carregado == 1){//Se a variável de controle passar a ser 1, roda o bloco abaixo
cronometro = micros();//Pega o tempo em que o programa já rodou em microsegundos até essa parte e guarda na variável cronometro, ou seja, é uma primeira amostra, dessa parte
for(int count=0; count < TMAX; count ++){//Incrementa o contador
soma += vetor1[count];//Soma todos os valores das posições do vetor1 e guarda na variável soma
}
Serial.print("\n");
Serial.println("METODO USANDO O VETOR");
Serial.print(micros() - cronometro);//Pega o tempo que o programa rodou até esta parte e subtrai pela 1ª amostra, resultando assim, no tempo decorrido para o processo de soma, esse valor será apresentado no monitor seerial
Serial.print(" foi o tempo de execucao por vetor, e a soma = ");
Serial.println(soma);//Apresenta o valor da soma de todas as posições do vetor1
delay(1000);
//REALIZAÇÃO DA SOMA PELO PONTEIRO
if(carregado == 1){//Se a variável de controle passar a ser 1, roda o bloco abaixo
soma = 0;//A variável soma será resetada
cronometro = micros();//Pega o tempo em que o programa já rodou em microsegundos até essa parte e guarda na variável cronometro, ou seja, é uma primeira amostra, dessa parte
for(p = &vetor1[0]; p < &vetor1[TMAX]; p ++){//Incrementa o ponteiro
soma += *p;//Soma todos os valores das posições do vetor1 e guarda na variável soma, por meio do conteúdo de cada endereço em que o poteiro esteja localizado
}
}
Serial.println("METODO USANDO O PONTEIRO");
Serial.print(micros() - cronometro);//Pega o tempo que o programa rodou até esta parte e subtrai pela 1ª amostra, resultando assim, no tempo decorrido para o processo de soma, esse valor será apresentado no monitor serial
Serial.print(" foi o tempo de execucao por ponteiro, e a soma = ");
Serial.println(soma);//Apresenta o valor da soma de todas as posições do vetor1
Serial.print("\n");
delay(10000);
//REINÍCIO DAS VARIAVEIS E CONTADORES
p = &vetor1[0];//O ponteiro irá retornar para a primeira posição do vetor
carregado = 0;//A variável de controle será resetada
soma = 0;//A variável soma será resetada
delay(500);
}
}
* 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 10 //Definido o tamanho máximo de caracteres
//DECLARAcAO DE VARIAVEIS GLOBAIS
byte vetor1[TMAX];//Vetor para armazenar os caracteres e apresentar os dados e endereços deles
byte *p;//Ponteiro para correr os endereços e os dados dos caracteres
bool carregado = 0;//Variável de controle
long cronometro;//Variável para ser armazenada uma leitura do tempo decorrido até determinada parte do programa
double soma = 0;//Variável para armazenar a soma dos valores das posições do vetor1
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600);//Porta serial inicializada com uma velocidade de 9600 bps
p = &vetor1[0];//O endereço da primeira posição do vetor1 será atribuído ao ponteiro p
}
//FUNÇÕES COMPLEMENTARES
//PROGRAMA PRINCIPAL
void loop() {
//COLETA DOS DADOS
while(Serial.available()){//Enquanto houver dado na porta, roda o bloco abaixo
if( p < &vetor1[TMAX]){//Se o endereço do ponteiro p for menor que o endereço do vetor1, roda o bloco abaixo
*p = Serial.read();//O conteúdo recebido pela porta serial será atribuído ao conteúdo do endereço em que o ponteiro p se encontra
p ++;//Incrementa o ponteiro
}else{//Se a condição apresentada não for verdadeira, roda o bloco abaixo
Serial.read();//Faz a leitura do dado recebido para não atribuí-lo às posições do vetor
carregado = 1;//A variável de controle passa a ser 1
}
Serial.print((int)(p - &vetor1[0]));//Apresenta o endereço de qual posição do vetor o ponteiro está indicando
Serial.print(" ");
Serial.println(Serial.available());//Apresenta o conteúdo da posição do vetor em que o ponteiro está localizado
}
//REALIZAÇÃO DA SOMA PELO VETOR
if(carregado == 1){//Se a variável de controle passar a ser 1, roda o bloco abaixo
cronometro = micros();//Pega o tempo em que o programa já rodou em microsegundos até essa parte e guarda na variável cronometro, ou seja, é uma primeira amostra, dessa parte
for(int count=0; count < TMAX; count ++){//Incrementa o contador
soma += vetor1[count];//Soma todos os valores das posições do vetor1 e guarda na variável soma
}
Serial.print("\n");
Serial.println("METODO USANDO O VETOR");
Serial.print(micros() - cronometro);//Pega o tempo que o programa rodou até esta parte e subtrai pela 1ª amostra, resultando assim, no tempo decorrido para o processo de soma, esse valor será apresentado no monitor seerial
Serial.print(" foi o tempo de execucao por vetor, e a soma = ");
Serial.println(soma);//Apresenta o valor da soma de todas as posições do vetor1
delay(1000);
//REALIZAÇÃO DA SOMA PELO PONTEIRO
if(carregado == 1){//Se a variável de controle passar a ser 1, roda o bloco abaixo
soma = 0;//A variável soma será resetada
cronometro = micros();//Pega o tempo em que o programa já rodou em microsegundos até essa parte e guarda na variável cronometro, ou seja, é uma primeira amostra, dessa parte
for(p = &vetor1[0]; p < &vetor1[TMAX]; p ++){//Incrementa o ponteiro
soma += *p;//Soma todos os valores das posições do vetor1 e guarda na variável soma, por meio do conteúdo de cada endereço em que o poteiro esteja localizado
}
}
Serial.println("METODO USANDO O PONTEIRO");
Serial.print(micros() - cronometro);//Pega o tempo que o programa rodou até esta parte e subtrai pela 1ª amostra, resultando assim, no tempo decorrido para o processo de soma, esse valor será apresentado no monitor serial
Serial.print(" foi o tempo de execucao por ponteiro, e a soma = ");
Serial.println(soma);//Apresenta o valor da soma de todas as posições do vetor1
Serial.print("\n");
delay(10000);
//REINÍCIO DAS VARIAVEIS E CONTADORES
p = &vetor1[0];//O ponteiro irá retornar para a primeira posição do vetor
carregado = 0;//A variável de controle será resetada
soma = 0;//A variável soma será resetada
delay(500);
}
}
- Thiaguin
- Mensagens : 203
Data de inscrição : 03/03/2020
Re: Exercício 4.16
Seg Nov 15, 2021 8:19 pm
Agr sim, testei e funcionou direitinho, só q eu diminuí o tamanho do vetor pra ficar mais rápido
Re: Exercício 4.16
Ter Nov 23, 2021 11:53 pm
Oi Thiago, Testei e usei 500 bytes no tamanho, fica mai nítido os tempos de execução. E neste programa o tempo de execução por ponteiro foi 5 vezes mais rápido que por vetor.
Nota 10.0
Nota 10.0
Permissões neste sub-fórum
Não podes responder a tópicos