Vous êtes sur la page 1sur 11

DépartementDépartementDépartementDépartement Electronique,Electronique,Electronique,Electronique, PhysiquePhysiquePhysiquePhysique etetetet PropagationPropagationPropagationPropagation

GGGGGGGGuuuuuuuuiiiiiiiiddddddddeeeeeeee ddddddddeeeeeeee llllllll’’’’’’’’ééééééééllllllllèèèèèèèèvvvvvvvveeeeeeee

MMMMMMMMoooooooodddddddduuuuuuuulllllllleeeeeeee

PPPPPPPPRRRRRRRRAAAAAAAATTTTTTTTIIIIIIIIQQQQQQQQUUUUUUUUEEEEEEEE DDDDDDDDEEEEEEEE LLLLLLLLAAAAAAAA PPPPPPPPRRRRRRRROOOOOOOOGGGGGGGGRRRRRRRRAAAAAAAAMMMMMMMMMMMMMMMMAAAAAAAATTTTTTTTIIIIIIIIOOOOOOOONNNNNNNN EEEEEEEETTTTTTTT DDDDDDDDEEEEEEEESSSSSSSS OOOOOOOOSSSSSSSS EEEEEEEEMMMMMMMMBBBBBBBBAAAAAAAARRRRRRRRQQQQQQQQUUUUUUUUEEEEEEEESSSSSSSS

PromotionPromotionPromotionPromotion

IIIIIIIInnnnnnnnggggggggéééééééénnnnnnnniiiiiiiieeeeeeeeuuuuuuuurrrrrrrrssssssss 22222222 èèèèèèèèmmmmmmmmeeeeeeee aaaaaaaannnnnnnnnnnnnnnnééééééééeeeeeeee

DominanteDominante:DominanteDominante::: CommunicationCommunicationCommunicationCommunication &&&& SystèmesSystèmesSystèmesSystèmes NumériquesNumériquesNumériquesNumériques (COMSYN)(COMSYN)(COMSYN)(COMSYN)

EnseignantsEnseignantsEnseignantsEnseignants responresponsablesresponresponsablessablessables

KKKKKKKKhhhhhhhhaaaaaaaalllllllleeeeeeeedddddddd GGGGGGGGrrrrrrrraaaaaaaattttttttiiiiiiii

SUP’COM - Tunis – Avril 2014

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués

SSSSSSSSOOOOOOOOMMMMMMMMMMMMMMMMAAAAAAAAIIIIIIIIRRRRRRRREEEEEEEE

PartiePartiePartiePartie 1111 ::::

Initiation à l’environnement VDK de Visual DSP

PartiePartiePartiePartie 2222 ::::

Projet dapplication 1 : Driver simplifié d’un Module GSM : Couche Phy

PartiePartiePartiePartie 3333 ::::

Projet d’application 2 : Couche protocolaire de niveau 2 : Couche PPP

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués

Partie 1

IniInitiIniInititiationtiationationation àààà l’environnementl’environnementl’environnementl’environnement «««« VDKVDKVDKVDK »»»» dededede VDVDSP++VDVDSP++SP++SP++

1.11.11.11.1 ButButButBut

L’objectif de ce TP d’initiation est d’apprendre les étudiants à utiliser l’environnement « VDK » de VDSP++. Dans ce TP, nous allons créer un nouveau projet VDK et saisir un système très simple qui permet un échange de messages entre deux threads.

1.21.21.21.2 CréationCréationCréationCréation d’und’und’und’un projetprojetprojetprojet SDLSDL-SDLSDL--RT-RTRTRT

Pour créer un nouveau projet, il faut choisir le menu FileFileFileFile puis NewNewNewNew ensuite projectprojectprojectproject. Ensuite

sélectionner « VDK Application » dans la fenêtre « Project Wizard ». Sauvegarder le projet sous

un

Figure 1.

répertoire nommé \TP0 sous le nom de « ClientServeurClientServeurClientServeurClientServeur». tel que c’est indiqué par la

e r v e u r » . tel que c’est indiqué par la FigureFigureFigureFigure 11.11

FigureFigureFigureFigure 11.11 TypeTypeTypeType dededede projetprojet.projetprojet

Une fois le projet créé, un nouvel onglet « kernelkernelkernelkernel » s’ajoute dans la fenêtre affichant la liste des projets en cours de traitement. Cet onglet permet de déterminer les options du projet VDK telles que les options du processeur système et celles des threads à créer

dans le projet. En cliquant sur le champ « MaximumMaximumMaximumMaximum RunningRunningRunningRunning ThreadsThreadsThreadsThreads », fixer ce nombre à 3.

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués FigureFigureFigureFigure 22.22 OptionsOptionsOptionsOptions dededede

FigureFigureFigureFigure 22.22 OptionsOptionsOptionsOptions dededede projetprojet.projetprojet

1.2.11.2.11.2.11.2.1 CréationCréationCréationCréation d’und’und’und’un threadthreadthreadthread

Avec le bouton droit de la souris cliquer sur le champ ThreadThreadThreadThread TypesTypesTypesTypes et choisir NewNewNewNew

ThreadThreadThreadThread TypeTypeTypeType (voir ErreurErreurErreurErreur !!!! SourceSourceSourceSource dudududu renvoirenvoirenvoirenvoi introuvable.introuvable.).introuvable.introuvable.

introuvable.introuvable.).introuvable.introuvable. FigureFigureFigureFigure 3.3.3.3. MenuMenuMenuMenu

FigureFigureFigureFigure 3.3.3.3. MenuMenuMenuMenu ThreadThreadThreadThread Types.Types.Types.Types.

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués

Une nouvelle fenêtre s’affiche pour saisir le nom du nouveau thread à créer ainsi que le choix du langage de programmation à utiliser, sélectionner le langage C. (voir ErreurErreurErreurErreur !!!! SourceSourceSourceSource dudududu renvoirenvoirenvoirenvoi introuvable.introuvable.).introuvable.introuvable.

introuvable.introuvable.).introuvable.introuvable. FigureFigureFigureFigure 22.22 AjoutAjoutAjoutAjout

FigureFigureFigureFigure 22.22 AjoutAjoutAjoutAjout d'und'und'und'un threadthreadthreadthread. Une fois le nouveau Thread est crée, une mise à jour à l’onglet « kernelkernelkernelkernel » est effectuée, en affichant les paramètres du thread, telles que sa priorité, l’espace mémoire qui lui a été affectée, et le nom du code source correspondant.

Activer l’option d’échange de messages en choisissant truetruetruetrue pour le champ « MessageMessageMessageMessage EnabledEnabledEnabledEnabled ».

Refaire la même opération pour créer un Thread « ServeurServeurServeurServeur », et un troisième « boothboothboothbooth » (voir figure

5).

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués FigureFigureFigureFigure 33.33 LListeLListeisteiste desdesdesdes

FigureFigureFigureFigure 33.33 LListeLListeisteiste desdesdesdes threadsthreadsthreadsthreads créescréescréescrées etetetet leursleursleursleurs paramètresparamètres.paramètresparamètres

11.11 2.22.2 2.222

CréationCréationCréationCréation dudududu threadthreadthreadthread d’initialisationd’initialisationd’initialisationd’initialisation

Avec le bouton droit de la souris, cliquer sur le champ BootBootBootBoot ThreadThreadsThreadThreadsss et choisir NewNewNewNew BootBootBootBoot ThrThreadThrThreadeadead (voir Figure 6).

BootBootBootBoot ThrThreadThrThreadeadead (voir Figure 6). FigureFigureFigureFigure 66.66 MenuMenuMenuMenu ««««

FigureFigureFigureFigure 66.66 MenuMenuMenuMenu «««« BootBootBootBoot TreadTreadTreadTread »».»»

Saisir le nom « boot Ini » pour le nouveau boot Thread et lui affecter le thread Type «booth » crée dans la phase

précédente.

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués FigureFigureFigureFigure 77.77 ThreadThreadThreadThread

FigureFigureFigureFigure 77.77 ThreadThreadThreadThread d’initialisationd’initialisation.d’initialisationd’initialisation

11.11 2.22.2 3.333

AjustementAjustementAjustementAjustement desdesdesdes paramètresparamètresparamètresparamètres desdesdesdes messamessagesmessamessagesgesges

Afficher les paramètres des messages échangés dans le système, fixer à 1 le nombre maximum de messages

échangés simultanément (voir figure 8).

de messages échangés simultanément (voir figure 8). FigureFigureFigureFigure 88.88

FigureFigureFigureFigure 88.88 ParamètresParamètresParamètresParamètres desdesdesdes messages.messages.messages.messages.

Une fois cette étape d’initialisation est terminée, et en revenant à l’onglet « projectprojectprojectproject », des fichiers

*.c.c.c.c représentant les squelettes des codes sources des différents threads créés ont été

automatiquement ajoutés sous le répertoire « sources files » (figure 9).

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués FigureFigureFigureFigure 99.99 ListeListeListeListe desdesdesdes

FigureFigureFigureFigure 99.99 ListeListeListeListe desdesdesdes codescodescodescodes sourcessourcessourcessources correspondantscorrespondantscorrespondantscorrespondants auxauxauxaux threadsthreadsthreadsthreads créés.créés.créés.créés.

1.31.31.31.3 DéveloppementDéveloppementDéveloppementDéveloppement dudududu codecodecodecode «««« booth.cbooth.cbooth.cbooth.c »»»»

1. Commencer par déclarer deux variables globales : server_IDserver_IDserver_IDserver_ID et client_IDclient_IDclient_IDclient_ID, les deux sont de

type « VDK_ThreadIDVDK_ThreadIDVDK_ThreadIDVDK_ThreadID ». Ces variables représenteront les identifiants des threads serveur et client qui échangeront les différents messages entre eux.

client qui échangeront les différents messages entre eux. FigureFigureFigureFigure 10.10.10.10.

FigureFigureFigureFigure 10.10.10.10. DéclarationDéclarationDéclarationDéclaration desdesdesdes variablesvariablesvariablesvariables globales.globales.globales.globales.

2. En commençant par la création

au

« helphelp\helphelp\\contents\contentscontents\contents\\Manuals\ManualsManuals\Manuals\\Software\SoftwareSoftwareSoftware ToolToolToolTool ManualsManuals\ManualsManuals\\VDK\VDKVDKVDK ManualManual\ManualManual\\VisualDSP++\VisualDSP++VisualDSP++VisualDSP++ 5.05.05.05.0 Kernel(VDK)Kernel(VDK)Kernel(VDK)Kernel(VDK) User’sUser’sUser’sUser’s GuideGuide\GuideGuide\\V\VVDKVDKDKDK APIAPIAPIAPI ReferenceReference\ReferenceReference\\API\APIAPIAPI SummarySummarySummarySummary 55-55--5-555 » et vérifier le

prototype de la fonction « VDK_CreateThreadVDK_CreateThreadVDK_CreateThreadVDK_CreateThread ».

des

threads

sever_IDsever_IDsever_IDsever_ID

et

clienclient_IDclienclien _ID_ID_ID,

accéder

et clienclient_IDclienclien _ID_ID_ID , accéder FigureFigureFigureFigure 1111111.1

FigureFigureFigureFigure 1111111.1 UtilisationUtilisationUtilisationUtilisation dededede l’aidel’aidel’aidel’aide pourpourpourpour lesleslesles fonctionsfonctionsfonctionsfonctions VDKVDKVDKVDK

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués

3. Appeler la fonction « VDK_CreateThreadVDK_CreateThreadVDK_CreateThreadVDK_CreateThread » pour créer les threads et mettre leurs identifiants dans les variables « server_ID » et « client_ID ».

4. Pour créer un message, regarder toujours dans le help sous APIAPIAPIAPI SummarySummarySummarySummary 55-55--5,-5,5,5, comment utiliser la fonction « VDK_CreateMessageVDK_CreateMessageVDK_CreateMessageVDK_CreateMessage ». Pour cela :

a. Annoncer dans le fichier « booth.hbooth.hbooth.hbooth.h » les macros MSTART, RQST et ACK, et leur affecter respectivement les valeurs 0, 1 et 2. Ces macros représenteront les différents types de messages échangés entre les threads.

b. Déclarer les variables locales MsgTypeMsgTypeMsgTypeMsgType (de type int), MsgSizeMsgSizeMsgSizeMsgSize (de type unsigned int) et *MsgPtr*MsgPtr*MsgPtr*MsgPtr (de type void) à utiliser dans la fonction « VDK_CreateMessageVDK_CreateMessageVDK_CreateMessageVDK_CreateMessage », et leur affecter respectivement les valeurs MSTART, 0 et NULL.

c. Déclarer une variable locale MsgIDMsgIDMsgIDMsgID de type VDK_MessageID.

5. Utiliser les déclarations précédentes dans -b et -c pour appeler la fonction « VDK_CreateVDK_CreateMessageVDK_CreateVDK_CreateMessageMessageMessage ».

6. Pour envoyer le message créé de type MSTART vers le thread « client_ID » :

a. Déclarer dans le fichier « booth.hbooth.hbooth.hbooth.h » le macro CHANNEL et l’affecter la valeur VDK_kMsgChannel5. Ce canal permettra de transmettre les messages échangés entre les threads.

b. Utiliser la fonction « VDK_PostMessageVDK_PostMessageVDK_PostMessageVDK_PostMessage » pour transmettre le message de type MSTART vers le client.

1.41.41.41.4 DéveloppementDéveloppementDéveloppementDéveloppement dudududu codecodecodecode «««« client.cclient.cclient.cclient.c »»»»

Commencer par appeler la variable globale « server_ID » comme externextern.externextern La suite du traitement est effectué dans la boucle ‘while’ de la fonction « client_RunFunction ».

1. Attendre le message MSTART sur CHANNEL :

a. Déclarer, de la même façon que dans le fichier « booth.c » les variables locales MsgID,MsgID,MsgID,MsgID, MsgTypeMsgType,MsgTypeMsgType MsgSizeMsgSizeMsgSizeMsgSize et *MsgPtr*MsgPtr.*MsgPtr*MsgPtr

Remarque : cette déclaration est effectué en dehors de la boucle ‘while’

2. Utilisez la fonction « VDK_PendMessageVDK_PendMessageVDK_PendMessageVDK_PendMessage » qui permet au thread client de détecter la réception du message via CHANNEL. Il faut mettre la valeur ‘0’ dans l’argument Timeout pour indiquer une attente infinie.

3. Pour lire et interpréter le message reçu, utiliser la fonction « VDK_GetMessagePayloadVDK_GetMessagePayloadVDK_GetMessagePayloadVDK_GetMessagePayload ».

4. Si le type du message reçu est MSATART ou ACK :

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués

a. Attendre un moment de durée 1 tick (utiliser la fonction « VDK_SleepVDK_SleepVDK_SleepVDK_Sleep »)

b. Changer le type du message : affecter la valeur RQST au type de message

5. Utiliser la fonction « VDK_SetMessagePayloadVDK_SetMessagePayloadVDK_SetMessagePayloadVDK_SetMessagePayload » pour fixer les paramètres du message préparé à transmettre sur le canal

6. Utiliser la fonction « VDK_PostMessageVDK_PostMessageVDK_PostMessageVDK_PostMessage » pour transmettre le message avec le nouveau type (RQST) vers le serveur.

1.51.51.51.5 DéveloppeDéveloppementDéveloppeDéveloppementmentment dudududu codecodecodecode «««« serveur.cserveur.cserveur.cserveur.c »»»»

Commencer par appeler la variable globale « client_ID » comme externextern.externextern La suite du traitement est effectué dans la boucle ‘while’ de la fonction « serveur_RunFunction »

1. Attendre le message RQST sur CHANNEL :

a. Déclarer, de la même façon que dans le fichier « booth.c » les variables locales MsgID,MsgID,MsgID,MsgID, MsgTypeMsgType,MsgTypeMsgType MsgSizeMsgSizeMsgSizeMsgSize et *MsgPtr*MsgPtr*MsgPtr*MsgPtr

b. Utiliser la fonction « VDK_PendMessageVDK_PendMessageVDK_PendMessageVDK_PendMessage » qui permet au thread serveur de détecter la réception du message via CHANNEL

2. Pour lire et interpréter le message reçu, utiliser la fonction « VDK_GetMessagePayloadVDK_GetMessagePayloadVDK_GetMessagePayloadVDK_GetMessagePayload ».

3. Si le type du message reçu est RQST: changer le type du message en lui affectant la valeur ACK

4. Utiliser la fonction « VDK_SetMessagePayloadVDK_SetMessagePayloadVDK_SetMessagePayloadVDK_SetMessagePayload » pour fixer les paramètres du message préparé à transmettre sur le canal

5. Utiliser la fonction « VDK_PostMessageVDK_PostMessageVDK_PostMessageVDK_PostMessage » pour transmettre le message avec le nouveau type (ACK) vers le client.

1.61.61.61.6 SimulationSimulationSimulationSimulation dudududu systèmesystèmesystèmesystème

11.11

Lancer Build File pour les trois fichiers source et Build Project par la suite.

22.22

Effectuer l’exécution (Touche F5) et vérifier le fonctionnement du programme. On peut faire appel aux points d’arrêts pour vérifier l’exécution de chaque étape d’échange de messages.

33.33

Pour visualiser graphiquement les détails de création de threads et messages, et d’échange de messages, afficher la fenêtre « VDKVDKVDKVDK StateStateStateState HistoryHistoryHistoryHistory » à partir de « View\VDK Windows\History » pour visualiser l’enchaînement des différentes opérations effectuées.

44.44

Commenter le résultat affiché dans la fenêtre « VDK State History ».

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués

Pratique de la programmation et des OS Embarqués FigureFigureFigureFigure 1121122.2 FenêtreFenêtreFenêtreFenêtre

FigureFigureFigureFigure 1121122.2 FenêtreFenêtreFenêtreFenêtre «««« VDKVDKVDKVDK StatStateStatStateee HistoryHistoryHistoryHistory »