Pages: [1] 2   Go Down
Author Topic: Taille des programmes  (Read 1370 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
J'ai dans l'idée de développer un programme plutôt conséquent pour ma nouvelle carte Arduino Uno.
Or je vois que par exemple l'exemple basique de serveur web de 30 lignes occupe à lui seul déjà plus de 40% de la mémoire...
Je me pause donc des questions quand à la faisabilité d'un projet dont le code devrait faire plus de 10 000 (c'est un serveur web plus ou moins basique).
Merci
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 143
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu va devoir optimiser ton code. Ensuite, pour ce qui est des pages à retourner, elles peuvent être stoquées sur une carte sd. C'est toujours ça de moins (et je suppose que c'est une grosse partie du code). Ça demande pas beaucoup d'investissement matériel, d'autant que les shield ethernet et wifi ont un slot pour microSD. Si ton shield n'est pas un officiel, et qu'il n'en a pas, un adaptateur microSD classique et 6 résistances font l'affaire.
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Utilise webduino pour le serveur web smiley-wink
Ensuite met tout le code des pages HTML sur une carte SD, optimise ton code autant que possible, etc ...
Le nombre de ligne ça ne veut rien dire, tu peut faire un programme d'une ligne qui prennent 100% de la mémoire, comme un programme de plusieurs centaines de ligne qui en prennent 30% smiley-wink
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

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

Merci.
Enfin quand je dis taille dans la mémoire, je parle de celle du programme non des variables..etc Il y a quand même corrélation entre longueur et taille d'un programme.
Bien sur les pages web seront stocké sur une carte sd, j'ai un shield officiel.
Est il possible au passage d’exécuter du code puis la carte SD ?
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Enfin quand je dis taille dans la mémoire, je parle de celle du programme non des variables..etc Il y a quand même corrélation entre longueur et taille d'un programme.
Pas forcément smiley-wink

Code:
const char PROGMEM s[30720] = { 0 };
Et voila en une ligne j'ai mis à genoux toute la mémoire flash du microcontrôleur/

Le compilateur fait un sacré paquet de truc dans ton dos, il ne faut pas croire qu'une ligne de C = une instruction assembleur.
Quand le compilateur optimise (et si tu lui as préparé le terrain) il peut te faire passer des codes de +1000 lignes (de codes, pas de commentaires) dans moins de 2Ko.
Par contre si tu fait les choses à la truelle il te sortira des codes de 100 lignes qui font 16Ko ou plus.

Est il possible au passage d’exécuter du code puis la carte SD ?
Lit ça http://fr.wikipedia.org/wiki/Architecture_Harvard smiley-wink
Réponse : non, c'est physiquement impossible.

Si tu veut vraiment faire ça tourne toi vers la netduino, c'est du C# -> machine virtuelle -> exécution de code depuis n'importe où.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

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

Quote
Réponse : non, c'est physiquement impossible.

Tu n'est pas un peu catégorique là ? La famille AVR ont la capacité de se reprogrammer
tout en exécutant du code (flash memory with read-while-write capabilities). C'est ce qu'utilise
le bootloader de l'arduino.
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu n'est pas un peu catégorique là ?
Exécuter du code depuis une carte SD est impossible, je suis ca-té-go-ri-que.
L'architecture du CPU ne le permet pas, tout comme l'exécution depuis la RAM.

La famille AVR ont la capacité de se reprogrammer tout en exécutant du code (flash memory with read-while-write capabilities).
Tu lit de travers smiley-wink
"read while write" = "lecture pendant écriture", il n'est jamais fait état d'une quelconque possibilité d’exécuter du code.
Pouvoir reprogrammer la flash en interne n'est pas du tout pareil que d’exécuter du code depuis un périphérique de stockage externe !

C'est ce qu'utilise le bootloader de l'arduino.
Attention : un bootloader n’exécute pas de code, il copie du code, c'est pas du tout la même chose.
Au final le code est bien dans la mémoire flash de l'AVR.

Des bootloaders par carte SD pour arduino ça existe (cherche sur le forum ou sur google smiley-wink) mais il prennent de la place et limite donc d'autant la place libre pour ton programme.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

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

Je suis tout a fait d'accord avec tes explications. Mais la question initiale était:

Quote
Est il possible au passage d’exécuter du code puis la carte SD ?

Je suis d'accord de le cpu ne peut adresser directement le code dans la carte SD. Par contre
il est capable de se reprogrammer partiellement avec du code provenant de la carte SD. puis
de l'exécuter dans sa mémoire flash. Donc je trouve trop catégorique de répondre que c'est
physiquement impossible.
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Je suis d'accord de le cpu ne peut adresser directement le code dans la carte SD. Par contre
il est capable de se reprogrammer partiellement avec du code provenant de la carte SD. puis
de l'exécuter dans sa mémoire flash. Donc je trouve trop catégorique de répondre que c'est
physiquement impossible.
Tu le dit toi même : "le cpu ne peut adresser directement le code dans la carte SD", l’exécution depuis la carte SD est donc bien physiquement impossible.
Il faut utiliser les termes adéquats, "exécuter depuis" et "copier depuis" n'ont pas la même finalité !

Remarque : copier un programme partiellement n'est pas une bonne idée. Cela voudrait dire que tu vas gérer un système de pagination, copier les pages manquantes dynamiquement, etc etc ...
Autant dire que tu auras flinguer la mémoire flash avant que ton système soit fonctionnel (la mémoire flash n'as pas une durée de vie infini en écriture).
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

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

Quote
Tu le dit toi même : "le cpu ne peut adresser directement le code dans la carte SD", l’exécution depuis la carte SD est donc bien physiquement impossible.
Il faut utiliser les termes adéquats, "exécuter depuis" et "copier depuis" n'ont pas la même finalité !

Pareil pour la Flash, le CPU n'exécute pas le code depuis la flash, mais copie l'instruction dans l'unité de traitement. Donc on peut jouer sur les termes adéquats
pendant longtemps smiley

Ce que je trouve dommage en disant simplement que c'est "physiquement impossible", c'est que tu coupe court à une voie de recherche possible qui consiste à placer
du code dans la SD card. Que ce soit du code AVR ou un autre type de code interprété n'est pas bien important. C'est pour ça que je suis intervenu, car la question
de l'auteur de ce post porte sur la possibilité d'avoir un programme conséquent. Et si il atteint les limite du CPU, alors la voie de placer du code dans la SD card
est à évaluer.

J'approuve par contre que le fait de reprogrammer la flash a ses limites.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 110
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pour ce qui est de la mémoire si une librairie est utiliser une seul de ses fonctions peut valoir énormément de lignes de c derrière qui elle seul val plusieurs centaine voir millier de lignes d'assembleur

marcha
Quote
Ce que je trouve dommage en disant simplement que c'est "physiquement impossible", c'est que tu coupe court à une voie de recherche possible qui consiste à placer
du code dans la SD card

je suis d'accord avec skywodd l'architecture Harvard a été conçu de sorte a fonctionne d'une manière bien précise, aucun programme ne pourra changer cela, ça peu choquer les doux rêveur, mais la programmation ne fait pas de son utilisateur un dieu  smiley-lol

« Last Edit: April 29, 2013, 06:51:07 pm by lacolombenoir » Logged

www.hatokuro.comuf.com site consacrer au rétrogaming

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

Quote
aucun programme ne pourra changer cela

Rien ne t'empêche de programmer un interpréteur qui vas traiter du code dans un langage quelconque
situé en RAM, en EEPROM, ailleurs dans la Flash ou sur tout autre support.

Voici un topic qui en parle:
http://stackoverflow.com/questions/4106320/fast-interpreted-language-for-memory-constrained-microcontroller

Bien sur on perd en performance avec une couche supplémentaire, mais suivant les applications cela peut être une solution.

Exemple en Basic avec une SD Card: http://hackaday.com/2012/05/01/arduino-basic-interpreter-using-lcd-keyboard-and-sd/
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pareil pour la Flash, le CPU n'exécute pas le code depuis la flash, mais copie l'instruction dans l'unité de traitement. Donc on peut jouer sur les termes adéquats
pendant longtemps smiley
Le fait qu'il y ai une étape de "fetch, hold and execute" vers le registre d'instruction du CPU c'est chercher la petite bête pour avoir raison ...
Le cpu fait de l'adressage sur la mémoire flash pour l'exécution, c'est la définition même d'une exécution depuis une source quelconque, ici la flash.
Dans un processeur x86 (ou autre) avec un cache d'exécution je serait plus mitigé, mais ici il n'y a pas de cache ...

Ce que je trouve dommage en disant simplement que c'est "physiquement impossible", c'est que tu coupe court à une voie de recherche possible qui consiste à placer
du code dans la SD card. Que ce soit du code AVR ou un autre type de code interprété n'est pas bien important. C'est pour ça que je suis intervenu, car la question de l'auteur de ce post porte sur la possibilité d'avoir un programme conséquent. Et si il atteint les limite du CPU, alors la voie de placer du code dans la SD card
est à évaluer.
Seul Alatar serait en mesure de dire ce qu'il veut vraiment faire smiley-wink

Mais je pense très sérieusement que Alatar n'as pas envie de faire une machine virtuelle, un compilateur/assembleur et/ou un langage de programmation dédié pour son projet.
A mon avis tout ce qu'il veut savoir c'est si il peut coller son programme AVR tel quel sur une carte SD et le lancer sans se casser la tête, chose impossible.

Ensuite il ne faut pas tout mélanger !
Code compilé natif, bytecode pré-compilé (+ machine virtuelle), code interprété (script texte), ... ce n'est pas la même chose !

Un code natif tourne à la vitesse processeur, 16Mips environ (chaque instruction ne fait pas 1 tick d'horloge mais on va pas chipoter) sur un arduino classique.
Un code pré-compilé, si tu arrives à faire du 100Kips c'est déjà un miracle (je le sait puisque je code une machine virtuelle en ce moment même. 100Kips = 1600 tick cpu (à 16MHz) par instruction = pas grand chose en fait).
Un code interprété ... 1 Kips, 2Kips grand maximum ... une vrai misère ...

Et ne pas oublier que coder un langage de script requiére des connaissances par forcément évidente, ni à la porté de tous ...
Faire une machine virtuelle requiére des connaissances en conception d'émulateur CPU et de programmation assembleur.
Faire un moteur de script requiére des connaissances en langage de script (forcément) et en manipulation de texte (parsing, tokenisation, ...).

Rien ne t'empêche de programmer un interpréteur qui vas traiter du code dans un langage quelconque
situé en RAM, en EEPROM, ailleurs dans la Flash ou sur tout autre support.
(...)
Bien sur on perd en performance avec une couche supplémentaire, mais suivant les applications cela peut être une solution.
Tu sembles oublier un point : ce n'est plus du tout de "l'arduino", voir même du C/C++.
Apprendre la syntaxe du BASIC (ou autre) c'est bien beau mais tu perd bien plus que des performances, tu perds aussi tout le travail réalisé par les autres membres (librairies, codes, tuto, ...).
Dans certaines circonstances cela peut effectivement être d'une grande utilité mais là ce n'est clairement pas le cas ...

Âpres d'un point de vue code rien ne t'empêche de concevoir (où de porter) un émulateur d'AVR8 + hardware ATmega sur un ATmega ...
Par contre tout ce qui sera lié au temps sera faussé ...
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

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

Je ne remet pas en question tout ce que tu dis. Mais il n'y a pas que l'auteur d'un post qui est concerné
par ce que tu écrit. Cela sert de base de connaissance pour d'autres qui tomberont sur ce topic.

Poser des dogmes tels que "c'est physiquement impossible" c'est fermer la porte à d'autres pistes qui
peuvent intéresser d'autres lecteurs.

Ceci dit maintenant qu'un bon nombre de possibilités ont été débattues. Ce post me semble assez complet.

Je te laisse donc poster le dernier mot :-)
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 110
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Comme dit plus haut seul une machine virtuel pourrais émuler la lecture d'un programme hors de l'eeprom (un peu comme java) mais ce principe rend la lecture des programmes lente et lourde,
personnellement pour m'être frotter a l'assembleur du x86 j'imagine sans peine le travaille titanesque qu'une machine virtuel demanderais sur l'ATmega328,

Ma conclusion est qu'une machine virtuel est faisable mais difficile et peu efficace,
Pour ce qui est d'exécuter un programme sans passer par l'architecture Harvard prévu a cette effet est physiquement impossible.
Logged

www.hatokuro.comuf.com site consacrer au rétrogaming

Pages: [1] 2   Go Up
Jump to: