j'ai ete trop vite ..
qu'est ce qui gene dans le fait que l'on soit dans une interuption pour les printf ?
Bon et bien le mystere reste entier.. Je ne comprends vraiment pas.. Surtout que le sysalloc ne me renvoie aucune erreur....
A priori pour le moment, le systeme est a peu pres stable.. ca ne plante que tres rarement...
oO
printf n'est pas ré-entrante. Si elle est appelée alors qu'elle est en cours d'exécution, c'est la panique (probablement un problème de variable statique interne).Envoyé par gdpasmini
C'est pour ça qu'il ne faut pas utiliser ON si il y a des allocations sous IT (ce qui n'est pas recommandé, mieux vaut utiliser un pool, comme tu me l'as fait remarqué, car malloc() non plus n'est pas réentrant, ni protégé contre les interrutions.)
C'est d'ailleurs pour ça que le me suis p*té le c*l pour enregistrer les évènements... Mais pour bien faire, il faudrait ajouter des zones critiques quand on écrit dans la trace... Mais comme ce n'est pas portable, je laisse ça à chaque implémenteur de SYSALLOC sur son système...
Pourquoi SYSALLOC devrait signaler des erreurs ? Il ne fait que tenir le compte des allocations et des libération, en fournissant un état des lieux sur demande.Bon et bien le mystere reste entier.. Je ne comprends vraiment pas.. Surtout que le sysalloc ne me renvoie aucune erreur....
A priori pour le moment, le systeme est a peu pres stable.. ca ne plante que tres rarement...
Il peut éventuellement signaler dans la trace qu'on a cherché à libérer un bloc
déjà libéré (ou jamais alloué) ou que tel ou tel bloc n'est pas libéré. Après, il faut interpréter pour savoir si c'est normal ou pas...
Rappelle moi quel est ton problème d'origine.
Pas de Wi-Fi à la maison : CPL
lol oui c'est vrai qu'on a beaucoup dévié.. Mais ca m'a permis d'apprendre pas mal de choses!
Mon probleme d'origine etait des plantages intempestifs et aléatoire de mon system. J'ai donc penser installer un pool pour mieux gérer la memoire...
L'implémentation du pool en question ne fonctionne pas. Pour une raison que j'ignore, il me renvoie NULL parfois sans m'afficher d'erreur... De plus ce pool m'empeche d'utiliser les printf comprenant une variable int, char, etc..
Je suis donc revenu aux anciens malloc (malloc classique avec une initialisation de la memoire) et j'ai implémenté le sysmalloc.
Depuis, plus de probleme, je n'arrive meme plus a faire planter la machine.. Et les printf sont revenus..
tout compte fait, ca plante encore un peu ! lol mais beaucoup moin souvent qu'avant....
Je te jure que j'aimerai bien résoudre ce mystere... Je pense quand mem qu'un pool serait une bonne chose mais je ne vois pa du tout comment faire ca...
Surtout dis moi si j'abuse !
Ca plante, ça veut dire quoi au juste ?Envoyé par gdpasmini
Mmm... Disons que je préfèrerais que tu essayes par toi même. Moi, je sais le faire, pas de problèmes ! Je t'ai quand même donné l'interface et le comportement de chaque fonction, plus un article sur la fabrication des ADT. Difficile d'en faire plus sans donner le code... (Mais là, c'est 1€ le signe, codé, testé, validé ).Je te jure que j'aimerai bien résoudre ce mystere... Je pense quand mem qu'un pool serait une bonne chose mais je ne vois pa du tout comment faire ca...
Surtout dis moi si j'abuse !
Qu'est-ce qui te bloque ?
Pas de Wi-Fi à la maison : CPL
En fait, quand ca plante, l'interface se fige et je n'ai plus accès a quoique se soit... C'est pour ca que ca ressemble fortement a un plantage memoire.. Enfin je trouve !
Sinon tu as raison, je vais tenter de le faire moi meme. Je vais regarder ca de plus pres et tenter de le coder moi meme. Mais je suis loin d'etre sur que ceci reglera a terme mon probleme car je ne comprends pas du tout quel en est la cause et pourquoi tout semble bien mieux fonctionner maintenant...
Désolé, je n'aivais pas vu ton poste sur les ADT et la description des fonctions...
Je viens de le voir..A priori c'est exactement ce que fait le pool que je t'ai montré.
Dommage qu'il ne marche pas pour mon implémentation.. mais le bug reste etrange car il ne devrait jamais renvoyer null sans renvoyer d'erreur...
Ca dépend de tant de choses... C'est quoi commeEnvoyé par gdpasmini
- plateforme
- système
- application
Ca me va.Sinon tu as raison, je vais tenter de le faire moi meme. Je vais regarder ca de plus pres et tenter de le coder moi meme.
Ca ne va pas durer !Mais je suis loin d'etre sur que ceci reglera a terme mon probleme car je ne comprends pas du tout quel en est la cause et pourquoi tout semble bien mieux fonctionner maintenant...
Je crois que je n'ai pas eu de réponse claire à cette question que je ne suis même pas sûr d'avoir posée :
"Est-ce que tu fais des appels à malloc() sous interruption ?"
Pas de Wi-Fi à la maison : CPL
Et bien en fait, je ne peux pas vraiment parler de la plateforme et le system est propriétaire..
De plus, oui je fais énormément de malloc sous intérruptions mais j'essaye de protéger l'intérruption avec une variable globale jouant le role de semaphore.. a defaut d'en avoir a disposition. Donc lorsque l'interruption est appelée, elle doit normalement faire tout son bazarre sans pb et sans etre gené.
ET POURQUOI CE SATANE POOL ME RENVOI NULL !!!
Je commence a devenir fou....
Je m'en doutais un peu, il y a certains silences qui valent explication ! Peux-tu brancher un émulateur (ICE ou In Circuit Emulator) pour voir l'état du bazar quand c'est planté ?Envoyé par gdpasmini
Argh ! SYSALLOC en Mode OFF exclusivement et encore, dans l'état, je ne garantis rien. Par contre, dans une tâche (shell, par exemple) tu peux appeler sys_mem_trace() comme tu veux. Tu auras l'état courant.De plus, oui je fais énormément de malloc sous intérruptions
C'est pas l'interruption qu'il faut protéger, c'est ton malloc() etc. qui doit définir une section critique.mais j'essaye de protéger l'intérruption avec une variable globale jouant le role de semaphore.. a defaut d'en avoir a disposition. Donc lorsque l'interruption est appelée, elle doit normalement faire tout son bazarre sans pb et sans etre gené.
Autre horreur possible : ne me dit pas que les interruptions sont ré-entrantes ou qu'il en existe de plus prioritaires !
Je rappelle le principe d'une section critique. C'est une zone d'exécution qui ne peut être interrompue.
Lorsqu'elle s'exécute dans une tâche, elle inhibe les interruptions.
Lorsqu'elle s'exécute dans une interruption, elle doit masquer les interruptions plus prioritaire.
Dans les 2 cas, elle ne peut donc plus être interrompue ni par une interruption, ni par une tâche.
Je suppose que ton système fourni les fonctions 'entrer en zone critique' et 'sortir de la zone critique', sinon, t'es mal...
Pas de Wi-Fi à la maison : CPL
lol alors je suis tres tres mal !
En fait, je fais du maquettage.. Je n'ai rien a disposition et je me sert de kit de developpement open source pour tenter d'aboutir a un truc interessant... Donc je me sens un peu seul.
C'est pour ca que j'apprécie tant ton aide !
C'est ma premiere mission ! Donc je pense etre tres bien tombé. D'autant plus que la librairie open source que j'utilise est censé travailler avec des threads et non des interruptions... Ca epice encore plus mon travail !!
Dis moi, je peux me faire virer malgré ces circonstances atténuantes ?
Il ne faut absolument pas faire en interruption ce qui est normalement fait par une tâche. A priori, ça ne peut pas fonctionner. En vérité, il faudrait tout analyser pour le savoir...Envoyé par gdpasmini
En principe, les interruptions déclenchent des évènement qui décoincent des taches. Ensuite, c'est la tâche qui fait le traitement.
Si il faut récupérer des gros blocs de données sous interruption, c'est que le bazar est mal conçu. C'est pas fait pour ça. Il existe des mécanismes matériels qui savent récupérer des gros blocs de donnée.
Sans en savoir plus sur le projet, ça va être difficile de te conseiller utilement.
Pas de Wi-Fi à la maison : CPL
oui je comprends.. Bon je pense que de toute manière, je leur ai di quelles etaient les problemes quant a l'utilisation de cette librairie.. Mais j'ai pas l'impression d'etre tres crédible au vu de ma courte experience. Ils acceptent une certaine instabilité. Ce projet n'est pas destiné a une industrialisation immédiate dc..
C'est pour ca que je suis content que ca plante moin qu'avant car ainsi je peux faire des démos a peu pres interessante.
D'un autre coté, ca m'énerve de ne pas comprendre ce probleme.... Surtout apres y avoir passé autant de temps...
La seule chose qui me serait utile en fait, c'est comprendre pourquoi le pool que je t'ai montré renvoi un pointeur null. A priori, en regardant le code, ca ne semble pas possible.....
Merci pour ton soutien
Vu qu'il fonctionne chez moi (mais sans interruptions) je ne peux en dire plus. Si tu peux mettre un ICE, tu auras peut être plus d'informations.Envoyé par gdpasmini
Pas de Wi-Fi à la maison : CPL
Et bien non je ne peux pas non plus...
Bon je vais me tirer une balle !
Ca embauche pas par chez toi par hasard ?
Hum, je suis en CRP depuis Juillet suite à un licenciement économique...Envoyé par gdpasmini
http://www.aeta.com/
Pas de Wi-Fi à la maison : CPL
Tient, jai peut etre du nouveau pour expliquer pourquoi ca mieux depuis que j'utilise le sysalloc..
Lorsque j'ai une interruption, je lance la fonction recvfrom pour récuperer un paquet sur une socket et ensuite, je lance une fonction permettant de parser le message. C'est dans cette fonction que plante le programme. Fonction qui fait partie de la librairie open source censé etre stable.
Or maintenant, je mets un sys_mem_trace avant et apres cette fameuse fonction qui parse le paquet. Ceci entraine donc peut etre un delai entre la reception du paquet et son traitement qui explique que le bug est lieu bcp moin souvent !
Qu'en pense tu ?
C'est possible. Mais appeler recv() (fonction utilisateur) dans une interruption (domaine noyau), c'est absurde.Envoyé par gdpasmini
Comme je te l'ai déjà dit, une interruption, ca sert à déclencher un évènement qui va par exemple décoincer une tâche suspendue. C'est dans cette tâche que doit être fait l'appel système.
Tu fais beaucoup trop de choses sous interruptions.
D'ailleurs, je ne comprends pas pourquoi tu utilises une interruption si ton système dispose des sockets. C'est lui qui doit prendre en charge tout ce bazar, c'est son rôle.
Pas de Wi-Fi à la maison : CPL
je sais bien, je suis bien d'accord.. mais je n'ai pas vraiment eu le choix, j'ai recu le programme de cette maniere...
Ce que je fais, c'est que je regarde periodiquement la socket pour voir si j'ai un paquet. La socket est non blocante.
Si j'ai un paquet, je parse, sinon, je sors de la fonction...
Etant donné que je ne peux pas utiliser les threads, c'est le seul moyen de savoir si j'ai recu un paquet.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager