Débuté sous Linux embarqué ! [Fermé]

Signaler
Messages postés
125
Date d'inscription
dimanche 10 août 2008
Statut
Membre
Dernière intervention
7 janvier 2013
-
mamiemando
Messages postés
29140
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
25 janvier 2020
-
Bonjour tout le monde,

Cela fait quelques mois que j'essaye de récolter des informations sur "comment développer une application embarquée sous Linux ?" De ce fait, j'ai lu énormément d'articles sur le sujet et jusqu'à présent, ça reste flou pour moi. Pour info, j'ai seulement travaillé 2 mois au cours d'un stage hors embarqué sur un PC équipé d'une distribution Ubuntu sur un projet d'imagerie médicale (ça remonte à 3 ans). En effet, Passionné de l'embarqué, je développe en langage C sur microcontroleur PIC et j'intègre dans mes applications des interfaces de communication industrielles comme CANopen, Modbus et un protocole maison. Cependant, je souhaiterai me lancer sur du TCP/IP (je pense bien maîtrisé théoriquement le modèle en couche puis quelques exemples de sources). Personnellement, j'ai envi de basculer sur le développement Linux embarqué par curiosité et dans le but de renforcer mes compétences. Voici quelques questions permettant de m'éclaircir les idées :

1. Un programme embarqué classique sans OS se démarre juste après la mise sous tension de la carte au main.c, alors comment ça se passe pour un OS embarqué ?

2. Si je dispose d'une application sans OS communiquant par liaison série, comment pourrais-je intégrer cette même application dans un OS embarqué ? L'accès aux GPIO (ports d'entrée/sortie) se ferra aussi simplement qu'avec sans OS (par exemple piloter une led) ?

3. Un programme C sur PIC est dit séquentiel, alors avec un OS, mon programme s'exécutera de quelle manière ?

4. Et la question au-quelle je n'arrête pas de me poser : qu'est ce qu'un OS embarqué peut apporter à une application ?

Je reconnais que mes questions sont assez vagues mais je pourrai surement les préciser suivant vos différentes réponses que j'attends avec impatience !!

Merci à vous.

Cordialement,

3 réponses

Messages postés
29140
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
25 janvier 2020
6 748
Peut-être que tu devrais commencer par lire les sites dédiés comme par exemple :
http://embeddedcraft.org/embedlinuxdesktoplinux.html

1) Si c'est comme un linux normal, une fois le noyau (kernel) chargé, celui-ci lance le processus init qui va lancer en cascade toute une série de processus.

2) Il existe sans doute tout simplement une librairie ou une fonction en C qui permet de travailler directement avec le port série.
http://www.easysw.com/~mike/serial/serial.html

3) Je n'ai pas compris ce que tu entendais par séquentiel. Je ne pense pas qu'il y ait de différence, concrètement, ton OS déroule le (les) fil(s) d'exécution de ton programme et dans chaque fil d'exécution, il exécute chaque instruction séquentiellement. Tant que tu n'utilises pas de threads ou de mécanismes équivalents (voir epoll) tu n'as qu'un seul fil d'exécution.

4) Je pense que cette question n'a pas vraiment de sens non plus. Sous linux une application s'appuie sur l'OS, qui s'appuie sur le noyau, qui interagit avec le matériel. Ces deux parties sont complètement segmentées.

applications
------------------
OS
----------------
kernel | modules
----------------
hardware


Le noyau permet à l'OS de s'abstraire le plus possible des considérations matériel. Pour faire très simple tu peux voir le noyau comme une sorte de "pilote" pour l'ensemble de ton matériel.

Maintenant il faut se demander ce que tu veux développer : s'agit-il d'un programme qui tourne dans l'espace utilisateur ou dans l'espace noyau.
http://fr.wikipedia.org/wiki/Espace_noyau
http://fr.wikipedia.org/wiki/Espace_utilisateur

- Typiquement un pilote est spécifique à un matériel donné, il est donc développé dans l'espace matériel. De manière générale les considérations "bas niveau" (gestion du système de fichiers, du matériel etc...) sont gérés par le noyau ou un module et tourne donc dans l'espace noyau.

- Dans l'espace utilisateur tourne les applications, en particulier celles lancées ou directement manipulée par un utilisateur (par exemple son navigateur internet, son environnement graphique, etc...).

Bonne chance
Messages postés
125
Date d'inscription
dimanche 10 août 2008
Statut
Membre
Dernière intervention
7 janvier 2013
4
Merci pour les points 1 et 2. Par contre sur le troisième point, je pensais que le rôle de l'OS était justement de faire la gestion des évènements qui se déroulent autour de ton programme. Je croyais qu'utiliser un OS te permettrait d'utiliser les fonctions de gestion d'évènement toute faite (Par exemple: réception d'un flux de message sur UART). Si j'ai un OS et que je dois encore implementer mes fonctions d'interruption sur l'UART, alors je ne vois pas le rôle de l'OS. A moins que la reception pourra se faire dans un Thread !!!! peut être bien lol......

En tout cas, plus je vous lis plus j'ai des reponses à mes questions. Je n'ai pas tout à fait commencer mon projet, donc je souhaiterai vos avis sur quelle type de carte me conseillerez-vous afin de pouvoir s'amuser à developper de petits projets autour d'un OS Linux embarqué ?

En gros, je souhaiterai une carte avec interfaces serie (232 ou 485 ou même USB) et ethernet IP.

Merci d'avance.

Yous
Messages postés
29140
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
25 janvier 2020
6 748
Alors je ne vois pas le rôle de l'OS.

Prends une fonction au hasard, par exemple malloc. Cette fonction alloue de la mémoire. La manière dont la mémoire sous linux et sous windows diffère, car chaque OS a sa propre stratégie. La fonction malloc est donc implémentée différemment dans la libc sous windows et sous linux. En ce sens la libc est dépendante de l'OS.

Une fonction malloc n'a d'effet parce qu'elle agit sur des éléments sous-jacents (noyau, puis matériel), car un moment il faut bien finir par interagir avec le matériel. En ce sens le noyau et l'OS sont utilisé par ton programme.

C'est pour ça que je ne comprends pas vraiment ta question, c'est comme si tu me disais l'encre ça sert à rien dans un stylo. À un moment il faut bien pouvoir écrire, sinon ce stylo ne sert à rien :-)

A moins que la reception pourra se faire dans un Thread !!!!

Rien à voir. Un thread est juste un processus fils créé à partir d'un processus parent. Chaque processus exécute son propre fil d'exécution et tourne "en parallèle" (en fonction du nombre de CPU, de s'ils sont disponibles, etc...).

Je croyais qu'utiliser un OS te permettrait d'utiliser les fonctions de gestion d'évènement toute faite (Par exemple: réception d'un flux de message sur UART).

Oui et c'est typiquement ce qu'il va se passer. Si ton noyau gère un port série alors ton OS peut espérer interagir avec le port série. Dès lors les fonctions de la libc qui travaillent avec ont une chance de marcher.

Par exemple sous linux, un port série est représenté par un device. Un device est un fichier qui n'a pas d'existence sur le disque dur au même titre qu'un dossier ou qu'un fichier de données. Mais après tout, pourquoi se limiter à des fichiers de données. En effet, comme une arborescence de fichiers n'est qu'une vue de l'esprit, pourquoi ne pas y intégrer des fichiers un peu spéciaux ? C'est le choix qui a été fait sous linux, et on peut donc représenter avec des fichiers plein de choses (des sockets, des pipes, des liens symboliques, des hard links, des devices etc...). Ainsi la notion de fichiers est beaucoup plus générale sous linux que sous windows.

Un device est une interface proposé par l'OS pour manipuler un matériel sous-jacent. Sous linux les devices sont rangés dans /dev. Par exemple écrire dans le device associé à une carte son revient à jouer un son, écrire des bits dans un device associé à une partition de données revient à modifier bit à bit ce qui est stocké sur la partition etc. Pour un port série j'imagine que tu peux lire ou écrire des données (selon que tu les reçois ou que tu les émets).

Comme tu le vois dans cet exemple, le port série est représenté par un fichier /dev/ttySMX0 (ici via le langage shell et via le programme stty)
http://www.armadeus.com/wiki/index.php?title=Uart

En langage C pour ouvrir un fichier on utilise la fonction fopen, qui retourne un file descriptor (fd). À partir de ce file descriptor, on peut déclencher des opérations de lecture ou d'écriture. Ici tu as un exemple poù le programme est écrit en langage C :
http://pficheux.free.fr/articles/lmf/serial/

Bonne chance