Pages: [1] 2   Go Down
Author Topic: Memória do Mega cheia  (Read 3647 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Boas pessoal.

Eu estou a trabalhar com o MEGA para desenvolver um programa que tem implementados 'alguns' arrays de valores.
A situação é que quando eu tenho algumas variaveis declaradas como locais, a memória ocupada é substancialmente menor aquela que verifico quando declaro essas mesmas variaveis fora de uma função, ou seja, passando elas a ser globais do programa.
Agora, que continuei a programar, a cada ciclo if ou for que implemento, mesmo por muito 'pequeno' que ele seja (poucas linhas de código), a memória do arduino aumenta mesmo muito.
Anteriormente nao verificava nada semelhante quando implementava todo o restante codigo. Acho isto um bocado estranho e não sei se haverá forma de contornar isto. Tinha um UNO e tive de mudar para um MEGA.
Como estou a usar e a endereçar muitos arrays, não sei se poderá ser isto que esteja a encher-me a memória da controlador.

Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Esse 'alguns'... é que é interessante nesta conversa. Isso e o código... sem eles nada se pode fazer, não te parece?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Jr. Member
**
Karma: 0
Posts: 51
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sem o código fica difícil de ajudar.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

aqui está o código.

* Intervalos_teste11.ino (72.85 KB - downloaded 49 times.)
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Que sabes de programação? E mais concretamente, das limitações do Arduino?

Eu nem contei os arrays nem os tamanhos... mas parecia gigantesco e muito provavelmente não deve funcionar muito bem.

Tendo em conta que estás a usar probabilidades, assumo que os numeros sejam sempre menores que 101, logo podes trocar o tipo de dados int por "unsigned char" e automaticamente reduzes o tamanho de memória usada para metade. Nota que a memória que eu estou a falar é RAM, não flash uma vez que não meteste lá os teus arrays.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vou fazer essa troca de endereçamento e tentar ganhar mais algum espaço na memória.

Já coloquei todos os 'print' na flash.

Falaste em colocar os arrays na flash, sabes dizer-me onde posso encontrar informação para fazer isso?

Thanks
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Fiz aqui umas contas com o compilador...

Portanto, tu tens, da forma que meteste aqui o programa um total de 18294 bytes de memória de programa, ou seja, todas as variáveis em memória.

Ao colocar todas as variáveis em Flash (nota que ao fazer isso, não as podes alterar), o programa passa para 36146 bytes.

Isto quer dizer que os teus arrays ocupam qualquer coisa como 17852 bytes. o Arduino tem 8k de RAM... logo a minha questão é: Isto alguma vez funcionou ou correu no chip?

Ao alterares o tipo de dados como disse, para unsigned char o tamanho ocupado seria reduzido para metade, ou seja, 8926... mesmo assim não funciona.

Para meteres os dados na Flash, fazes assim:

Colocas isto no topo:

Code:
#include <avr/pgmspace.h>

E defines os teus arrays assim:

prog_int8_t Primavera_D_prob_iluminacao[96] PROGMEM = {10, 30, 100, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 10, 10, 10, 10, 10};

Tens aqui uma explicação: http://arduino.cc/en/Reference/PROGMEM

Mas mais importante de tudo, o que pretendes atingir com isto? E porque motivo tens tantos arrays? Não haverá uma maneira melhor? Queres explicar a ver se alguém te pode orientar para algo mais... realista?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sim isto já correu. Para correr novamente basta fazer uma pequena alteração e o MEGA funciona na perfeição.

Pois, bem, dado isto, os meus arrays são o que me estão a consumir a maior parte da memória. Se os passar para a flash vou ter um outro problema que se prende com o aceder aos diferentes valores nas diferentes posições dos mesmos.
Pelo que vi na PROGMEM, não é propriamente fácil faze-lo..penso que só mesmo com ponteiros poderia aceder aos dados.

Este código, com tantos arrays, tem a ver com o processo inicial de uma tese de Mestrado, posteriormente ainda ficará algo mais 'pesado' mas, por agora, esses mesmos arrays simulam variáveis que na realidade existem e que, desta forma, estou a simular em código.
 
Como me elucidaste, se eu declarar os meus arrays como unsigned char eles ficarão assim:
Code:
unsigned char Primavera_D_prob_iluminacao[96]  = {10, 30, 100, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 30, 5, 10, 50, 70, 10, 50, 80, 20, 10, 10, 10, 10, 10, 10};

À semelhança dos arrays poderei transportar e aplicar esta alteração para as diversas váriaveis que declarei como int correcto?

Obrigadão aí pela ajuda  smiley-wink
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Um array é um ponteiro... logo não tens de estar a pensar nisso.

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tou a pensar usar uma Shield para SD card.
Usando este método será que posso libertar algum espaço da RAM do Arduino gravando variáveis no cartão de memória?
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu não faria isso... ao meteres um cartão SD, perdes tempo a aceder e gastas memória RAM para acederes à memória do SD. Da última forma que eu te expliquei, para teres os dados em flash, não devias ter problema algum e deves ficar com mais memória livre do que se estiveres a usar um SD card.

Explicares o que pretendes, por norma, permite-nos ajudar-te um pouco mais...
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A situação é, como já falei, o uso de muitos arrays no código.
Quando faço a leitura dos diversos valores dos arrays a minha memória vai-se enchendo de forma rápida, chegando a um ponto em que quando faço upload para o MEGA este fica com o led do pino 13 a piscar. Penso que este piscar esteja relacionado com o ultrapassar da memória RAM.

Falaste-me na PROGMEM e eu já enderecei os meus arrays dessa forma e quando compilo, o tamanho do programa é o mesmo do que com o endereçamento directo anteriormente efectuado.
Depois deste endereçamento obtive alguns problemas com a leitura dos valores nas diferentes posições dos arrays. Em nenhum dos casos o valor retornado foi aquele que deveria ter sido. Possivelmente terei algum problema com esta parte do código.

Depois disto lembrei-me de poder usar um micro SD mas decidi perguntar aqui se isso seria vantajoso ou mais problemático ainda. 

Contudo, pesquisei e encontrei uma livraria que pode ajudar-me. http://arduiniana.org/libraries/flash/comment-page-3/#comment-105688

Se quiseres ver o código para te situares melhor com o problema posso colocá-lo aqui.

Obrigado
Logged

Aracaju, SE, Brasil
Offline Offline
Sr. Member
****
Karma: 4
Posts: 323
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se com e sem o PROGMEM o seu programa está com o mesmo tamanho, você está com algum problema com o PROGMEM. Tenta fazer um exemplo bem simples, só para verificar se o compilador está funcionando bem com o PROGMEM.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Coloca aqui o código...

Eu testei a instrução que deixei aqui para ti e estava a funcionar, logo há qualquer coisa que não está correcta. Mete o código aqui e a gente vê.

Quando pedi para explicares o que estás a fazer não me referia a dizeres que tens um problema com muitos arrays... referia-me a explicares o que o teu programa vai fazer para que a gente te possa indicar outra maneira de fazer isto sem uma quantidade ridícula de variáveis.
Nota que se por algum motivo o programa não estiver a fazer o que pretendes, vais passar um mau bocado para descobrir o que se passa de errado.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

O código tem como objectivo simular a actuação de dadas saídas em função de uma conjugação de variáveis. Variáveis essas que serão relacionadas com a probabilidade de, em cada instante, uma ou várias saídas serem ou não accionadas.

O código está colocado em anexo.

* Intervalos_teste11.ino (74.97 KB - downloaded 21 times.)
Logged

Pages: [1] 2   Go Up
Jump to: