Logiciels Libres et Systèmes Embarqués

Problèmes et solutions

Accélérer le développement

A chaque fois que l'on fait une modification dans notre projet, XPS recompile tout le projet logiciel, ce qui signifie que toutes les bibliothèques sont recompilées, ainsi que tous les autres projets logiciels... Une solution consiste à faire son propre Makefile. Pour cela il suffit de noter la commande qui commence par "powerpc-eabi-gcc", et de la mettre dans un fichier Makefile comme présenté ci-après.

journal de XPS :

LibGen Done. 
powerpc-eabi-gcc (...)
powerpc-eabi-size LwIP/executable.elf 
   text	   data	    bss	    dec	    hex	filename
  99476	   1252	 826564	 927292	  e263c	LwIP/executable.elf
Done.

fichier Makefile:

program:
	cd ../..; powerpc-eabi-gcc (...)

Ensuite, il suffit de lancer un terminal (bouton Xygwin Shell), d'aller dans le répertoire où ce trouvent les sources, et de lancer la commande "make".

Instance not found

Il se peut qu'après avoir lancé la boite de dialogue "Software Platform Setting", le projet ne se compile plus et affiche l'erreur suivante :
ERROR:MDT - xget_handle 39406316 ipinst Ethernet_MAC peripheral : xget_handle:
   Ip instance Ethernet_MAC not found
ERROR:MDT - ERROR FROM TCL:- Lwip () - 
       while executing
   "xget_handle $processor_handle "ipinst" $ipinst_name "peripheral""
       (procedure "xget_sw_ipinst_handle_from_processor" line 2)
       invoked from within
   "xget_sw_ipinst_handle_from_processor $sw_proc_handle $inst"
       (procedure "::sw_Lwip_v2_00_a::Lwip_drc" line 21)
       invoked from within
   "::sw_Lwip_v2_00_a::Lwip_drc 39441932" 
ERROR:MDT - Error while running DRC for processor ppc405_1...
make: *** [ppc405_1/lib/libxil.a] Error 2
Done.

La solution consiste à commenter les informations concernant le processeur non utilisé :

# BEGIN OS
#  PARAMETER OS_NAME = standalone
#  PARAMETER OS_VER = 1.00.a
#  PARAMETER PROC_INSTANCE = ppc405_1
# END

Le pointeur NULL

Il faut faire attention à ce que la mémoire où se situe le code et les données ne commence pas à l'adresse 0x00000000. En effet, prenons par exemple le cas des callbacks de LwIP, ce dernier compare les pointeurs de fonctions (callback) au pointeur NULL pour savoir s'il faut les appeler ou non. Si la fonction est mappée à l'adresse 0x00000000, son pointeur sera bien évidemment égale au pointeur NULL.

Documentation de tcp_close()

Malgré ce qui est dit dans la documentation de l'API RAW de LwIP, le PCB n'est pas désalloué lors d'un appel à tcp_close() s'il a au moins servi à une connexion... Cependant, dans la prochaine version de LwIP, un second appel à tcp_close() désallouera effectivement le PCB...

XMD et GDB

Il faut bien faire attention de ne pas charger l'exécutable avec XMD, mais le faire à partir de l'interface GDB, si l'on souhaite utiliser ce dernier. En effet, on risque de rencontrer des difficultés (plantage sur la cible) si l'on ne respecte pas cette procédure...

Débogage des bibliothèques

Il peut être pratique de voir comment se comportent les bibliothèques durant l'exécution. Cependant, par défaut, elles sont compilées de manière optimisée, ce qui veut dire qu'utiliser un débogueur dans de telles conditions est assez difficile...

Une solution consiste à forcer la non-optimisation. Cela s'effectue en plaçant l'option "-O0" dans la boite de dialogue "Software Platform Setting" à l'onglet "Processor, Driver Parameters, Interrupt Handlers" dans le champ "EXTRA_COMPILER_FLAGS".

Nombre d'envoie limité

Le nombre d'envoie dans une même connexion est limiter, ce qui veut dire que l'on ne peut pas garder une connexion ouverte pour dialoguer librement... Il faut donc faire attention à cette limite :
 /* Check if the queue length exceeds the configured maximum queue
  * length. If so, we return an error. */
queuelen = pcb->snd_queuelen;
if (queuelen >= TCP_SND_QUEUELEN) {
    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_enqueue: too long queue %u (max %u)\n", queuelen, TCP_SND_QUEUELEN));
    goto memerr;
}