2 votes

Paramètres de sélection du système d'exploitation, de la mémoire et du processeur pour un système embarqué ?

Je développe un logiciel de système temps réel embarqué (en langage C). J'ai conçu l'architecture du logiciel - nous connaissons les différents objets requis, les interactions requises entre les différents objets et la communication IPC entre les tâches. Sur la base de ces informations, je dois décider du système d'exploitation (RTOS), du microprocesseur et de la taille de la mémoire requise.

(Il est fort probable que j'utiliserai Quadros, car cela a été suggéré par le client sur la base de son expérience antérieure dans des projets similaires).

Mais je ne sais pas par lequel commencer, car le choix de l'un pourrait avoir un impact sur le choix de l'autre.

Pourriez-vous également me guider sur les paramètres à prendre en compte pour estimer les besoins en mémoire à partir de la conception du logiciel (limite inférieure et limite supérieure des besoins en mémoire) ?

(Le coût du ou des composants peut être ignoré pour cette évaluation).

2voto

JRobert Points 6604

La mémoire est moins chère que votre temps, du moins pour les premiers systèmes produits. Mettez le maximum de tout ce que vous pouvez sur la carte de votre système prototype et instrumentez votre code. Vous pouvez acheter des cartes moins bien remplies pour la production, mais vous voulez maintenant des méga ressources.

  • Allouez des piles beaucoup plus grandes que ce dont vous pensez avoir besoin et pré-remplissez-les avec un tas de texte répétitif, comme le nom du thread qui possède cette pile. La quantité de texte qui sera écrasée vous indiquera la quantité de pile utilisée par chaque thread. Appliquez un facteur de sécurité confortable à ce nombre pour obtenir votre allocation finale.
  • Allouez beaucoup de tas. Mieux encore, au lieu d'utiliser le tas au moment de l'exécution, pré-allouez le tas au démarrage à un (ou plusieurs) pools de mémoire d'une (ou plusieurs) taille de bloc fixe. Allouez et désallouez uniquement à partir de ces pools au moment de l'exécution.
  • Enregistrez l'utilisation de la mémoire dans un grand tampon (ou circulaire), ou enregistrez l'ID du demandeur dans un préambule distinct de l'espace de données réel du bloc - tout ce qui laissera des traces que vous pourrez retrouver plus tard pour aider à analyser la demande de mémoire, le manque de mémoire ou les pannes.
  • Gardez les tampons en dehors de vos piles afin d'éviter que les dépassements ne provoquent un arrêt brutal ou, pire, des transferts de contrôle sauvages.
  • Battre le système. Faites-lui subir tous les scénarios qui, selon vous, mettront à l'épreuve la pile et les besoins en mémoire. Demandez à des utilisateurs typiques et non typiques de faire de même. Certains d'entre eux essaieront de faire des choses que vous n'aviez pas prévues. Encouragez-les.

Lorsque vous aurez fait tout cela, vous aurez une bien meilleure idée de vos besoins en mémoire que celle que vous pouvez avoir maintenant.


(Editer ; commentaire non disponible pour moi)

James :

Nous aimerions obtenir une estimation approximative du matériel et des coûts impliqués à ce stade. Pensez-vous que cela soit possible ?

La réponse courte est oui, la RAM est susceptible de représenter une petite partie du coût de votre matériel, alors allez-y et surestimez - vous devriez quand même être proche.

À titre de vérification approximative, vous pouvez obtenir une estimation grossière des besoins en mémoire statique - code et données statiques - en écrivant et en compilant quelques fonctions afin d'obtenir un ratio lignes sources/mémoire approximatif, puis en extrapolant. Vous aurez besoin d'un compte approximatif et de quelques estimations éclairées sur la façon dont votre conception se développera en fonctions et en lignes de code. Pouvez-vous faire une estimation approximative de l'utilisation des structures dynamiques (piles, tas ou pools) lors de l'exécution de votre projet ? J'aurais probablement au moins doublé ou quadruplé mes estimations.

Pouvez-vous mettre en œuvre le système sur un ordinateur existant, en court-circuitant les fonctions (en compilant le code avec un retour court plutôt qu'en les #ifdef'ing) qui n'ont pas de sens dans cet environnement ?

Si vous avez vraiment besoin d'estimer sans mettre en œuvre beaucoup de choses, je pense que vous serez coincé avec l'extrapolation.

0voto

Mark Points 146

Il semble que vous ayez déjà fait certains choix de conception.

nous connaissons les différents objets nécessaires, les interactions requises entre les différents objets et la communication IPC entre les tâches.

vous avez besoin d'un système d'exploitation multithread et d'une unité centrale de traitement qui peut l'exécuter, ce qui signifie généralement que vous devez viser un processeur avec une MMU. Les options d'OS sont des choses comme Quadros, QNX, linux, wince, etc.

En fonction de ce que font vos "objets" (les modules sont un meilleur terme pour le C :) ), vous pouvez probablement déterminer le type d'architecture dont vous avez besoin. Une architecture 16 bits est-elle suffisante ? Si vous avez besoin de plus de mémoire ou si vous travaillez avec des nombres plus importants, alors le 32 bits est la bonne réponse ? beaucoup de travail en virgule flottante ? alors vous avez probablement besoin d'un processeur avec une FPU. Beaucoup de travail en DSP ? peut-être avez-vous besoin d'un DSP ou d'un uC avec des instructions de type DSP ou un co-proc. L'exécution d'un écran graphique ? Il vous faut un SoC avec un contrôleur LCD intégré ou bien un contrôleur externe. Vous faites des graphiques 2D lourds ? Vous avez besoin d'un SoC avec une accélération graphique.

Dressez la liste des fonctionnalités dont vous avez besoin et estimez la part de votre code qui relève des catégories suivantes : opérations sur les entiers, boucles, opérations en virgule flottante, opérations graphiques, opérations DSP, etc.

Cela devrait vous permettre de classer le niveau du dispositif dont vous avez besoin. Pour certaines architectures, vous pourriez faire une compilation croisée du code en utilisant GCC et l'émuler en utilisant qemu au dessus de linux. Cela ne vaut probablement la peine que si vous avez besoin de tester les performances d'un algorithme critique sur une architecture particulière. Cela peut vous aider à adapter la vitesse dont vous avez besoin pour votre application.

La deuxième considération devrait être l'utilisation de l'énergie et la prise en charge de la gestion de l'énergie. Combiné avec les performances requises, vous pouvez faire le choix d'un DSP, d'un uC, d'un processeur d'application, etc.

Comme d'autres l'ont dit, je ne m'inquiéterais pas de l'utilisation de la mémoire, il suffit de viser grand, souvent les différentes tailles de RAM sont compatibles avec les broches, vous pouvez donc simplement réduire la RAM pour la production. Les seules vraies questions auxquelles il faut répondre d'emblée sont les suivantes :

*De quelle taille d'espace d'adressage ai-je besoin ? 16 bits ? 32 bits ? etc.

*Ai-je besoin d'une RAM externe ou la RAM interne d'un uC sera-t-elle suffisante ? <--réponse à cette question après avoir choisi une architecture et pouvoir partir à la chasse aux SoC.

Dans la plupart des cas, choisir parmi les processeurs de la même catégorie est une "guerre sainte". Ainsi, sur le marché des risc 32 bits, certains choisiront ARM, d'autres coldfire, d'autres encore PIC32. En fin de compte, n'importe quel processeur peut fonctionner. Vous devez choisir en fonction des SoCs disponibles avec les périphériques requis, de la facilité de développement (quelle est la qualité de la chaîne d'outils) et du coût.

La même chose peut être vraie pour le choix du système d'exploitation, linux vs QNX vs quadros est un jeu de pile ou face pour la plupart des applications, généralement la meilleure réponse est celle avec laquelle vous avez le plus d'expérience. Même s'il s'avère légèrement plus cher, la réduction du temps de développement compense souvent le coût de construction. Assurez-vous que le système d'exploitation possède les fonctionnalités requises, les bibliothèques partagées, la communication interprocessus, les tuyaux, tout ce dont vous avez besoin.

En règle générale, je choisirais d'abord votre architecture. Celle-ci aura un impact beaucoup plus important sur les performances de votre appareil que le système d'exploitation. De plus, les systèmes d'exploitation dans cet espace sont souvent supportés par de nombreuses architectures. De plus, les meilleurs systèmes d'exploitation sont compatibles avec POSIX. Correctement écrit, le gros de votre code devrait pouvoir fonctionner sur plusieurs systèmes d'exploitation.

Ne vous sentez pas mal si vous devez faire plusieurs essais pour faire le bon choix. Vous pouvez trouver un noyau qui répond parfaitement à vos besoins en matière de code, mais découvrir après quelques recherches qu'il ne prend pas en charge une fonctionnalité mineure dont vous avez besoin, ou qu'il n'y a pas de SoC disponible avec les périphériques dont vous avez besoin, ou même que le produit est en rupture de stock pendant 6 mois. Assurez-vous simplement qu'après avoir fait le choix initial, vous recherchez comment la conception se fera sur la base de cette partie, afin de voir la pierre d'achoppement maintenant plutôt qu'à mi-chemin du développement.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X