7
votes

Le microcontrôleur échoue à Malloc

J'écris une fonction sur un microcontrôleur Cortex M4 32 bits. La fonction doit être capable de multiplier des matrices de différentes tailles, que je ne peux pas prédire. Je dois donc utiliser un malloc ...

Mais je ne comprends pas pourquoi mon MC passe toujours dans une interruption de gestionnaire par défaut lorsqu'elle exécute la ligne suivante: xxx

est Ce MC n'est pas capable de gérer ce type d'opérations? Bien que cela fonctionne parfaitement bien sur mon ordinateur portable!

** Modifier *

ici par un autre code (qui doit encore être modifié ...): Eh bien, tous malocs n'importe où échouent. Je ne peux attribuer aucune valeur à un tableau "malaxé". xxx


6 commentaires

Peut-être qu'il ne supporte-il pas le point flottant?


Il est préférable d'isoler le problème du point flottant comme @zelldon suggère. Que se passe-t-il si vous malloc (20) dans un int *?


Êtes-vous sûr à 100% que c'est l'appel Malloc qui échoue, et pas du code après cela? Afaik, vous devriez allouer 3 * tailleof (double) (au moins si je le comprends correctement - votre code est très difficile à lire en raison de la façon dont vous utilisez des espaces) - qui est probablement deux fois supérieures à la quantité de octets comme 3 * tailleof (double *) Vous pouvez donc accéder à des données de limites quelque part


@trilolil Si vous souhaitez que vous souhaitez des doubles, alors Tailleof (double *) est vraiment faux. Peut-être avez-vous besoin de poster plus de code.


Comme indiqué par d'autres, sortie2 = malloc (3 * 1 * taille de (double *)); est incorrect, il devrait être sortie2 = malloc (3 * 1 * Taille de la sortie2); pour allouer 3x1 double s. Par le déséroferience du pointeur de sortie2 Nous n'avons pas besoin de répéter le nom de type et d'obtenir une erreur si sortie2 est renommé ou supprimé. Ce correctif ne résout pas le faute que vous voyez, cependant.


Les meilleures pratiques recommandent de vérifier le MALLOC () Valeur de retour. Tu ne fais pas ça. Si en effet, il échoue, au moins, vous pourriez le gérer correctement.


3 Réponses :


0
votes

Il existe deux types de mise en œuvre valides dans C: hébergé et freestanding . Les programmes écrits pour des implémentations hébergées peuvent utiliser l'un des en-têtes de bibliothèque standard. Toutefois, des implémentations sécurisées ne sont nécessaires que pour prendre en charge , , , , , , , et .

Il n'est pas rare que les microcontrôleurs ont une prise en charge minimale, donc peut-être que votre compilateur C (ou plutôt la bibliothèque standard) n'a pas de support complet pour (et donc (et donc malloc ). Cependant, sans savoir quelle bibliothèque compilatrice et standard que vous avez choisie à utiliser, c'est juste une supposition.

Il est également possible que, comme suggère les commentaires de votre question, quelque chose avant (et / ou suivant) ce morceau de code est à blâmer. Peut-être que vous pourriez produire un MCVE ?

S'il vous plaît n'hésitez pas à commenter sous cette réponse lorsque vous avez mis à jour pour donner plus d'informations, et je vais élaborer avec plaisir à fournir plus d'informations.


1 commentaires

Merci pour votre réponse. Je suis codé à l'aide de Code Composer Studio de Texas Instrument 5.4.0.00091. J'ai édité ma question pour fournir un autre code. (altale il n'y a strictement rien de plus auparavant à ces lignes)



0
votes

Ce que vous avez reçu était une exception de processeur, pas une interruption. Ils sont tous mappés sur le même gestionnaire qui est une pratique courante. Je suppose que vous avez une faute du matériel. Vous pouvez vérifier les registres pour voir ce qui a provoqué l'exception. Utilisez Ce code comme référence pour les examiner . Il pourrait être lié à la mise en œuvre de la LIBC si l'exception se produit à l'intérieur de Malloc.


0 commentaires

0
votes

est le malloc () fonctionne bien dans une autre partie de ce code? Comme vous programmez un périphérique intégré, le tas peut ne pas avoir été correctement initialisé, ou il a été initialisé pour une autre personnalisation MALLOC () -itant.


4 commentaires

C'est en fait le seul malloc que j'utilise. Je n'ai rien fait pour le tas. Par la présente une capture d'écran: imgur.com/jt5w5tk


Eh bien, tous malocs n'importe où échouent. Je ne peux attribuer aucune valeur à un tableau "malaxé".


Vous devez vérifier votre docteur Compiler / Linker pour initialiser correctement votre LIBC et / ou votre tas. Si vous avez assez de RAM et pas de filetage, une solution beaucoup plus simple consiste à affecter une variable globale pour la plus grande allocation possible et à l'utiliser.


Tu avais raison! Merci beaucoup. Il n'y avait pas de tas alloué du tout. 0