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; }