Maintenant, le code que jécris dans Arduino (en utilisant Arduino) utilise plusieurs tableaux à 2 dimensions. Maintenant quand Jimprime quelque chose en utilisant Serial Monitor, il limprime correctement mais lorsque je déclare et initialise le tableau bidimensionnel, il ne limprimera pas.
Code:
void setup() { Serial.begin(9600); int image_width = 56; int image_height = 96; int image_result[image_width][image_height]; for (int i=0; i<image_height; i++) { for (int j=0; j<image_width; j++) { image_result[j][i] = 5; } } Serial.print("code works"); }
Dans ce cas, » code works « ne simprime pas mais lorsque je supprime la déclaration du tableau et que le code dinitialisation fonctionne. Quel est le problème?
Les tableaux à 2 dimensions fonctionnent-ils différemment dans Arduino ou est-ce un problème despace?
Commentaires
- Même un tableau unidimensionnel de 5376 octets, sur un processeur de 2048 octets, échouera.
- Je voulais dire, 10752 octets. Jai oublié que chaque élément du tableau est de 2 octets. Gardez à lesprit que vous navez même pas ‘ tous ces 2048 octets disponibles. Les tampons de transmission et de réception série utilisent à eux seuls 128 octets.
- Eh bien, si je connecte une voiture micro-SD, y a-t-il une méthode pour déclarer un tableau dans cette mémoire?
- Vous pouvez connecter un Carte SD et écrivez des données dans le contenu de votre ‘. Cependant, vous pouvez ‘ t » déclarer le tableau en mémoire » dessus. Quelle est votre application ici? Un Arduino avec 2 Ko de RAM nest ‘ t la meilleure chose pour le traitement dimage.
- Jai besoin de lire un petit fichier BMP dans un tableau dentrées dans Arduino et besoin de faire un traitement là-dessus. Et la taille du fichier est de 56 par 96 pixels.
Réponse
Les tableaux 2D fonctionnent bien sur arduino, mais vous manque despace très rapidement.
Un uno a 2 kilo-octets de RAM; votre tableau contient 56 * 96 = 5376 éléments de 2 octets.
Je suppose que vous écrivez sur une valeur de mémoire critique avec un 5 à un moment donné, ce qui fait échouer le programme.
Commentaires
- Non seulement sur la mémoire, mais probablement aussi sur tous les registres dE / S.
- Adressage 16 bits, avec SRAM commençant à 256. Pour que ‘ s 65 279 octets despace dadressage. Vous n’avez donc pas ‘ atteindre cet objectif. De plus, je ‘ suis presque sûr quil existe une sorte de protection qui empêche que cela se produise.
- Il ny a pas de protection. Les registres CPU sont mappés en mémoire à partir de ladresse 0, puis les registres dE / S à partir de ladresse 32, puis la RAM allouée statiquement commence à ladresse 256.
Réponse
Vous essayez dutiliser plus de mémoire que vous nen avez disponible: 96 * 56 * 2 = 10,752 Ko. Le MCU ne peut pas faire grand-chose lorsque cela se produit.
Si vous regardez la fiche technique , vous « verrez que votre microcontrôleur (ATmega328p) ne dispose que de 2 Ko de RAM.
Je suppose que la question est alors de vous demander si vous avez vraiment besoin dun tableau aussi grand. Vous pouvez envisager de vous procurer une puce flash externe ou un bouclier de carte SD. Si vous nen avez besoin quà des fins de lecture seule (comme une recherche table), vous pouvez utiliser une partie de votre mémoire flash de programme (vous avez 32 Ko).
Commentaires
- Je ‘ m en utilisant une carte SD mais je ‘ lisant les données dans un tableau déclaré comme ceci. Comment pourrais-je utiliser la mémoire de la carte SD?
- Vous navez ‘ généralement pas besoin de gérer les 5376 éléments de votre tableau en un instant. Considérez diviser votre image en morceaux plus petits pour le traitement. Selon le type de traitement que vous effectuez, vous pouvez avoir besoin de différentes intelligences pour optimiser le processus . 😉
- Peut-on écrire encore et encore des données sur la mémoire flash. Quentendez-vous par lecture seule? Comment écrire les données une fois dessus. Par exemple, je veux écrire les données dimage sur la mémoire flash. Comment vais-je pouvoir le faire?
- Je fais référence à la mémoire flash de votre programme. AFAIK, vous ne pouvez écrire dans le flash du programme que pendant la programmation. Une fois que vous démarrez votre MCU, le programme flash est utilisé comme mémoire en lecture seule (de sorte que nous ‘ ne gâcherons pas le programme quand il ‘ s en cours dexécution.) Puisque vous souhaitez écrire vos données, le programme flash nest pas adapté.
- Avez-vous vraiment besoin de traiter limage entière en une seule fois? Comme je lai ‘ mentionné précédemment, vous pouvez diviser votre image en blocs plus petits, par exemple chunk [8] [8] serait une taille confortable pour Arduino pour avalez, et cela fonctionne bien même si vous utilisez des filtres à convolution. (Cela dit, je dois souligner que lArduino Uno est mal adapté à toute application sérieuse de traitement dimage.)
Réponse
En effet, il sagit dun problème de RAM disponible.Si vous navez pas besoin de 8 bits par élément de données (si vous souhaitez peut-être réduire la qualité de limage, par exemple), envisagez de compacter vos données de manière à disposer de plusieurs éléments de données par bit. Par exemple, les valeurs hexadécimales ou BCD (décimales codées en binaire) pourraient fonctionner, selon la taille de chaque élément de données.
Commentaires
- LOP veut lire un fichier BMP en mémoire, donc je doute quil puisse être transformé en BCD très utilement.
- Cest ‘ un bon point. Peut-être est-il ‘ prêt à réduire considérablement la qualité de l’image? Dans tous les cas, un stockage supplémentaire serait judicieux.
Réponse
Comme dautres lont noté, votre tableau est plus grand que la RAM disponible dans votre Arduino. Dautres ont mentionné la mémoire Flash qui pourrait être une solution pour vous. Votre Arduino dispose de 32 Ko de mémoire qui pourraient contenir votre matrice. Consultez la référence suivante pour plus dinformations sur la mémoire Flash. Gardez à lesprit que Flash et EEPROM ont un nombre limité de cycles décriture avant de devenir peu fiables.
Réponse
Dans le cas où la matrice est presque vide ou a de toute façon des valeurs qui peuvent être calculées par programme, des tableaux clairsemés pourraient venir à la rescousse. Cela nécessite une allocation de mémoire et des sauts, donc le temps daccès aux éléments individuels nest pas déterministe, mais vous pouvez calculer le pire des cas.
Réponse
Voici ce que jai nourri mon Uno:
#define IMAGEWIDTH 56 #define IMAGEHEIGHT 96 void setup() { Serial.begin(9600); int i, j; int image_result[IMAGEWIDTH][IMAGEHEIGHT]; for (i = 0; i < IMAGEWIDTH; i++) { Serial.print("\nIMAGEWIDTH "); Serial.print(i + 1); Serial.println(":"); for (j = 0; j < IMAGEHEIGHT; j++) { image_result[i][j] = i + j; Serial.print("image_result["); Serial.print(i + 1); Serial.print("]["); Serial.print(j + 1); Serial.print("]: "); Serial.println(image_result[i][j]); } } Serial.println(F("\nDone!")); } void loop() { }
Ce fonctionnera sur lensemble de la matrice, tout en imprimant la progression sur Serial, qui affichera ensuite « Terminé! » une fois que cest le cas. Je suggère de changer:
#define IMAGEWIDTH 56 #define IMAGEHEIGHT 96
En valeurs moindres, sauf si vous avez quelques bonnes minutes à portée de main.
Commentaires
- Cela ne résoudra pas du tout son problème. Ce nest pas ‘ t fois, cest la taille du tableau. 56 * 96 * 2 (un entier fait deux octets) utilise 10752 octets. Votre Uno a 2048 octets. Le problème nest pas le temps, cest le stockage.
- Nick avait raison, cela na ‘ résolu mon problème. Quoi quil en soit, merci davoir essayé.