π
<-
Chat plein-écran
[^]

La NumWorks réinventée avec la N0110 - rentrée 2019

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Unread postby parisse » 14 Aug 2019, 08:20

Un point sur le projet delta (= epsilon + giac sur Numworks N110)

Etat actuel: le prototype du simulateur est fonctionnel (qualite version alpha). J'ai reussi a compiler un firmware pour une N110.
Attention, les instructions qui suivent permettent de compiler un firmware qui lie entre eux epsilon et giac, dont les licenses sont incompatibles. Il n'est donc pas possible de diffuser legalement un tel firmware, on peut juste se compiler son propre firmware pour soi a des fins de prototypage.

Les commandes Giac/Xcas sont utilisables depuis l'app Calculs. Pour le moment, il faut taper les commandes Xcas en toutes lettres. On peut utiliser les templates de la calculatrice (fraction, integrale, somme, matrices). Pour stocker une valeur dans une variable, utiliser =, par exemple a=2 ou a=ranm(2,2).
Remarque: comme epsilon/poincare n'accepte pas les fonctions utilisateur ayant plus d'un argument, j'ai mis en place un workaround dans giac pour transformer de matrice 1 ligne vers liste des arguments (et aussi autorise les fonctions a plus d'un argument dans le parseur de poincare). Cela apparait dans l'historique des calculs avec des crochets qu'il faut juste ignorer. Le seul cas vraiment genant pour le lycee me semble etre la fonction limit qui meriterait un template.

=================
Compilation giac
=================
Recuperer https://www-fourier.ujf-grenoble.fr/~pa ... stable.tgz (version du 24 aout ou ulterieure)
Compilation de giac pour le simulateur:
Code: Select all
export CXXFLAGS='-DNUMWORKS -g'
./configure --prefix=/usr
make
sudo make install


Compilation pour la calculatrice, d'apres
https://zardam.github.io/post/numworks-giac/
Installer libtommath: voir lien ci-dessus
Pour giac: dans le repertoire src:
Code: Select all
cp config.h.numworks config.h
cp static_lexer_numworks.h static_lexer.h
cp static_lexer__numworks.h static_lexer_.h
make -f Makefile.numworks


==============
Compilation epsilon
==============
Code: Select all
git clone -b newlib https://github.com/zardam/epsilon
# faire les modifs dans le source indiquees ci-dessous!
# faire make V=1 pour voir les details

# make PLATFORM=emscripten

# simulateur:
make PLATFORM=simulator clean
make PLATFORM=simulator DEBUG=1
./emu (a linker build/simulator/epsilon.elf)

# calculatrice:
make clean
make
# N100
# make epsilon_flash
# flashage calculatrice N110
# sudo est inutile sur Mac
make USE_LIBA=0 EPSILON_DEVICE_BENCH=0 EPSILON_USB_DFU_XIP=0 EPSILON_ONBOARDING_APP=1 EPSILON_BOOT_PROMPT=update build/device/n0110/epsilon_two_binaries -j
sudo dfu-util -D build/device/n0110/epsilon.internal.bin -s 0x08000000
sudo dfu-util -D build/device/n0110/epsilon.external.bin -s 0x90000000


================
Modifications du source d'epsilon pour linker avec giac:
================
definitions des flags C++ dans scripts/default.mak

1/ scripts/config.mak: ajouter
Code: Select all
# giac
ifeq ($(PLATFORM),device)
SFLAGS += -DGIAC_NUMWORKS
LDFLAGS += -L../giac-1.5.0/src -L../libtommath-0.39 -lgiac -ltommath
endif

ifeq ($(PLATFORM),emscripten)
SFLAGS += -DGIAC_NUMWORKS
LDFLAGS += -O3 -v -s TOTAL_MEMORY=1GB -s LEGACY_GL_EMULATION=1 -s GL_UNSAFE_OPTS=0 --memory-init-file 0 -s ASSERTIONS=1 -s ERROR_ON_UNDEFINED_SYMBOLS=0 -L/home/parisse/emgiac/giac  -lgiac -lpari -lmpfi -lmpfr -lgmp -lglpk --js-library /home/parisse/emgiac/giac/time.js
endif

ifeq ($(PLATFORM),simulator)
SFLAGS += -DGIAC_NUMWORKS
LDFLAGS += -lgiac
endif


2/ apps/calculation:
au debut de calculation.cpp (avant namespace ...)
Code: Select all
#ifdef GIAC_NUMWORKS
  extern "C" const char * caseval(const char *);
#endif

plus loin

Code: Select all
void Calculation::setContent(const char * c, Context * context, Expression ansExpression) {
  reset();
#ifdef GIAC_NUMWORKS
  Preferences * preferences = Preferences::sharedPreferences();
  if (preferences->angleUnit() == Preferences::AngleUnit::Radian)
    caseval("angle_radian:=1");
  else
    caseval("angle_radian:=0");
  char buf[1024]="add_autosimplify(";
  strlcpy(&buf[strlen(buf)],c,sizeof(buf)-strlen(buf));
  buf[strlen(buf)+1]=0;
  buf[strlen(buf)]=')';
  const char * out=caseval(buf);
  strlcpy(m_inputText,c,sizeof(m_inputText));
  strlcpy(m_exactOutputText,out,sizeof(m_exactOutputText));
  strlcpy(buf,"evalf(",sizeof(buf));
  strlcpy(&buf[strlen(buf)],out,sizeof(buf)-strlen(buf));
  buf[strlen(out)+7]=0;
  buf[strlen(out)+6]=')';
  out=caseval(buf);
  if (strcmp(out,m_exactOutputText)==0 || (m_exactOutputText[0]=='[' && out[0]!='[')){
    bool undef=false;
    int l=strlen(m_exactOutputText);
    for (int i=0;i<l;++i){
      char ch=m_exactOutputText[i];
      if ( (ch>='a' && ch<='z') || (ch>='A' && ch<='Z')){
   undef=true;
   break;
      }
    }
    strlcpy(m_approximateOutputText,undef?"undef":m_exactOutputText,sizeof(m_approximateOutputText));
  }
  else
    strlcpy(m_approximateOutputText,out,sizeof(m_approximateOutputText));
#else
  {
    Symbol ansSymbol = Symbol::Ans();
    Expression input = Expression::Parse(c).replaceSymbolWithExpression(ansSymbol, ansExpression);
    /* We do not store directly the text enter by the user because we do not want
     * to keep Ans symbol in the calculation store. */
    PoincareHelpers::Serialize(input, m_inputText, sizeof(m_inputText));
  }
  Expression exactOutput;
  Expression approximateOutput;
  PoincareHelpers::ParseAndSimplifyAndApproximate(m_inputText, &exactOutput, &approximateOutput, *context, false);
  PoincareHelpers::Serialize(exactOutput, m_exactOutputText, sizeof(m_exactOutputText));
  PoincareHelpers::Serialize(approximateOutput, m_approximateOutputText, sizeof(m_approximateOutputText));
#endif
}


3/ dans poincare/include/poincare/symbol_abstract.h: constexpr static size_t k_maxNameSize = 8;
a remplacer par 16

4/ dans poincare/src/parsing, parser.cpp, fonction void Parser::parseCustomIdentifier
Code: Select all
  ...
  assert(!parameter.isUninitialized());
#ifdef GIAC_NUMWORKS
  if (parameter.numberOfChildren() == 1)
    parameter = parameter.childAtIndex(0);   
#else
  if (parameter.numberOfChildren() != 1) {
    m_status = Status::Error; // Unexpected number of paramters.
    return;
  }
  parameter = parameter.childAtIndex(0);
#endif
  ...


5/ Pour visualiser qu'on utilise le moteur de calcul de Xcas, on peut par exemple modifier la couleur d'affichage de deg/rad en rouge:
dans apps/title_bar_view.cpp
Code: Select all
TitleBarView::TitleBarView() :
  View(),
  m_titleView(KDFont::SmallFont, I18n::Message::Default, 0.5f, 0.5f, KDColorWhite, Palette::YellowDark), // YellowDark
  m_preferenceView(KDFont::SmallFont, 1.0f, 0.5, KDColorWhite, Palette::Red) // YellowDark
{
  m_examModeIconView.setImage(ImageStore::ExamIcon);
}

Pour avoir les angles en radian au boot
poincare/src/preferences.cpp m_angleUnit(AngleUnit::Radian),

6/ pour modifier les menus de la Toolbox, modifier apps/math_toolbox.cpp
les noms doivent etre definis dans apps/shared.universal.i18n ou/et apps/shared.[langue].i18n
par exemple
SimplifyCommandWithArg = "simplify(f)"
SimplifyValue = "simplify expression"
attention, faire clean ou deux fois make sinon les messages sont decales

7/ dans le fichier ion/src/device/n0110/flash.ld J'ai singe le fichier correspondant du port de zardam en ajoutant
Code: Select all
  .ARM.exidx : {
    __exidx_start = .;
     *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    __exidx_end = .;
  } >INTERNAL_FLASH

juste avant la section .data

8/ dans ion/src/device/shared/boot/rt0.cpp, dans la fonction start()
deplacer Ion::Device::Board::init(); avant
#define SUPPORT_CPP_GLOBAL_CONSTRUCTORS
et modifier la valeur de ce define a 1 (initialement a 0)

9/ Ayant une erreur de linkage relative a __errno entre flash interne et flash externe, j'ai desactive la verification dans ion/src/device/n0110/flash.ld:
/* NOCROSSREFS_TO(.text.external .text.internal); */
Last edited by parisse on 24 Aug 2019, 16:10, edited 11 times in total.
User avatar
parisseVIP++
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Level up: 84%
 
Posts: 1840
Joined: 13 Dec 2013, 16:35
Gender: Not specified

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Unread postby parisse » 15 Aug 2019, 08:43

Post precedent mis a jour.
User avatar
parisseVIP++
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Level up: 84%
 
Posts: 1840
Joined: 13 Dec 2013, 16:35
Gender: Not specified

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Unread postby Adriweb » 16 Aug 2019, 05:39

Ce serait bien de forker le repo Epsilon et committer lesdites modifs, afin que l'on puisse [a]voir les changements directement dans un repo utilisable :D
User avatar
AdriwebAdmin.
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 52%
 
Posts: 12680
Images: 1081
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
Class: (ingénieur)
Twitter: adriweb
GitHub: adriweb

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Unread postby parisse » 16 Aug 2019, 07:13

Peut-etre, mais je ne sais pas gerer ensuite les modifications concurrentes. Je prefere expliquer les changements que je fais, comme ca quelqu'un (par exemple moi) qui relit le post dans quelques semaines ou mois devrait pouvoir arriver a modifier la version courante de epsilon. Je trouve que c'est plus facile de reperer une fonction dans un fichier que des numeros de lignes en vert ou rouge au milieu de nulle part.
C'est peut-etre aussi une question d'habitude d'outils a utiliser: si quelqu'un veut forker avec mes modifs, je n'y vois pas d'inconvenients.
User avatar
parisseVIP++
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Level up: 84%
 
Posts: 1840
Joined: 13 Dec 2013, 16:35
Gender: Not specified

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Unread postby Adriweb » 16 Aug 2019, 07:19

Hmm c'est le principe d'un patch. Git(hub) peut exporter en patch tout autant lisible.
Bref, il faudrait que quelqu'un comme Zardam prenne quelques minutes à faire ça, lui qui a l'expérience avec la compile de toutes les dépendances :D

Avec des services du genre Travis, il pourrait y avoir des builds automatiques, et si ça suit les git rebase, et bien ça sera à jour avec les versions de NumWorks.
User avatar
AdriwebAdmin.
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 52%
 
Posts: 12680
Images: 1081
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
Class: (ingénieur)
Twitter: adriweb
GitHub: adriweb

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Unread postby parisse » 16 Aug 2019, 08:41

Oui, ca a l'avantage d'etre automatique, ca complete mon post qui est explicatif. Je viens d'ailleurs de l'editer, en y ajoutant comment modifier les menus pour y faire apparaitre de nouvelles commandes. Je vais essayer de faire un menu CAS pour le lycee.
Restera a regler les problemes de licence, pour le moment la licence non commerciale de giac est la GPL qui est incompatible avec la licence d'epsilon. Ca ne pose pas de probleme pour faire du prototypage pour quelques developpeurs interesses, mais ca risque de poser des problemes de redistribution. Sauf si on peut considerer que le firmware de base epsilon est une librairie systeme et giac une application GPL. Mais j'ai le sentiment que pour l'application Calculs ca n'est pas possible car l'utilisation se fait dans l'autre sens. Il faudrait donc soit refaire une app de calcul de zero, soit que Numworks accepte de dual-licenser l'app de calcul sous licence GPL. La 1ere option me semble la meilleure a long terme, mais ca prendra du temps et ca n'a d'interet que si ca suit sur le hardware.
Ce serait donc bien si quelqu'un ayant acces a la nouvelle machine et une ame de developpeur pouvait tester que ca marche (je vais de mon cote tester si ca compile correctement sur ARM).
User avatar
parisseVIP++
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Level up: 84%
 
Posts: 1840
Joined: 13 Dec 2013, 16:35
Gender: Not specified

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Unread postby parisse » 16 Aug 2019, 09:11

Je viens de tester, modulo une petite correction pour isalpha (faite dans le post ci-dessus), la compilation fonctionne pour arm, mais pas l'etape de link. Il y a plein de symboles non definis, qui correspondent au fait que la libstdc++ n'est pas presente. Il va falloir attendre que zardam nous explique comment il a fait pour linker, ou bien il va falloir que je compile la ustl pour Numworks et que je configure giac pour l'utiliser.
User avatar
parisseVIP++
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Level up: 84%
 
Posts: 1840
Joined: 13 Dec 2013, 16:35
Gender: Not specified

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Unread postby parisse » 16 Aug 2019, 15:20

J'ai progresse, en fait la toolchain ARM contient la newlib et permet d'utiliser la libstdc++, mais il faut l'ajouter explicitement dans les flags de link:
Code: Select all
/usr/lib/arm-none-eabi/newlib/thumb/v7e-m/fpv4-sp/hard/libstdc++_nano.a /usr/lib/arm-none-eabi/newlib/thumb/v7e-m/fpv4-sp/hard/libc_nano.a /usr/lib/gcc/arm-none-eabi/7.3.1/thumb/v7e-m/fpv4-sp/hard/libgcc.a /usr/lib/arm-none-eabi/newlib/thumb/v7e-m/fpv4-sp/hard/libnosys.a

Mais il reste encore 3 symboles indefinis, et la je ne sais pas comment faire
Code: Select all
/usr/lib/gcc/arm-none-eabi/7.3.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/7.3.1/thumb/v7e-m/fpv4-sp/hard/libgcc.a(unwind-arm.o): in function `get_eit_entry':
/build/gcc-arm-none-eabi-76K7U5/gcc-arm-none-eabi-7-2018-q2/build/arm-none-eabi/thumb/v7e-m/fpv4-sp/hard/libgcc/../../../../../../../libgcc/unwind-arm-common.inc:275: undefined reference to `__exidx_end'
/usr/lib/gcc/arm-none-eabi/7.3.1/../../../arm-none-eabi/bin/ld: /build/gcc-arm-none-eabi-76K7U5/gcc-arm-none-eabi-7-2018-q2/build/arm-none-eabi/thumb/v7e-m/fpv4-sp/hard/libgcc/../../../../../../../libgcc/unwind-arm-common.inc:275: undefined reference to `__exidx_start'
/usr/lib/gcc/arm-none-eabi/7.3.1/../../../arm-none-eabi/bin/ld: /usr/lib/arm-none-eabi/newlib/thumb/v7e-m/fpv4-sp/hard/libnosys.a(sbrk.o): in function `_sbrk':
/build/newlib-hTUQk9/newlib-3.1.0.20181231/build/arm-none-eabi/thumb/v7e-m/fpv4-sp/hard/libgloss/libnosys/../../../../../../../../libgloss/libnosys/sbrk.c:21: undefined reference to `end'
collect2: error: ld returned 1 exit status
User avatar
parisseVIP++
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Level up: 84%
 
Posts: 1840
Joined: 13 Dec 2013, 16:35
Gender: Not specified

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Unread postby parisse » 16 Aug 2019, 16:05

J'ai fini par comprendre que ces symboles manquants doivent etre definis dans le fichier ion/src/device/n0110. J'ai singe le fichier correspondant du port de zardam en ajoutant
Code: Select all
  .ARM.exidx : {
    __exidx_start = .;
     *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    __exidx_end = .;
  } >INTERNAL_FLASH

juste avant la section .data, et ajoute end = _heap_start; dans la section _heap_start. Ensuite ca linke et ca cree 2 fichiers, un de 18K pour la flash interne et un de 5M pour la flash externe.
User avatar
parisseVIP++
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Level up: 84%
 
Posts: 1840
Joined: 13 Dec 2013, 16:35
Gender: Not specified

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Unread postby gabmiral » 16 Aug 2019, 18:06

Dans la partie 3, le tableau de performances, je m'interroge sur les performances des TI-83 Premium CE. Pour le modèle Edition Python, ce qui a été testé a été codé en Basic z80/assembleur ou en Python ? Il faudrait spécifier. Aussi, ce serait interessant de mettre la vitesse d’exécution du script Python sur une TI-83 Premium CE normale couplée au module TI-Python
User avatar
gabmiral
Niveau 5: MO (Membre Overclocké)
Niveau 5: MO (Membre Overclocké)
Level up: 21.9%
 
Posts: 4
Joined: 08 Jul 2019, 18:35
Location: Région Hauts-de-France
Gender: Male
Calculator(s):
Class: Seconde Générale
Twitter: gabmiral
GitHub: gabmiral

PreviousNext

Return to News NumWorks

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.
389 utilisateurs:
>372 invités
>11 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)