π
<-
Chat plein-écran
[^]

Script qui refuse de s’exécuter sur la Numworks N0100

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby critor » 07 Sep 2019, 18:11

cent20 wrote:
critor wrote:Il faut réduire le nombre de lignes, utiliser des noms de fonctions/variables courts, éviter les commentaires, factoriser le code... et encore ça ne suffit pas toujours.


On a déjà épuisé le stock de possibilité ... Raccourcir tous les noms fut la première chose qu'on a fait, c'était tellement trivial que je ne l'ai pas précisé.


Il y a d'autres possibilités que le renommage pour raccourcir du code Python, notamment concernant la belle collection d'instructions conditionnelles ou de chaînes qui diffèrent à de petits détails près. Par contre elles nuisent plus ou moins à la lisibilité du code et donc à sa compréhension et maintenance.

Voici une version du même code très sauvagement compressée
(toutes mes excuses)
à seulement 2,5Kio :
Code: Select all
from math import sqrt
a,b,c=0,0,0
def dct():
    global a,b,c,d,e,nb,x,y,x1,x2
    while a==0:a=o(float(input('a=')))
    b,c=o(float(input('b='))),o(float(input('c='))),
    d,e,x,y=o(float(b**2-4*a*c)),o(float(a*(-b/2/a)**2-b*b/2/a+c)),o(-b/2/a),o((sqrt(abs(b**2-4*a*c)))/2/a)
    nb,x1,x2=2-(d==0),o(min(x+y,x-y)),o(max(x-y,x+y))
def h():
    o(9,br=1)
    print("Polynome (equation) de degre 2",a==0 and "\nP(x)=ax^2+bx+c(=0)" or "\nP(x)={}{}{}(=0)".format(o(a,ap="x^2",r=4),o(b,p=1,ap="x",r=4,naf=1),o(c,p=1,r=4,naf=1)))
def p():
    s=d<0 and "<0" or d>0 and ">0" or ""
    print("1)Changer les valeurs a,b,c","\n2)Discriminant={}{}".format(d,s))
    if d<0:print("3)Racines complexes conjuguees:2","\nz1={}+{}i".format(x, y),"\nz2={}-{}i".format(x, y))
    elif d>0:print("3)Racines reelles distinctes:2","\nx1={}".format(x1),"\nx2={}".format(x2))
    elif d==0:print("3)Racine reelle double:1","\nx1=x2={}".format(x))
    s=a<0 and "-" or "+"
    print("4)Signe:"+(d<0 and s or d>0 and s+"-+"[a<0]+s or s+"0"+s),"\n, extremum:"+"mM"[a<0],"\n5)Factorisation dans les "+(d<0 and "complexes" or "reels"),"\n6)Quitter")
def r(i):
    global a,b,c,d,x,y
    if i==1:
        a,b,c=0,0,0
        h()
        dct()
    elif i==2 or i==3 or i==6:pass
    elif i==4:
        h()
        s=a<0 and "-" or "+"
        print(d>0 and "  x |    x1  -b/(2a)  x2",a>0 and "\nP(x)|  "+s+"  0  -  m  -  0  "+s or "\nP(x)|  "+s+"  0  "+"+-"[a<0]+"  M  "+"+-"[a<0]+"  0  "+s or "  x |        -b/(2a)\nP(x)|     "+s+"     m     "+s,"\nExtremum:","\n(",o(-b/2/a,r=4),";",o(e,r=4),")")
    elif i==5:
        if d==0:print("P(x)=a(x-(-b/2a))^2",x1 and o(-x1,"\nP(x)={}(x".format(a),")^2",p=1) or "\nP(x)={}x^2".format(a))
        elif d>0:print("P(x)=a(x-x1)(x-x2)",o(-x2,o(-x1,"\nP(x)={}(x".format(a),")(x",p=1,naf=2,r=4),")",p=1,naf=2,r=4))
        else:print("P(z)=a(z-z1)(z-z2)\nAvec:",o(-x,"\n(z-z1) = (z",o(y,ap="i",r=4,naf=1)+")",r=4,naf=2),o(-x,"\n(z-z2) = (z",o(-y,ap="i",r=4,naf=1)+")",r=4,naf=2))
    if (i-6)*(i-1):input()
def o(v,av="",ap="",p=0,r=8,naf=0,br=0):
    if br==0:
        if v==0:return naf==1 and "" or naf==2 and str(av)+str(ap) or str(av)
        v=v==int(v) and int(v) or round(v,r)
        if av=="" and ap=="" and p==0:return v
        if p==1 and v>0:v="+"+str(v)
    return str(av)+str(v)+str(ap)
def m(w=""):
    h()
    p()
    if w!="":print(w)
    s=0
    while s==0:
        try:s=int(input())
        except:
            s=0
            m(">>saisir un entier entre 1 et 6!")
    r(s)
    if s!=6:m()
o(9,br=1)
r(1)
m()


Et elle marche :
Image

Je dirais à la louche qu'il reste en prime un bon 1Kio de marge sur NumWorks pour compléter/embellir ce code sans erreur de mémoire à l'exécution, donc une belle marge pour obtenir un code fonctionnel qui fasse moins peur aux élèves. :)
Image
User avatar
critorAdmin.
Niveau 18: DC (Deus ex Calculatorum)
Niveau 18: DC (Deus ex Calculatorum)
Level up: 99.7%
 
Posts: 34079
Images: 8830
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
Class: Lycée
YouTube: critor3000
Twitter: critor2000
Facebook: critor.ti

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby Lionel Debroux » 07 Sep 2019, 21:17

Le manque de RAM disponible sur les machines NumWorks tournant l'epsilon habituel est dû à deux énormes éléments dans la section .bss:
*
Code: Select all
Poincare::Init::pool
, ici 0xD558 octets;
*
Code: Select all
AppsContainer::sharedAppsContainer()::appsContainerStorage
, ici 0x183C0 octets.
Rien de nouveau, au moins cette deuxième variable a déjà été pointée, avec plus de détails, par Jean-Baptiste Boric dans un des autres topics.

C'est dans cette deuxième qu'est stocké le tas Python passé à MicroPython::init(): Code::App:m_pythonHeap (dans apps/code/app.h).
Comme Jean-Baptiste l'avait écrit, l'application la plus gourmande en stockage n'est pas Code. Avec epsilon Git HEAD, on peut augmenter Code::App::k_pythonHeapSize de 16384 à 32768 sans changer la taille prise en RAM par appsContainerStorage. On ne peut pas aller significativement plus loin: k_pythonHeapSize = 40960 (+0x2000) fait passer la taille d'appsContainerStorage à 0x19db0, ce qui représente donc une augmentation assez proche de 0x2000.

Peut-être que ça permettra de tourner des programmes un peu plus complexes, mais ça ne changera rien au fait qu'il n'y ait pas plus de 16 KB de stockage pour les scripts. Ca doit être Ion::staticStorageArea (0x400C octets). Les machines n'ont pas assez de RAM pour utiliser ce style de programmation, on le sait, et je pense que c'est une grosse erreur de ne pas avoir remédié à ce point en concevant la N0110...

Comment est-ce qu'on fait un build pour N0100, déjà ? EDIT: `make MODEL=n0100`, on dirait. EDIT2: ou peut-être mieux, `make build/device/n0100/epsilon.bin` ?
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxModo.G
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 5.4%
 
Posts: 6408
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
Class: -
GitHub: debrouxl

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby parisse » 08 Sep 2019, 07:09

D'ailleurs, quelqu'un sait a quoi sert cette variable pool? Peut-on reduire sa taille de moitie par exemple?
User avatar
parisseVIP++
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Level up: 84.2%
 
Posts: 1843
Joined: 13 Dec 2013, 16:35
Gender: Not specified

Online

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby cent20 » 08 Sep 2019, 07:30

critor wrote:Il y a d'autres possibilités que le renommage pour raccourcir du code Python, notamment concernant la belle collection d'instructions conditionnelles ou de chaînes qui diffèrent à de petits détails près. Par contre elles nuisent plus ou moins à la lisibilité du code et donc à sa compréhension et maintenance.

Voici une version du même code très sauvagement compressée
(toutes mes excuses)
à seulement 2,5Kio :

(...)

Je dirais à la louche qu'il reste en prime un bon 1Kio de marge sur NumWorks pour compléter/embellir ce code sans erreur de mémoire à l'exécution, donc une belle marge pour obtenir un code fonctionnel qui fasse moins peur aux élèves. :)


C'est quand même assez impressionnant de diviser la taille d'un script ainsi en seulement 1h20 :~o .
Si je ne connaissais pas le script d'origine j'aurais quand même bien du mal à le lire celui là !

Merci beaucoup en tout cas , je vais étudier les différentes astuces utilisées et retenir la limite de 4ko pour les scripts suivants.

Code: Select all
print("...",a==0 and "..." or "..")


est très intéressant, tout comme :

Code: Select all
s=d<0 and "<0" or d>0 and ">0" or ""


C'est vraiment ultra flexible python, ces tests au sein d'une égalité ou d'un print n'étaient pas évident à comprendre et encore moins à deviner.

Bon du coup comme tu as aussi coupé il a quelques éléments du menu qui sont désactivés, c'est le prix à payer pour l'exécuter j'ai l'impression.

A voir si avec 1ko de marge on réussit à les réintégrer.

Pour ceux qui veulent le tester sur l'émulateur numworks : polynome_degre2_zip.py
Bonjour Anonymous !

Intéressé par la spécialité NSI en 1ère
?
Visite donc
https://nsi.xyz !
User avatar
cent20Premium
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Level up: 8.5%
 
Posts: 158
Images: 9
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby Lionel Debroux » 08 Sep 2019, 07:47

@parisse: le pool est fait pour stocker les TreeNode utilisés un peu partout comme opérande et résultat d'opération d'epsilon.

En pièce jointe à ce post, un build d'epsilon pour N0100 avec k_pythonHeapSize = 32768, ainsi que -Wl,--gc-sections dans les flags de build ( https://github.com/numworks/epsilon/pull/1062 ). Il a été obtenu par `make build/device/n0100/epsilon.bin`, et critor l'a testé tôt ce matin: il a pu flasher la calculatrice avec succès - j'ignore quel outil il a utilisé, peut-être un WebDFU ? - et son script habituel d'obtention de la taille de la mémoire rend 32204 plutôt qu'une valeur inférieure à 16 KB.
@cent20: peut-être que ce changement ça permettra de tourner des scripts un peu moins pas complexes sans avoir à rendre le code source moche ?

Si ça augmente la complexité des scripts qu'on peut traiter sous Epsilon, je fais une pull request pour ce one-liner, en linkant ce topic.
Attachments
epsilon.bin
epsilon pour N0100 avec k_pythonHeapSize = 32768
(728.35 KiB) Downloaded 5 times
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxModo.G
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 5.4%
 
Posts: 6408
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
Class: -
GitHub: debrouxl

Online

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby cent20 » 08 Sep 2019, 07:57

Lionel, tu comptes en hexadécimal ? :#roll#:

Lionel Debroux wrote:Le manque de RAM disponible sur les machines NumWorks tournant l'epsilon habituel est dû à deux énormes éléments dans la section .bss:
*
Code: Select all
Poincare::Init::pool
, ici 0xD558 octets;


54616 octets donc 54 ko de réservé. OK

Lionel Debroux wrote:*
Code: Select all
AppsContainer::sharedAppsContainer()::appsContainerStorage
, ici 0x183C0 octets.


99264 octets donc 99 ko de réservé. OK

Lionel Debroux wrote:Rien de nouveau, au moins cette deuxième variable a déjà été pointée, avec plus de détails, par Jean-Baptiste Boric dans un des autres topics.


C'est bien de lui dont je parlais quand je disais que peu réussissais à compiler la ROM de la calculatrice.

Lionel Debroux wrote: Comme Jean-Baptiste l'avait écrit, l'application la plus gourmande en stockage n'est pas Code. Avec epsilon Git HEAD, on peut augmenter Code::App::k_pythonHeapSize de 16384 à 32768 sans changer la taille prise en RAM par appsContainerStorage.


C'est exactement ce que je voulais faire en compilant la ROM sauf que je n'ai jamais réussi à arriver au terme... :?

Lionel Debroux wrote:
On ne peut pas aller significativement plus loin: k_pythonHeapSize = 40960 (+0x2000) fait passer la taille d'appsContainerStorage à 0x19db0, ce qui représente donc une augmentation assez proche de 0x2000.


Ce qui m'inquiète dans cette histoire, c'est que je ne suis pas sur qu'en passant de 16ko à 32ko de mémoire pour pythonHeapSize l'on puisse exécuter des script de 8ko (c'est à dire 2x plus gros que les 4ko recommandé par critor)

Le script test_memory_size.py que j'ai trouvé sur ce forum montre (si j'ai bien compris) que la mémoire est fragmenté et que le plus gros bloc fait 4ko. Or si le script est chargé entièrement en mémoire cette taille du premier bloc est vraiment bloquante.

D'ailleurs en créant des scripts bidons effacés depuis, en dépassant 5 ko environ ils plantaient dès le lancement. Si la taille maximale d'un script est de 4ko cela doit être marqué en clair dans la documentation !

Lionel Debroux wrote:
Peut-être que ça permettra de tourner des programmes un peu plus complexes, mais ça ne changera rien au fait qu'il n'y ait pas plus de 16 KB de stockage pour les scripts. Ca doit être Ion::staticStorageArea (0x400C octets). Les machines n'ont pas assez de RAM pour utiliser ce style de programmation, on le sait, et je pense que c'est une grosse erreur de ne pas avoir remédié à ce point en concevant la N0110...


Ma question sera naïve, mais est-on obligé d'éxécuter le script depuis la RAM ?

Le modèle N0110 ayant 8 mo de mémoire, ne serait'il pas souhaitable (possible, envisageable) de permettre à l'utilisateur de choisir ou exécuter le script ?

Encore mieux, si le script dépasse 4ko il pourrait être exécuté dans / depuis la mémoire ROM de manière automatique.

Et s'il ne peuvent pas (ou ne veulent pas pour ne pas dégrader les performance) ne suffirait-il pas qu'ils décident de vider un peu la RAM lorsque l'on rentre dans le menu python ?

Lionel Debroux wrote:
Comment est-ce qu'on fait un build pour N0100, déjà ? EDIT: `make MODEL=n0100`, on dirait. EDIT2: ou peut-être mieux, `make build/device/n0100/epsilon.bin` ?


Excellente question ! j'ai déjà vu passer make MODEL=n0100 mais jamais dans la documentation officielle qui mériterait un bon refresh.
Bonjour Anonymous !

Intéressé par la spécialité NSI en 1ère
?
Visite donc
https://nsi.xyz !
User avatar
cent20Premium
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Level up: 8.5%
 
Posts: 158
Images: 9
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby Lionel Debroux » 08 Sep 2019, 08:12

Lionel, tu comptes en hexadécimal ? :#roll#:

En général, non, c'est juste que je ne me suis pas amusé à convertir en décimal la sortie d'arm-none-eabi-objdump ^^

C'est exactement ce que je voulais faire en compilant la ROM sauf que je n'ai jamais réussi à arriver au terme... :?

C'était plus simple quand Epsilon ne gérait que la N0100; maintenant, c'est la N0110 qui est ciblée par défaut.

Le modèle N0110 ayant 8 mo de mémoire, ne serait'il pas souhaitable (possible, envisageable) de permettre à l'utilisateur de choisir ou exécuter le script ?

Encore mieux, si le script dépasse 4ko il pourrait être exécuté dans / depuis la mémoire ROM de manière automatique.

Je suis à peu près sûr que MicroPython a besoin de RAM pour stocker des infos sur le script et permettre une exécution moins lente.

Si la taille maximale d'un script est de 4ko cela doit être marqué en clair dans la documentation !

En effet...

j'ai déjà vu passer make MODEL=n0100 mais jamais dans la documentation officielle qui mériterait un bon refresh.

Comme je l'ai appris hier soir, make MODEL=n0100 ne suffit pas pour obtenir un binaire directement flashable, il faut suivre par quelque chose comme `make build/device/n0100/epsilon.bin`, que j'ai dû fouiller dans les Makefile pour trouver.

A la suite du post auquel tu as répondu, j'ai fait un autre post qui contient le binaire produit par le build, qui peut t'intéresser. Tu l'as peut-être déjà vu le temps que je réponde à ton post. Je ne peux pas tester moi-même, j'ai fait tout mes développements sur epsilon sans avoir de N0100/N0110.
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxModo.G
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 5.4%
 
Posts: 6408
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
Class: -
GitHub: debrouxl

Online

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby cent20 » 08 Sep 2019, 08:16

Un testeur de la CASIO Graph 35+E II sur le forum https://www.planet-casio.com (consulter le topic) précisait il y a quelques mois :

Cela n'est pas surprenant, car l'ancien tas faisait 48 ko
et c'est assez peu
pour un interpréteur Python. Casio a certainement commencé à exploiter la deuxième moitié de RAM à sa disposition pour satisfaire les besoins de Python. Les scripts de Critor révèlent que le nouveau tas fait environ 90 ko, quasiment deux fois plus que l'ancien.


Le reste de la page est très intéressant.

Pourquoi CASIO passerait-il de 48 ko à 90ko de mémoire dédiée pour l'éxécution des script python si cela n'était pas nécessaire ?

Code: Select all
Calculatrice : Rom (disponible utilisateur) / Ram (disponible utilisateur) en ko
TI 83 Prenium CE edition Python : 4096 (  3072 ) / 256 (150)
Casio 35+E II                   : 8192 (  3072 ) / 512 (090)     
NumWorks                        : 1024 (  0016 ) / 256 (016)


Mais si tous les utilisateurs se contentent silencieusement de 16ko de mémoire et d'une taille maxi de 4ko pour un script, cela ne les incitera pas beaucoup à bouger.

J'ai l'impression que les 16ko ont été décidé d'après cette page :

Yet it is compact enough to fit and run within just 256k of code space and 16k of RAM


Pour faire tourner windows 10 32 bits, il suffit d'avoir un PC avec un processeur 1ghz, 1go de mémoire, 16 go de DD dur

Je suis curieux de voir qui arrive à utiliser windows 10 cette configuration... :troll:
Bonjour Anonymous !

Intéressé par la spécialité NSI en 1ère
?
Visite donc
https://nsi.xyz !
User avatar
cent20Premium
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Level up: 8.5%
 
Posts: 158
Images: 9
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):

Online

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby cent20 » 08 Sep 2019, 08:19

Lionel Debroux wrote:En pièce jointe à ce post, un build d'epsilon pour N0100 avec k_pythonHeapSize = 32768, ainsi que -Wl,--gc-sections dans les flags de build ( https://github.com/numworks/epsilon/pull/1062 ). Il a été obtenu par `make build/device/n0100/epsilon.bin`, et critor l'a testé tôt ce matin: il a pu flasher la calculatrice avec succès - j'ignore quel outil il a utilisé, peut-être un WebDFU ? - et son script habituel d'obtention de la taille de la mémoire rend 32204 plutôt qu'une valeur inférieure à 16 KB.
@cent20: peut-être que ce changement ça permettra de tourner des scripts un peu moins pas complexes sans avoir à rendre le code source moche ?

Si ça augmente la complexité des scripts qu'on peut traiter sous Epsilon, je fais une pull request pour ce one-liner, en linkant ce topic.


Je vais essayer ceci dans la matinée.
Je crois que la page qui permet de flash est https://ti-planet.github.io/webdfu_numworks/.
Bonjour Anonymous !

Intéressé par la spécialité NSI en 1ère
?
Visite donc
https://nsi.xyz !
User avatar
cent20Premium
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Level up: 8.5%
 
Posts: 158
Images: 9
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):

Re: Script qui refuse de s’exécuter sur la Numworks N0100

Unread postby parisse » 08 Sep 2019, 08:34

Lionel Debroux wrote:@parisse: le pool est fait pour stocker les TreeNode utilisés un peu partout comme opérande et résultat d'opération d'epsilon.

Ok, quelle consequence si on le divise par 2? Parce que ca permettrait de recuperer un peu de place pour le tas, ca ne serait pas du luxe pour KhiCAS.
User avatar
parisseVIP++
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Level up: 84.2%
 
Posts: 1843
Joined: 13 Dec 2013, 16:35
Gender: Not specified

PreviousNext

Return to Programmation Python

Who is online

Users browsing this forum: No registered users and 1 guest

-
Search
-
Featured topics
Concours TI-Planet-Casio de rentrée 2019. 3 défis pour plus d'une 15aine de calculatrices graphiques et nombre de goodies sortant de l'ordinaire ! :D
Comparaisons des meilleurs prix pour acheter sa calculatrice !
12
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...

Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety 
-
Stats.
798 utilisateurs:
>723 invités
>69 membres
>6 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)