Vous êtes sur la page 1sur 36

TravauxPratiques

LogicielTempsrel

SylvainMONTAGNY
sylvain.montagny@univsmb.fr
Btimentchablais,bureau13
0479758686

TP1
LogicielTempsrel
DSPTMS320C5416

Objectif:Crationdunprojetsimple,monotchesurplateformeDSP.
Fichiermisdisposition(MoodleScienceBourget)

Fichierdecommande:dsp.cmd
Fichierdelibrairie:rts.lib

1 Cration dun projet


Question1:

Crerunnouveauprojetdsp.pjtdanslerpertoiredevotrechoix.Expliquez:

ProjectName:....................................................

Location:.......................................................

ProjectType:....

Target:

Aprscration,expliquez:

DependentProjects:.

Documents:

|1


DSP/BIOSConfig:...................................................

GeneratedFiles:..

Include:..

Librairies:..

Sources:....

Note : Tous les fichiers que vous rajouterez au projet devront se trouver dans votre
rpertoiredetravail.

2 Ralisation du code
2.1 Etape 1
Crerunnouveaufichiersourcedsp.c,rentrerlecodesuivant(quinesertrien!!!),et
ajouterlefichierauprojet.(ClicdroitsurSources>AddFilestoproject>dsp.c)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

voidmain(void)
{
inta=2,b=3;

a=2;
b=3;

a=b+10;
b=a+1;

while(1);
}

Question2:

Expliquerlesactionsde:(Help>Contents)

CompileFile:....................................................

IncrementalBuild:................................................

|2

RebuildAll:.

2.2 Etape 2
Compilerleprojet.VousallezobtenirleWarningsuivant.
>>Warning:TheprojecthasnocmdfilewhiletheTextLinkerisselected:
Rajouterlefichierdsp.cmd
Question3:

Questcequunfichierdecommandedefaonprcise.

....

>>warning:entrypointsymbol_c_int00undefined(Help>Content:_c_int00)

CewarningestdaufaitquequilmanqueunelibrairiespcifiqueauDSPquenousutilisons.En
effet,lesfonctionsCstandardsnepeuventpastreconnu(printf(),etc).Deplus,lepointdentre
duprogrammemain()doittreprcis.Lalibrairyrts.lib(RunTimeSupportLibrary)doitdonctre
rajout.

>>warning:creating.stacksectionwithdefaultsizeof400(hex)words.

Question4:

Aquellezonemmoire,cewarningfaitilrfrence?

........................................................

Spcifiervousmmesacapacit:Project>BuildOptions>Linker>StackSize>0x400.

3 Les diffrentes configurations du projet :


Faites un affichage sur code assembleur gnr (View>Mixed Source/Asm) aprs avoir
compildanslesdeuxmodesdeconfigurationDEBUGetRELEASE.

DEBUG:..

|3

RELEASE:....
ModifierlecodeparlecodesuivantetlecompilerenmodeDEBUG.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.

#include<stdio.h>
voidmain(void)
{
inta=2,b=3;

a=2;
b=3;

a=b+10;
b=a+1;

while(1){
if(a==2){
printf("a=2!!\n");
}

else{
printf("adifferentde2\n");
}

}
}

>>warning:creating.sysmemsectionwithdefaultsizeof400(hex)words.
Question5:

Aquellezonemmoire,cewarningfaitilrfrence?(Help>Contents>sysmen)

......................................................
Spcifiervousmmesacapacit:Project>BuildOptions>Linker>HeapSize>0x400.

4 Ajouter des fichiers au projet


Modifierlecodeprcdentparlecodesuivant(quineserttoujoursrien).

|4

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.

voidcalc(void);

voidmain(void)
{
inta=2,b=3;

a=2;
b=3;

a=b+10;
b=a+1;

while(1){
if(a==2){
calc();
}

else{
calc();
}

}
}

voidcalc(void){
intc=0,d=0;

c=d+12;
d++;
d=c+12;
}
Raliserunprojetmultifichiersendportantlafonctioncalc()dansunautrefichier.
ExcuterlecodeprcdentsurlacibleDSPetexpliquerlesmthodesdexcutionpaspas
singlestepetstepoverdanslesdeuxmodes(modesourceetmodeassembleur).
Faitesdiffrentsessaispourbiencomprendrelefonctionnement.

Singlestep:

StepOver:..

|5

5 Directives pr-processeur
5.1 #include
Question6:

Questcequunedirectiveprprocesseur?

.........................................................

Allervoirlefichierstdio.h:C:\CCStudio_v3.1\c5400\cgtools\include.Onretrouvedans
cefichiernonpaslecodemachinedesfonctionsmaisseulementleursdclarations.Ceci
nous permet donc de les utiliser. Au cours de la compilation, les codes machines des
fonctionsutilisesserontassemblsavecnotrefichiercompilpourcrerlexcutable.

Ilexistedeuxfaonsdinclureunfichierlaidelaprimitive#include
#include<xxx.h>:Silechemindaccsestconnuparlecompilateur.
#includec:/./xxx.c:Lorsquevoussouhaitezspcifiervousmmelechemindaccs.

5.2 #ifdef, #ifndef


Les dfinitions de symboles peuvent tre faites par #define, ou dans Project>Build
Option>Preprocessor>PredefineSymbol
AfficherletexteDbutduprogrammesilesymbolePROGestdfini.
AfficherletexteVersionDEBUGsilesymboleRELEASEnestpasdfini.

5.3 Cration de librairies :


Fairelestutorialsproposssurcesujet.
Help>Tutotrial>CodeComposerStudioTutorial>CodeComposerStudioIDE>ProjectManagement>Overview
Help>Tutotrial>CodeComposerStudioTutorial>CodeComposerStudioIDE>ProjectManagement>CreatingFiles
Help>Tutotrial>CodeComposerStudioTutorial>CodeComposerStudioIDE>ProjectManagement>CreatingaLibraryproject
Help>Tutotrial>CodeComposerStudioTutorial>CodeComposerStudioIDE>ProjectManagement>CreatingaExecutableApplication

|6

TP2
LogicielTempsrel
DSPTMS320C5416

Objectif:UtilisationdeDSPBIOS,utilisationdesfonctionsduBoardSupportLibrary(BSL)etduChip
SupportLibrary(CSL).
Fichiermisdisposition(Moodle)

FichierdaideCSL:ChipSupportLibrary

FichierdaideBSL:BoardSupportLibrary

Fichierdeconfigurationconf_MCBSP

Include&libraries:
DSK5416.h
dsk5416_led.h
dsk5416_pcm3002.h
dsk5416f.lib

1 DSP/BIOS
LirelaidedeDSPBIOSsurlechapitreWhatisDSP/BIOS?
Question1:
ExpliquercequestDSP/BIOSenprcisantenquelquesmotslescaractristiquesqui
vousparaissentlespluspertinentes.
.........................................................

.........................................................

|1

Crer un nouveau projet nomm dsp1.pjt. Crer un fichier de configuration


(File>New>DSPBIOSConfiguration)dsp1.cdbetraliserunesimpleapplicationHello
World\n.
SurlacibleDSP(le\nestindispensablepourunprintf()).

Silacompilation,vous avezuneerreur:Projectbuildoptions do not matchGlobal


configurationsettings,faitesloprationsuivante:
Project>BuildOptions>Compiler>Advance,etcocherUseFarCalls

dsp1cfg.h est un fichier qui a t gnr par le compilateur en prenant en compte la


configurationquevousavezsaisidansdsp.cdb(fichierdeconfiguration).Vouspouvezle
visualiser (dans include) et vous devez imprativement linclure en premier dans votre
codesource:#include"dsp1cfg.h"

Ouvrirlefichierdeconfigurationetfaiteuntourdetouslesmodulesquisontrpertoris.Alleraussi
voirlesfichiersgnrs(GeneratedFiles)aprslacompilation.
Chargervotrecodeenmmoire:File>LoadProgram
Note:Afindassocierlacompilationetlechargementducodeenmmoire,vouspouvez
modifierlesoptionsdeCCS:Option>Customize>Cochez:LoadProgramafterBuild
Question2:

Pourquoinatonpaseubesoindefournirdefichierdecommande(*.cmd)?

..........................................................

2 BSL : Board Support Library


VisualiserlefichierdaideBSL.

1. Utilisation du BSL
Reprer les diffrents groupes de fonctions disponibles dans laide (5416DSK>Board
SupportLibrary),etexpliquerlerleduBSL.

..........................................................

..........................................................

|2

FairelinitialisationdespriphriquesdelacarteDSK(BoardSetup)enutilisantlafonction
adquate. A la place de la librairie dsk5416.lib, vous utiliserez la librairie dsk5416f.lib
fournie.
LacarteDSK5416possde4LEDset4switchs,quipermettentlutilisateurdinteragiravecleDSP.
Raliserunprogrammequifaitclignoteruneled.Vousraliserezlatemporisationlaide
duncompteur(de01000000,bouclefor)pourvoirleclignotement.Vousutiliserezles
fonctionsduBSLpourlagestiondesLEDs.

2.1 Cration de tche : TASK


Lobjectifdecettepartieestdecrer2tchesdiffrentesexcutantdesfonctionsduBSL.
Enralit,lafonctionmain()nesertnormalementquinitialiserlacarteetlenvironnementglobal
duDSP.Ds quecelaest ralise,lafonctionmain()rendla mainaunoyau et toutesles tches
utilisateurssontexcutes.
A laide du fichier de configuration dsp1.cdb, crer une tche task0. Vous rglerez
simplementdeuxchoses:

Laprioritdecettetche

LafonctionCassociecettetche(nomdelafonctionprcddun_/underscore)
quevouscoderezdansleprogrammesource.

NotrefonctionsappelleraBlink0(),donc_Blink0danslefichierdeconfiguration.
Lecodeassocivotretcheseralasuivante:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.

voidBlink0()
{
intdelay=500;//SetdelaybetweenLEDtransitions

while(1)
{
/*TurntheLEDon*/
DSK5416_LED_on(0);
TSK_sleep(delay);

/*TurntheLEDoff*/
DSK5416_LED_off(0);
TSK_sleep(delay);
}
}
Raliserdelammemanireunesecondetachetask1permettantdefaireclignoterla
LED1avecuntempsdeclignotementde1s.
DSP/BIOSRealtime,.MultitaskKernel.NousvenonsdedmontrerlaspectMultitask
Kernel,parlasuite,nousnousattacheronslapartieRealtime.

|3

Faireunschmatemporelreprsentantletempsenabscisseetlestchesquisexcutent
enordonne(main,TSK_idle,task0,task1).Pourchaquetchevousutiliserezdescouleurs
diffrentessuivantlestats(quevousprciserez)decelleci.

3 CSL : Chip Support Library


VisualiserlefichierdaideduCSL
Question3:

ExpliquerlerleduCSL:

............................................................

.....
Question4:

QuelleestladiffrenceentreleCSLetleBSL?

...........................................................

..........................................................
Crerunnouveauprojetdsp2.pjtavecunnouveaufichierdeconfigurationdsp2.cdb.
Raliserlacompilationcompltedevotreprojet.

3.1 Analyse du fichier dsp2cfg.h


dsp2cfg.hestunfichierquiatgnrparlecompilateurenprenantencomptelaconfiguration
que vous avez saisi dans dsp.cdb (fichier de configuration). Certains objets par dfaut sont dj
cres,commeparexemplelatchedefond(TSK_idle)ouleRTDX(modulequipermetdedialoguer
entrelePCetleDSP).NousallonsrajouterunmoduledeliaisonSrieMcBSP.
Pourraliserunetellemanipulation,ilfautbienprendreenmaintoutelaliaisonsriedenotreDSP
entudiantsadocumentation.Cecinerentrepasdanslecadredececours.Nousnouscontenterons
doncdercupreruneconfigurationexistante.
Dans votre rpertoire de travail, renommer le fichier de configuration dsp2cfg.h en
dsp2cfg_old.h, afin de sauvegarder une trace du fichier pour la suite. Nous allons
maintenantmodifierlaconfigurationduprojetetanalyserlenouveaufichiercr.
Dans le fichier de configuration CDB fourni (fichier conf_MCBSP.cdb), copier les
configurationspourlaliaisonsrie:
Danslefichierconf_MCBSP:

|4

ChipSupportLibray>MCBSP>MCBSPconfigurationmanager>mcbspCfg0>Clicdroit>Copy.
Dansvotrefichierdeconfiguration:
ChipSupportLibray>MCBSP>MCBSPconfigurationmanager>mcbspCfg0>Clicdroit>Paste.
Editer les proprits du module McBSP2 (MCBSP>MCBSP ressource Manager>McBSP2).
Danscemodule,cocherlesdeuxcasesetrentrerlaconfigurationsuivante:

SpecifyHandleName:C54XX_DMA_MCBSP_hMcbsp

Preinitialize:mcbspCfg0(votrefichierdeconfigurationquevousvenezdecrer)

Remarque: Nous utilisons le MCBSP2, car cest le numro 2 qui a t connect au Codec audio
(convertisseurAN/NA:PCM3200).AinsilobjectifestderaliserundialogueavecceCodec.
Question5:
Quelles sont les deux dclarations qui ont t rajoutes au fichier dspcfg.haprs
compilationdevotreprojet?
........................................................
Question6:
EnvousrfrantlaidesurleCSLetplusparticulirementlintroduction,direce
questunhandleenprogrammationsystme?
Handle:.
Question7:

Quelleestleffetdelidentificateurexternsurladclarationdunevariable?

Extern:.....................................................
Note:Sinousnavionspasutilislaconfigurationstatiquedanslefichierdeconfiguration
de DSP/BIOS, nous aurions pu le faire de faon dynamique, pendant lexcution du
programmeaveclesfonctions:
MCBSP_open() OpensaMcBSPport
MCBSP_start()
Startatransmitand/orreceiveforaMCBSPport

Question8:
Grcelaide,expliquerlerledelafonctionMCBSP_open()etvaliderlefaitquelle
fassebienlammechosequecequenousavonsconfigurstatiquementdanslefichierdsp.cdb.

|5

........................................................

4 Ralisation dune application


Encontinuantleprojetprcdent,nousnousproposonsderaliseruneapplicationsimplemettant
en uvre le MCBSP2 (CSL) et le Codec audio PCM3200 (BSL) fonctionnant 48 khz (conversion
48000foisparseconde).Lobjectifestdenvoyerunesinusodede1Khzpendant5ssurleshauts
parleurs.
Lastructuredeconfigurationdelaliaisonestdonnecidessous(utilelorsdelouvertureducodec
audio).Ilnestpasimportantdecomprendrececontenu.Ilsertconfigurerlattnuationdesvoix
droite,gauche,etdautreslmentspeuimportants.
1.
2.
3.
4.
5.
6.

DSK5416_PCM3002_Configconfig={
0x010d,//SetUpReg0LeftchannelDACattenuation
0x010d,//SetUpReg1RightchannelDACattenuation
0x0000,//SetUpReg2Variousctle.g.powerdownmodes
0x0000//SetUpReg3Codecdataformatcontrol
};

Toute la gestion de cette application sera ralise dans une tche dont la fonction sera void
UserTask(void).

4.1 Initialisation du tableau de sinus


Afindoptimiserletempsdecalculsurleprocesseuretpoursimplifierleprogramme,nousallons
initialiser un tableau avec les valeurs du sinus que nous enverrons sur le codec audio (CNA)
fonctionnant48khz.
Question9:

Combienfautilcalculerdchantillondusinusafindobtenirunefrquencede1khz.

Faitelecalculentierdeschantillonsdunsinusdamplitude32766,etremplissezuntableau
appel:intsinetable[SINE_TABLE_SIZE].
Attentionlaconversiondetypeentrelesvariablesdoubledelafonctionsinusetvotre
tableaudentier.

Affichezlegraphiquedevotresinus(View>Graph>Time/Frequency)ladressesinetable,
pourvalidercettepartie.

4.2 Utilisation du Codec audio


Le codec audio fonctionne 48khz (valeur par dfaut). C'estdire quil acceptera un nouvel
chantillonquelorsquelapriodede1/48000seracoule.Lerestedutempsilindiqueraquela
liaisonsrieestBusy.

|6

Utiliserlesfonctionsdcrituredeschantillonsdevotresinusodeaucodecaudio.
Faire une mesure loscilloscope de la sortie du codec audio. Relever lamplitude et la
priodedusignal.

Figure1:Schmadujackaudiostro

4.3 Ajout de tches


RemettredansvotreprojetlestchesexcutantlesclignotementsdelaLED0(500ms)etla
LED1 (1 seconde). Visualisez le fonctionnement des LEDs pendant le temps dcoute de
votreson.
Question10:

Quesepassetiletpourquoi?Trouvezunesolutionceproblme.

|7

TP3
LogicielTempsrel
DSPTMS320C5416

Objectifs:Mesuredutempsdexcutiondestchesetfonctions

1 Profiling
ReprendreetfairefonctionnerleprojetduTPprcdent.
Si cela na pas dj t ralis, vous ferez une fonction simple (boucle for) qui permet
dinitialiserzroletableaudesinusavantleremplissagedeceluici:
voidreset_sinus_tab(void);
Lobjectif est de connatre le nombre de cycles que le processeur met pour excuter cette
initialisation.PourcelanousallonsutiliserunemthodeappeleProfing.Cettemthodenefaitpas
partieintgrantedunoyauDSP/BIOS.LoutilestseulementimplmentdansCCS.Voicilextraitde
ladocumentationprsentantleprofiling.
When you run a program to generate profile data, resume and halt breakpoints are set at the
beginningandendofeachprofilerange.Whentheprogramcounter(PC)encounterstheresume
breakpoint, the profiler obtains the value of the profile clock. When the PC encounters the halt
breakpoint,theprofileragainobtainsthevalueoftheprofileclock.Theprofilerusesthesetwovalues
tocalculatetheprofilingresults.
Question1:

Leprogrammesexcuteratilentempsrel?Pourquoi?

..........................................................

..........................................................
CompilervotreprogrammeetchargerledansleDSP.

|1

1.1 Configuration du Profiling :


IlfautdaborddsactiverunoutilappelRTDX(RealTimeDataeXchange).Eneffet,cetoutilque
nousntudieronspas,nestpascompatibleaveclutilisationduProfiling.
Tools>RTDX>ConfigurationControletdsactiverlacaseEnableRTDX.
FermerlafentreRTDX:ClickdroitsurlafentreRTDX>Close.
Lancerleprofiling:Profile>Setup,puiscliquersur .CliquersurProfileallfunctionand
LoopforTotalCycles:Celapermetdemesurerlenombredecyclesutilispourlensemble
delapplication.Chaquefonctionetchaqueboucleseratudie.
OuvrirleProfileViewer:Profile>Viewer
Lancerlapplication:Debug>Run

1.2 Etude du Profiling


1.2.1 Mesuredelensembleduprogramme
Dans le Profile Viewer, slectionner uniquement la vue des fonctions(bouton
). Visualiser la
cohrence des valeurs de access_count correspondant au nombre de fois que sont appeles les
fonctions:

InitSineTable()

DSK5416_PCM3002_write16()

Question2:
Donner le nombre de cycle que met la fonction InitSineTable( ) pour sexcuter:
CPU_cycle:incl.total.
Note:Aprsuncertaintempsleprofilingsestop.

1.2.2 Mesuredecertaineszonesduprogramme
PlacezunHelloWorld\nlentredevotrefonctionInitSineTable().
Slectionner la ligne de votre fonction printf ( ): Clicdroit sur la ligne
slectionne>Profile>Range.
VotrelignesajouteauchampRangedelongletRangedelafentreProfiler.Uneicne apparat
gauchesurlalignedevotreprogramme.Vouspouvezaussifairedirectementunglisserdposer
unedeszonesconcernes:Range,FunctionouLoopdelafentreProfiler.
Excutervotreprogramme.
Question3:
Noterlenombredecycleduprintf().SachantqueleDSPunefrquencede160
Mhz,donnerletempsdexcutionduprintf().

Comparerlenombredetempscyclemoyen(CPUCycle:average)pour:

Lafonctionreset_sinus_tab()complte>>function:

|2

Laboucleforralisantlaffectation>>Loop:.

Laligneseuledaffectationzrodesinustable[i]>>Range:.

1.2.3 Rductiondestempsdecycleparoptimisation
Mettreunpointdarrtsurvotrefonctionreset_sinus_tab().Afficherlecodeassembleur
gnr (Clic droit dans lditeur>mixedmode) et faite du pas pas (Debug >
Assembly/SourceStepping>AssemblyStepInto).Vouspouvezaussiutiliserleboutonvert
.
Ouvrezlavisualisationdevotremmoire(View>Memory)ladressedevotretableaude
sinusetregardercommentsontaffecteszrolescasesmmoires.
ModifierlesoptionsdoptimisationdeCCS.Project>BuildOption>OptLevel>Functiono2.
Refaiteslammemanipulationqueprcdemment.
Question4:
tableau?

Quelleinstructionassembleurperformantetutiliseicipourlinitialisationdu

.........................................................
Modifier les options doptimisation de CCS. Project>Build Option>Opt Level > File o3.
Mettre un point darrt lendroit o vous appelez votre fonction reset_sinus_tab( ) et
visualiserlecodeassembleur.
Question5:
Que remarquezvous de spciale pour lappel de la fonction? Comment
linitialisationatellepusefaire?
.........................................................

.........................................................
Faites une mesure de temps de cycle (Profiling) de la fonction printf( ) avec et sans
optimisation.
Question6:

Queremarquezvous?

.........................................................

1.2.4 RductionparutilisationdesoutilsDSP/BIOS
Lesoptionsdoptimisationnedonnentaucunrsultatauniveaudesfonctionstellequeprintf().On
comprendalorsquilestabsolumentindispensabledetrouverunealternativelutilisationdela
fonctionCstandardpourlaffichagedechanedecaractredepuislacibleDSPverslePC.Pourcela
nousallonsutiliserleLOGmodulefourniaveclesAPIDSP/BIOSetconfigurableaveclefichierxxx.cdb
devotreprojet.
Eneffet,lafonctionstandardprintf(),raliseellemmeleformatagedesdonnesetlenvoiversle
PC.C'estdirequelafonctiongrelecommunicationdeboutenbout,cequientermedetemps
daccs(etdoncdecyclemachineutilis)estcatastrophique.Danslecasdelutilisationdumodule
LOG,lacibleDSPsecontentedcriredansunbufferpralablementdclar,etlePChtevalui
mmechercherlesinformationsbrutesdontilabesoin.

|3

Figure1:TransfertdedonneauPCl'aidedumoduleLOG
CrerunnouvelobjetLOGappeltrace(Instrumentation>LOG).Inclurestd.h(obligatoire
pourtoututilisationdesmodules)etlog.h(pourcemoduleenparticulier).
FaiteunessaidelutilisationdelafonctionLOG_printf(),Exemple:
LOG_printf(&trace,helloworld);
Question7:
FaiteunemesuredutempsdexcutiondelafonctionLOG_printf()etcompareravec
lafonctionprintf().
NousnepouvonspasvoirlemessagepourlinstantcarlafonctionLOG_prinf()utilisele
moduleRTDX(inhibprcdemment).

.........................................................

.........................................................
RactiverRTDX:Tools>RTDX>ConfigurationControletactiverlacaseEnableRTDX.
LemessagehelloworldapparatdansleMessageLog:DSP/BIOS>MessageLog.
Sivotreapplicationutilise100%dutempsprocesseur(siparexemplevoustresdansune
boucle infinie en scrutation), il nest pas possible DSP/BIOS davoir le temps de
transmettrevotremessage.Ilestdoncutiledeforcerlepassageenutilisantlafonction
IDL_run()dansvotretcheUserTask().

Relancerlapplication.

|4

TP4
LogicielTempsrel
DSPTMS320C5416

Objectifs:Visualiserlordonnancementdesdiffrentestchesduneapplication.

Fichiermisdisposition(MoodleBourget):

DatasheetTMS320C54x_Archi_vol1

DSPBIOSUserGuide

Fichierdelapplicationannulationdcho

Etude du main ( ) et de la boucle IDL ( )


Raliserunprojetidle.pjt

Vous utiliserez le code suivant afin de mettre en vidence la faon dont le systme gre les
diffrentestchesquilexcute.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.

#include"idlecfg.h"//Mettrelenomcorrespondentvotreprojet
#include<std.h>
#include<log.h>

/*
*========main========
*/
Voidmain()
{
LOG_printf(&trace,"helloworld!");

/*fallintoDSP/BIOSidleloop*/
return;
}

|1


Aprslasquencededmarrageetlexcution delafonction main( ),une applicationDSP/BIOS
tombedansunetchedefondappelidleloop.Cettetchesexcutejusqu'quevousarrtiez
votreprogramme.Cettetcheestlamoinsprioritairedevotreapplication.Cestdanscettepartie
quesedroulelesinstructionsdelordonnanceuretlestransfertsdinformationverslePC.Dans
notrecas,cettetchesexcutetouteseulepuisquenousnavonspasdfinidautreprocessus
excuter.Cependant,ellepourraittrepremptepardesinterruptionshardware,ousoftware.

ChargervotrecodeenmmoireduDSPetmettreunpointdarrtsurlaligneduLOG_printf.
Mettre un autre point darrt sur ladresse IDL_F_loop (Debug>Breakpoints> taper
ladresseIDL_F_loop).IDL_F_loopcorrespondlafonctionexcuteparlelatcheIDL.
Aulancementduprogramme,leCPUsarrtesurlepremierpointdarrt.
Question1:

AlaidedeladocumentationduDSPfournie,donnerlerledubitINTM?

..........................................................
Question2:

Quelleestsavaleur(View>Registers>CPURegisters)?

..........................................................
Relancerleprogramme,leCPUsarrtesurleprochainpointdarrt.
Question3:
Quel est la nouvelle valeur du bit INTM (View>Registers>CPU Registers)? Quelle
sourcedinterruptionpeutnousinterrompre?
..........................................................
Question4:
Quesepassetilsionrelancenotreapplicationencoreetencore?Estcelogique
daprslapplicationquenousavonsralisecidessus?
..........................................................

..........................................................

2 Ordonnancement
Nous allons voir comment raliser une application contenant des tches de mme priorit. Ces
tchesauronttoujoursuneprioritplusfaiblequelesinterruptionshard(HWI)ousoft(SWI).La
diffrenceprincipaleentrelestchesTSKetlesinterruptionsmatrielles(HWI)etlogiciel(SWI),est
quunetcheTSKpeutbloquersapropreexcutionpourattendreuncertaintemps,ousimplement
librerleprocesseurparsoucisdquitenverslestchesdemmeprioritquelle.
Essayezdestimerlersultatdelapplicationsuivanteparmilespropositionsquivoussont
fatesTableau2?VrifierensuitevotrerponseenlanantlapplicationsurleDSP.

|2

CrerunprojetDSP/BIOSnommtest_task.pjtdontlefichiersourceestcidessous.Crer
troisnouvellestches.Chacunedestchesexcuteralafonctiontask().
ObjectName Taskfunction
task0
task1
task2

15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.

Taskfunctionargument0

_task

_task
1
_task
2
Tableau1:Listedestches

#include"test_taskcfg.h"
#include<std.h>
#include<log.h>
#include<tsk.h>

#defineNLOOPS5

voidtask(Argid_arg);/*FunctionfortaskscreatedwithConfigTool*/

/*========main========*/

Voidmain()
{
}

/*========task========*/

Voidtask(Argid_arg)
{
Intid=ArgToInt(id_arg);
Inti;

for(i=0;i<NLOOPS;i++){
LOG_printf(&trace,"Loop%d:Task%dWorking",i,id);
TSK_yield();
}
LOG_printf(&trace,"Task%dDONE",id);
}

RponseA
Loop0:Task0Working
Loop1:Task0Working
Loop2:Task0Working
Loop3:Task0Working
Loop4:Task0Working
Task0DONE
Loop0:Task1Working
Loop1:Task1Working
Loop2:Task1Working
Loop3:Task1Working

RponseB
Loop0:Task0Working
Loop0:Task1Working
Loop0:Task2Working
Loop1:Task0Working
Loop1:Task1Working
Loop1:Task2Working
Loop2:Task0Working
Loop2:Task1Working
Loop2:Task2Working
Loop3:Task0Working

RponseC
Loop0:Task0Working
Loop1:Task1Working
Loop2:Task2Working
Task0DONE
Task1DONE
Task2DONE

|3

Loop4:Task1Working
Task1DONE
Loop0:Task2Working
Loop1:Task2Working
Loop2:Task2Working
Loop3:Task2Working
Loop4:Task2Working
Task2DONE

Loop3:Task1Working
Loop3:Task2Working
Loop4:Task0Working
Loop4:Task1Working
Loop4:Task2Working
Task0DONE
Task1DONE
Task2DONE

Tableau2:Propositionsdursultatdel'application

RponseA:Latche0excutelafonctiontask()entirement,puislatche1excutela
fonctiontask()entirement,puislatche2excutelafonctiontask()entirement.

RponseB:Leprogrammeafficheles3messagesdes3tchespourlaboucle0,puisles3
messagespourlaboucle1,etc

RponseC:Leprogrammeafficheun messagepourlaboucle0 delatche0,puisdela


boucle1delatche1,puisdelaboucle2delatche2.
Visualiserlegraphiquedexcutiondestaches:DSP/BIOS>ExecutionGraph.Puisrelancer
lapplication.
AfindevisualiserlesdonnestransmisesparleDSPverslePC,lacibleDSPutiliseunautre
objetLOGenplusdeceluiquevousavezcrpourleLOG_printf()(trace).Ilsagitdu
LOG_system. Il est dj implment dans le fichier de configuration. Modifier les
propritsdecetteobjetlog:LOG>LOG_system>Property(buflen:512,logtype:fixed).

Question5:

AquoicorrespondlatcheKNL_swi?Quelestsonrle?(Help>Content)

..........................................................
Ouvrirlefichierdeconfigurationetincrmenterlaprioritdunedestches.Avantdelancer
lapplication,essayerdestimerlenouveaudiagrammedexcutiondestches.
Unetchequivientdtreprempteparuneautretchedeprioritplusimportanteest
positionneenttedelalistedattente.
Donnerlediagrammedexcutiondestchesdelaffirmationprcdente,ensupposantque
vousayezdonnunepriorithautelatche2,quelatche0estencoursdexcutionet
quelatche1estprteaumomentdelapremption.

|4

3 Horodatage des tches


Etudierlechapitre4.8deDSP/BIOSUserGuide.
Question6:
Aquoicorrespondlehighresolutiontime?Sachantquesavaleurestcodesur
32bits,donnerlavaleurabsoluedu tempsle pluslongquenouspouvonsmesurerenhigh
resolutiontime.
..........................................................
Question7:
Aquoicorrespondlelowresolutiontime?Sachantquesavaleurestcodesur
32 bits, donner la valeur absolue du temps le plus long que nous pouvons mesurer en low
resolutiontime.
..........................................................
Question8:
Comment faiton pour configurer le low resolution timedans le fichier de
configuration?
..........................................................

..........................................................
Question9:
QuellefonctionfautilutiliserdanslemoduleCLKpourrcuprerlesvaleurs
dulowethighresolutiontime?
..........................................................

..........................................................
Complter le projet prcdent avec NLOOPS=3, pour valuer les horaires o les tches
sexcutent.VousafficherezleshorairesdanslemessageLOG(laidedeLOG_printf())de
lafaonsuivante:

Lowresolutiontime:xxxxticks,Taskx

Highresolutiontime:xxxx

Note1:LafonctionLOG_printf()accepteaumaximumdeuxvariablesparamtrables(par
exempledeux%d).
Note2 : Pour faire laffichage de valeur sur 32 bits (long int), nous devons effectuer
laffichageendeuxtemps,dabordlepoidsfaible,puisensuitelepoidsfort.
Note3:Ilpeuttreutiledaugmenterlatailledubuffertrace.
Objettrace>Property>bufflen:512.

Pourcethorodatagedestches,vousdevriezavoirunlowresolutiontimede0.Eneffet,lexcution
delensembledesbouclespourtouteslestchesseraliseenmoinsde1tick.

|5

Modifier votre application laide dun TSK_sleep (exemple: TSK_sleep(1500); ) afin de


visualiserunhorodatagedestchessurunepluslonguepriode.
Pourlesplusavances(Optionnel):
Reprendrelapplicationprcdenteennecrantpluslestchesdefaonstatique(avecle
fichierdeconfiguration)maisenlescrantdynamiquementaveclesfonctionsappropries:
TSK_create(),etc
LireParagraphe2.2.4deladocumentationDSP/BIOSUserGuidedansunpremiertemps.

4 Echo Canceler
4.1 Prsentation
CetteapplicationestunexempledesystmetempsreldonndanslestutorialsdeDSP/BIOS,on
seproposeicidereprendrelaproblmatique.
Lesystmedannulationdchoestcomposdespartiessuivantes:

Undcodeur,quicompresselesdonnesreuesenPCM(PulseCodeModulation)

Unencodeurquiretransmetlesdonnesaprslannulationdcho.

Uneannulationdcho.

Danslafiguresuivante,nousretrouvonslesdiffrentsblocs.Lestempsetlenombredinstruction
sontdonnsapproximativement.

Nous nexpliquons pas ici pourquoi le cahier des charges impose une priode de 2,5 ms pour la
fonctiondannulationdchoet22,5mspourlesfonctionsdudcodeuretdelencodeur.
Afindesefocalisersurlordonnancementdestchessanslacomplexitdelencodeur,dudcodeur
etdelalgorithmedannulationdcho,nousallonstravailleravecdesfonctionspriodiquesquise
dclenchentgrceautimerduDSPtoutesles2,5msou22,5ms(suivantlafonction).
Deplus,lachargeprocesseurdestroistchesserasimuleparunebouclequiconsommedutemps
CPU.CettechargeseraconfigurableencoursdutilisationdevotreapplicationparCCS.

|6

DansDSP/BIOS,ilexiste4typesdethreadsprincipaux(HWI,SWI,TSKetIDL).Deplus,2autrestypes
defonctionsexistent.IlsagitdesfonctionsCLKetPRD.
Dessinerunechelledesprioritsenplaantles4typesdethreadquiexistent,puisrajouter
lesdeuxtypesdefonctionsCLKetPRDdaprsladocumentationproposcidessous.

IlestbienprcisericiquetouteslesfonctionsPRDontlammepriorit.Cetteprioritest
dfinieparlaprioritdePRD_SWI.

4.2 Le code de lapplication

Fichierecho.h:Dfinilesconstantesduprogramme

Fonctionmain:Nefaitrien

Fonctioncanceler:Cettefonctionrcuprelespointeurssurlaprochainetrameutilise.
CettefonctionlanceaussicancelerAlgquisimulelachargeprocesseurdelalgorithme
dannulationdcho.

FonctioncancelerAlg:Simulationdelachargeprocesseurpourlannulationdcho.

Fonctionencoder:Cettefonctionrcuprelespointeurssurlaprochainetrameutilise.
CettefonctionlanceaussiencoderAlgquisimulelachargeprocesseurdelalgorithme
dencodage.

FonctionencoderAlg:Simulationdelachargeprocesseurpourlencodage.

Fonctiondecoder:Cettefonctionrcuprelespointeurssurlaprochainetrameutilise.
CettefonctionlanceaussidecoderAlgquisimulelachargeprocesseurdelalgorithme
dencodage.

FonctiondecoderAlg:Simulationdelachargeprocesseurpourledcodage

CrerunprojetDSP/BIOSnommecho.pjt.Intgrerlensembledesfichierssourcesdans
votreprojet.

4.2.1 Misejourdelunitdetemps(ticks)
NousallonschangerlavaleurdelowresolutiontimeduDSP,afinquelunitdemesurenomm
ticksreprsenteuntempsde2500ms,aulieudes1000msseconde(pardefault):

|7

Fichierdeconfiguration>PropritsdeCLKClockManager>Microseconde/Interruption=2500.
NoterqueleregistrePRDdutimerintgrauDSP changeautomatiquement.Lanouvellevaleur
dpenddelavitessedecadencementduDSPrentredanslesparamtres(System>GlobalSettings)
quiesticide160Mhz.

4.2.2 CrationdesobjetsPRD
LesobjetsPRDservent excuterdestchesdefaonrguliredslorsquuneinterruptiondu
timersurvient.Nousallonsdoncutilisercetypedobjetpourlancerlestchesdelencodeur,du
dcodeuretdelannulationdcho.
Crer trois PRD Object avec les noms suivants et les proprits suivantes. Complter le
champresultingperiod(ms)dutableausuivant:
ObjectName

period(ticks)

function

Resultingperiod(ms)

cancelerPrd

_canceler

encoderPrd
decoderPrd

9
9

_encoder
_decoder

ModifierlespropritsduLOG_system(buflen:512,logtype:circular).

4.2.3 Visualisationdelexcutiondestches
Lancerlapplicationetvisualiser:

Lediagrammedordonnancementdestches:

DSP/BIOS>Executiongraph

LachargeduCPU:

DSP/BIOS>LoadGraph

Lesstatistiquessurlesobjetscrs:

DSP/BIOS>Statistiqueview

LafentredesortiedesMessageLog:

DSP/BIOS>MessageLog

VisualiserlavariabledecoderLoad

Clicdroit>Addtowatchwindow

4.2.4 Etudedugraphedexcution:
Question10: CombiendefoisestexcutCancelerPrdpendantuneexcutiondeencoderPrdet
decoderPrd?
..........................................................
Question11:

QuelleestlachargeCPU?

..........................................................
Question12: Lesystmefonctionnetilentempsrelenrapportaucahierdeschargesquenous
noussommesfix?
..........................................................

|8

4.2.5 Etudedesstatistiques:
Lecountfieldcorrespondaunombredefoisoulesobjetssontexcuts.Leschampstotal,Max
etAveragerestentzro.Eneffet,lunitestletickpourlesPRDObject(contrairementauSWI
Objectdontlunitestlecycleinstruction).Sachantquelesfonctionssexcutentenmoinsde1tick,
ellesrestentdonczro.Anoterquenousnavonspasencoreaugmentlachargedesfonctions.
(variabledecoderLoad,encoderLoadetcancelerLoad)

4.2.6 Augmentationdelachargedestches
Dans la watch window, mettre la valeur de decoderLoad 1000. Cela provoque une
excution de 1000 x decoderLoad instruction dans la tche du dcodeur, soit 1000000
cyclesinstructions.
Question13: QuelestlachargeCPU?Lesystmefonctionnetilencoreentempsrel?Expliquer
commentilpeuttrepossibledeperdrelaspecttempsrelduneapplicationetdenepasutiliser
touteslesressourcesduprocesseur.
..........................................................
Question14: QuelleestlavaleurmaximalededecoderLoadquevouspouvezmettreafinquevotre
processeurfonctionneentempsrel?
..........................................................
Question15: Quelleestlavaleurmaximalededecoderloadquevouspouvezmettreafinquevotre
processeur fonctionne 100% de ces capacits CPU? Que se passetil pour laffichage des
messageLoglorsquevotreprocesseuraatteintles100%?Endduirelaprioritdelatche
grantletransfertdesdonnesdelacibleDSPverslePC.
..........................................................

..........................................................
Question16:

Quandsontgreslestchesquiontmanquesleursdeadline?

..........................................................
Question17:

Quefaudraitilchangerafindesolutionnerceproblme.

..........................................................

4.2.7 1recorrectiondelordonnancement
Nous allons maintenant utiliser une tche de type SWI pour lannulation dcho. En effet, dans
lexempleprcdent,lestroistchessexcutentaveclammepriorit.Decefaitlorsquunetche
possde la ressource processeur, elle empche les autres de lobtenir, ce qui provoque le
manquementdunedeadline.
NousallonsdonctoujoursutiliserdestchesPRDpourencoderetdecoder.Enrevanche,pourle
canceler(quiestlatchelapluscritiqueentermedetemps),nousallonsutiliseraussiunetche
PRDmaisquiferalappelunobjetSWI[SWI_post()].

|9

ModifierlespropritsdecancelerPRD:

Function=_SWI_post

arg0=cancelerSwi

CrerunobjetSWI

Name=cancelerSwi

Function=_canceler

Priority=1

Question18:

AquoisertlafonctionPRD_swi?(Help>Content)

..........................................................
Analysedelexcution:
LemodulePRDpilotelesfonctionspriodiquesdelafaonsuivante:
ThePRD_swiSWIispostedonceforaPRDtick.
PRD_swiloopsthroughPRDobjects.
IfitistimeforaPRDobjecttorun:RunthatPRDobjectsfunction.
PRD_swicontinuesloopofallPRDobjects.

Renseignerlesdiffrentsscnariossuivants,vousdeveztrecapabledtablirlacohrence
delexcutionquiseproduit.OnrappellequelaprioritdelafonctionPRD_SWImodifiela
prioritde touteslesfonctionsPRD.decoderLoadseraremiszrodans unpremier
temps.

Scnario

Fonctions

Priorit

PRD_swi

Canceler_Swi

PRD_swi

Droulementdelapplication

Canceler_Swi

PRD_swi

|10

Canceler_Swi

RemettrelachargedudecoderLoad1000.
Question19:

QuelestlachargeCPU?Lesystmefonctionnetilencoreentempsrel?

..........................................................

Avantdelirelesexplicationssuivantes,analyserlecomportementdelapplicationetnoterlendroit
oletempsrelnestpasrespect.
LeproblmeestquetouteslestchesPRDsexcutentaveclemmeniveaudepriorit.Lorsque
lobjetPRDdelannulationdchosouhaitepostersoninterruptionSWI,lafonctiondcodeurest
entraindetourneretnelaissepaslamaincancelerPrd.Eneffet,mmesilafonctioncancelerSwi
possdeunepriorittrslev,ellenepourrapassexcuterpuisquelobjetPRDcancelerPrdnaura
paspuposterlinterruptionsoftware[SWI_post(cancelerSwi)].
NousdevonsdonctrouverunmoyendtablirdesprioritsentrelesdiffrentesfonctionsPRD.
Conclusion: Les actions ralises au sein dune fonction PRD doivent obligatoirement
mettre moins de 1 tick pour sexcuter (puisque dans notre cas la frquence de
cancelerPrdestde1tick).Danslecascontraire,ilfautpasserpardesSWIafindespcifier
desprioritsentreslestchesetainsipermettrecequellepuissesinterrompreentres
elles.

4.2.8 2mecorrectiondelordonnancement
RajouterlesdeuxobjetsSWIsuivant:
ObjectName

function

encoderSwi

_encoder

decoderSwi

_decoder

ModifierlesobjetsPRDencoderPrdetdecoderPrddelafaonsuivante(mmeprocdure
queprcdemmentpourlecasdecancelerPrd).
ObjectName

period(ticks)

function

arg0

encoderPrd

_SWI_post encoderSwi

decoderPrd

_SWI_post decoderSwi

ModifierlesprioritsdesobjetsSWIdelafaonsuivante.

|11


Lorsque vous utilisez un nouveau niveau de priorit, vous pouvez avoir un message
derreursuivant:"Systemstacksize(seeMEM)istoosmalltosupportanewSWIpriority
level.".Eneffet,unniveaudeprioritsupplmentaireamnelesystmesauvegarder
uncontextedenvironnementsupplmentairelorsdunchangementdetche.Ilfautdonc
quevousaugmentiezlavaleurdelastacksystmedevotreapplication:
System>MEM(MemorySectionManager)>clicdroit(Property)>StackSize:0x400

Question20:

AnalyserlesystmeavecdecoderLoad=0,puisavecdecoderLaod=1000.

..........................................................
Question21: AugmenterlachargedudecoderLoadjusqu'arriverperdrelaspecttempsrelde
lapplication.Quelleestlachargeduprocesseurpourlaquellelapplicationnestplustempsrel.
Conclure
..........................................................

|12

TP5
LogicielTempsrel
DSPTMS320C5416

Objectif:Raliserunequeuedemessage.Comprendreetutiliserdessmaphorespoursynchroniser
destchessurlaccsuneressourcepartage(queuedansnotrecas).

1 Ralisation dune queue de message


1.1 Prsentation
LesqueuesdemessagessontdeslistesdoublementchanesdetypeFIFO(FirstInFirstOut).Leur
taillenestpaslimite.Leslmentsquilacomposentsontdesstructuresdontleformatesten
partieimpos:
typedefstructMsgObj{
QUE_Elemelem;

...

}MsgObj;

//Partieimpose
//Champschoisisparlutilisateur

LepremierlmentnestpasmodifiableetestdetypeQUE_Elemdontleformatestlesuivant:
typedefstructQUE_Elem{
structQUE_Elem*next;
structQUE_Elem*prev;
}QUE_Elem

Ilsagitdespointeurssurllmentsuivantetdupointeursurllmentprcdent.Celapermetde
raliserunelistedoublementchane.
Question1:

RappelerlefonctionnementdunemmoiredetypeFIFOenlaschmatisant.

1.2 Application
Nous nous proposons de raliser une application dcriture et de lecture dans une queue de
message. Le seul but est de vrifier le fonctionnement et lutilisation de lobjet Queue. Nous
souhaitonsdoncobtenirlersultatsuivantsurleMessageLog.

|1


Figure1:Objectifdel'applicationdetestd'unequeuedemessage

1.3 Ralisation
1.
2.
3.
4.

Crerunprojetqueue.pjt.
Insrerunenouvelletachequiexcuteraunefonction:voidreader_writer(void)
InsrerunobjetQUEdanslefichierdeconfiguration.
Dfinissezvotrestructuredemessagequinecontiendraquuncaractre:
typedefstructMsgObj{
QUE_Elemelem;
//champimpos
charval;

//champcaractrepourl
}MsgObj;
5.
ViderlaqueuedemessagelaidelafonctionQUE_new(.)(facultatif)
6.
Utiliser la fonction MEM_alloc(0,sizeof(MsgObj),0), pour allouer de la mmoire une
nouvellestructureMsgObjquinousallonsinsrerdanslaqueue.
7.
MettrecemessagedanslaqueueaveclafonctionQUE_put(,)
8.
Afficherlavaleurducaractreenvoydanslaqueue:LOG_printf()
9.
RcuprerlemessagedelaqueueaveclafonctionQUE_get()
10. Affichezlavaleurducaractrercuprer:LOG_printf()
11. Librerlammoireallouepourlastructuredemessage:
MEM_free(0,,sizeof(MsgObj))
Vouspouvezalorsraliservotreapplicationenstockant4messageslasuite(a,b,c,d),puisenlisant
lesmessages(a,b,c,d).

1.4 Etude de la liste doublement chane


Partieoptionnelleraliserpourlestudiantslesplusavancsseulement.Pourlesautres,vous
pouvezpasserdirectementauchapitreSynchronisationparSmaphore
Mettredespointsdarrtdansvotreprogrammeafindevisualiserladressedesstructures
de message lors de lallocation dynamique dune part (aprs MEM_alloc) puis lors de la
rcuprationdesmessagesdelaqueue(aprsQUE_get()).
Noterlesadressesdansletableausuivant,puisvaliderlefonctionnement:
Numro message
1
2
3
4

@ structure message crit

@ structure message lu

Question2:
Quelle est le nom gnrique de la zone mmoire ou lallocation dynamique est
ralise?
..........................................................

|2

Visualiser les segments mmoire que vous avez votre disposition dans le fichier de
configuration:System>MEM
Question3:
Enlesparcourantunparun,nommlesegmentolazonedallocationdynamique
estralise.Quelleestlataillerservepourlallocationdynamique?
..........................................................
Question4:
Daprsladressedelapremirestructuredemessagequiatrservenmmoire,
pouvezvousestimerladressededbutdelazonedallocationdynamique.Donnerladressede
finsachantquelutilisationdelallocationdynamiquesefaitendcrmentantlesadresses.Est
cecohrent?
..........................................................

..........................................................
Question5:

Raliserunschmareprsentanttouteslesdonnesquevousavezrelev:

Nomdusegmentosetrouveleheap,@dedbut,@defin

Tailleduheap,@dedbut,@defin

|3

Visualiserlammoireladressedudbutdevotreheap.Relancervotreprogramme,et
remplir dynamiquement sur votre feuille (avec un crayon de papier!!!) les zones
mmoire lors de chaque allocation dynamique des 3 premiers messages. Vrifier le
fonctionnementdeslistesdoublementchanes.
@ mmoire

Contenu HEX de la mmoire

@ de la 1re structure de message

Champs

*next

*next
*prev
char

Nousallonsmodifierlatailledutas0x0CMADU(MemoryAdressableDataunit):
System>MEM>IDATA>clicdroitProperty>HeapSize:0x0C
RelancervotreapplicationetouvrirloutildevisualisationdesObjetsprsentsenmmoire:
DSP/BIOS>Kernel/ObjectView
NousallonsnousintresserlapartieMEM
Noterlesvaleursetvaluerlacohrencede:

StartAddress:...

EndAddress:

Totalsize:.

FreeMem:
Lancervotreprogrammeaveclespointsdarrtsetvisualiserlaplacerestanteaufuret
mesuredesallocationsralises.

Question6:

Quesepassetillorsquelesystmedpasselespacemmoiredisponible.

..........................................................

2 Synchronisation par smaphore


2.1 Prsentation des smaphores :
Unsmaphoreestunestructurededonnespossdantuncompteurspcifiantlenombredetches
concurrentes pouvant utiliser la ressource. Lorsque la ressource nest pas disponible, une file
dattentesecre.DSP/BIOSintgredesobjetsspcifiquesdetypeSEMquipermettentdegrerce
typedesmaphorecompteur.Pourposterunsmaphore(vendre,oprationV),onimplmente

|4

la fonction SEM_post ( ). Cette action incrmente le compteur du smaphore. Pour prendre un


smaphore,onimplmentelafonctionSEM_pend().Silecompteurestsuprieurzro,latche
dcrmente simplement le compteur. Si le compteur est gale zro, la tche attends quun
SEM_post( ) soit ralis sur le smaphore (par une autre tche). Pendant ce temps dattente, la
ressourceprocesseurestutilisepourdautrestches.
LeparamtretimeoutdeSEM_pend()permetunetchedattendreuntempsmaximumspcifier
partimeout,dattendreindfiniment(SYS_FOREVER)oudenepasattendredutout(0).
Lorsqueplusieurstchesattendentsurunsmaphore,lapremiretchearrivesurlesmaphore
accdelaressourcelorsquelleselibre.Cettetchenestpasncessairementlatchedeplus
fortepriorit.
Question7:
Retrouverdanslediagrammedtatdestchesdansqueltatsetrouveunetche
lorsquequelleattendsurunsmaphore?
..........................................................

2.2 Prsentation de lapplication


Nous nous proposons de raliser une application lecteur/crivains. Des crivains inscrivent des
donnes dans une queue de message, alors quun lecteur les lit. Contrairement lapplication
prcdente,lestchesdescrivainsetcelledulecteursonttoutesenconcurrenceslesunespar
rapportauxautres.Ainsi,ilestindispensabledelessynchroniser.Eneffet,lapplicationnedoitpas
accepterquunlecteurliseunequeuevide.
Dune manire gnrale, le compteur du smaphore est initialis avec le nombre de ressources
disponibles. Dans notre cas, il est initialis zro puisque quil faudra quun crivain inscrive un
messagedanslaQUEUEavantquelelecteurpuisselercuprer.Ilfautdoncbloquerlelecteursur
lesmaphore.

2.3 Ralisation
Enreprenantleprojetprcdent,modifiervotrefichierdeconfigurationencrant5tches
aveclescaractristiquessuivantes:
ObjectName

Priority

Taskfunction Taskfunctionargument0

initTsk

15

_initTask

reader0

_reader

writer0

_writer

writer1

_writer

writer2

_writer

ChangerlespropritsduLOG_system:
Instrumentation>LOG>LOG_system:buflen:512,buftype:fixed
Remplacerlefichier.cdevotreprojetparceluiquivousestfourni:semaphore.c
Nousallonsutiliserunsmaphorepoursynchroniserlestchesdcritureetlatchedelecturedans
laqueuedemessage.
Crerunsmaphore:Synchronization>SEM

|5

Question8:

Quellesfonctionsallezvousutiliserpourgrerlesmaphore?

..........................................................

..........................................................
Question9:
Afin de lancer votre programme, estimer ce quil va tre crit dans le message
Log.Vrifierenexcutantvotreprogramme.Vrifieraussienutilisantlegraphedexcution
(DSP/BIOS>ExcutionGraph)
Lordre dapparition des tches writer dpendent exclusivement de lordre dans
lesquellesvouslesavezcresdanslefichierdeconfiguration.

Pourlesplusavances:
PositionnerunTSK_yield()danslatchecrivainjusteaprsavoirpostlesmaphore.
Question10:

Commentvotreprogrammevatilragir,vrifierenlexcutantsurlacible?

..........................................................
Modifierlesprioritsdestchesettester.

|6