pràctica 1. introducció a l’entorn code compose studio ccspds/practica_1_dsp.pdf · combolist...

14
Pràctica 1. Introducció a l’entorn Code Compose Studio CCS Objectiu. L’objectiu d’aquesta pràctica és iniciarse l’eina Code Compose Studio (CCS), la qual ens permetrà editar els programes que vulguem executar sobre la placa TMS320C5515 eZdsp USB Stick, així com compilarlos i muntarlos. A continució, l’eina permet descarregar sobre la placa l’executable i controlarne l’execució. La placa no es pot desendollar del connetor USB ja que en realitat és un stick USB i l’alimentació li arriba pel connector. A més de l’entorn CCS, l’alumne aprendrà l’accés als registres del DSP i en aquest cas s’accedirà al control d’un conjunt de LEDs que incopora la placa de desenvolupament. Eina Code Composer Studio Configurar el workspace A l’iniciar el software CCS, a través d’una finestra s’ens preguntà quin directori de treball (workspace) voleu emprar. CCS utilitzarà aquest directori com a localització per defecte pels projectes creats, desant a dins tots el arxius, objectes, llibreries i executable creats. Tot i això, no és necessari que totes les llibreries i capçaleres incloses estiguin en aquest directori, ja que es poden configurar camins (paths) addicionals tant per al compilador com el muntador (linker). És important que conegueu la localització del workspace, ja que haureu d’assegurar còpies del vostre treball. És possible configurar com a workspace un directori a una clau de memòria USB. En qualsevol cas, si quan arrenca el CCS no surt la finestra de diàleg per configurar el workspace vol dir que algú ha configurat un directori com a workspace per defecte. Heu d’anar

Upload: truonganh

Post on 24-Mar-2018

218 views

Category:

Documents


2 download

TRANSCRIPT

 

Pràctica1.Introduccióal’entornCodeComposeStudioCCS

Objectiu.L’objectiu  d’aquesta  pràctica  és  iniciar‐se  l’eina  Code  Compose  Studio  (CCS),  la  qual  ens 

permetrà editar els programes que vulguem executar sobre la placa TMS320C5515 eZdsp USB 

Stick, així com compilar‐los i muntar‐los. A continució, l’eina permet descarregar sobre la placa 

l’executable  i controlar‐ne  l’execució. La placa no es pot desendollar del connetor USB ja que 

en realitat és un stick USB i l’alimentació li arriba pel connector. 

A  més  de  l’entorn  CCS,  l’alumne  aprendrà  l’accés  als  registres  del  DSP  i  en  aquest  cas 

s’accedirà al control d’un conjunt de LEDs que incopora la placa de desenvolupament. 

EinaCodeComposerStudio

ConfigurarelworkspaceA  l’iniciar  el  software  CCS,  a  través  d’una  finestra  s’ens  preguntà  quin  directori  de  treball 

(workspace) voleu emprar. CCS utilitzarà aquest directori com a  localització per defecte pels 

projectes creats, desant a dins tots el arxius, objectes, llibreries i executable creats. Tot i això, 

no és necessari que totes les llibreries i capçaleres incloses estiguin en aquest directori, ja que 

es  poden  configurar  camins  (paths)  addicionals  tant  per  al  compilador  com  el  muntador 

(linker). És  important que conegueu  la  localització del workspace,  ja que haureu d’assegurar 

còpies del vostre treball.  

 

És possible configurar com a workspace un directori a 

una  clau de memòria USB. En qualsevol  cas,  si quan 

arrenca  el  CCS  no  surt  la  finestra  de  diàleg  per 

configurar el workspace vol dir que algú ha configurat 

un directori com a workspace per defecte. Heu d’anar 

 

a File‐>Switch Workspace, i podreu modificar el directori de workspace.  

Recordeu de fer sempre còpies del vostre treball, especialment si treballeu al disc local, ja que 

qualsevol alumne d’altre curs o membre del personal de laboratori pot recarregar la imatge del 

disc dur, eliminant tot el contingut del disc local. 

 

Creaciód’unprojectedeCCSperalaplacaTMS320C5515eZdspUSBStick

CreaciódelprojectePer  crear  un  projecte  nou  a  partir  d’un  projecte  parcial  o  arxius  ja  existents,  teniu  dues 

opcions: copiar el directori que contingui el projecte/fitxers ja existents al workspace, i crear el 

projecte; o crear un projecte buit i afegir els fitxers disponibles. 

En ambdós casos s’ha de anar a File‐>New‐>CCS Project (en cas que l’opció de CCS Project no 

surti inicialment, cal buscar‐la a File‐>New‐>Other... ): 

 

Si  els  fitxers  del  projecte  ja  són  en  un  directori  dins  del  workspace,  podeu  anomenar  el 

projecte amb el nom del directori  i el CCS  trobarà  i detectarà el contingut automàticament. 

Sinó, podeu especificar un nom diferent,  i després  indicar‐li el path del directori, desactivant 

l’opció de “Use default Location”: 

 

 

Si el nom del projecte no coincideix amb cap directori al workspace, i es manté activada l’opció 

de “Use Default Location”, el CCS crearà un directori nou  (on es podran afegir el  fitxers més 

tard). 

 

Després de crear/indexar el directori del projecte, trieu com a “Project Type” l’opció C5500, ja 

que  el micro DSP  TMS320C5515  pertany  a  la  família  C5500  de  Texas  Instruments.  La  resta 

d’opcions es poden deixar amb els valors per defecte. 

 

 

Després el CCS dóna l’opció de definir interdependències entre projectes per reaprofitar codi. 

En principi ,en el contexte dels laboratoris els diferents projectes es plantejaran com a treball 

stand‐alone, així que no s’haurà de definir cap dependència. 

Finalment  cal  definir  quin  tipus  de  sortida  ha  de  produir  el  projecte,  un  executable  o  una 

llibreria,  i  que  la  variant  de  dispositiu  dins  la  família  C5500  és  el  DSP  TMS320C5515.  El 

combolist select filter és irrellevant, només serveix per afitar la llista d’opcions de dispositiu. La 

llibreria  de  suport  en  temps  d’execució  (Runtime  Support  Library)  que  farem  servir 

generalment  és  la  “rts55h.lib”,  que  dóna  suport  al model  de memòria  “huge”.  Si  en  algun 

projecte  es  requerís  treballar  amb  el model  de memòria  “large”  caldria  emprar  la  llibreria 

“rts55x.lib”, o potser una altra que ja s’indicaria. 

 

 

L’opció de “Linker Command File” s’ha de deixar sense especificar, prenent CCS per defecte el 

que trobi més adient. Si apareguessin problemes, es pot reconfigurar més endavant. Si es vol 

canviar el fitxer assignat però la combolist no té opcions, es pot navegar (“Browse”). Dins de la 

carpeta base del CCS  (normalment a C:\Program Files\Texas  Instruments\ccv4)  cal buscar el 

subdirectori \tools\compiler\c5500\lib. 

Si  s’ha  creat  un  projecte  buit,  aleshores  copia  tots  els  fitxers  dels  projectes  a  la  carpeta 

(sobreescrivint  els  conflictes).  En  la  vista del projecte del CCS  (View‐>C/C++ Projects)  tria  el 

projecte,  i fent click dret, tria  l’opció de “Rebuild  Index”. D’aquesta manera  la  informació del 

projecte s’actualitzarà amb tots el arxius nous. 

 

 

ConfiguraciódelprojecteAmb el projecte ja creat i tots el fitxers indexats, feu click dret al projecte a la vista de projectes 

i  trieu  “Properties”.  Per  defecte  hauria  d’aparèixer  com  seleccionada  la  configuració  de 

depuració  “Debug”,  que  serà  la  que  farem  servir  generalment.  Totes  les modificacions  de 

configuració  fetes s’haurien d’afegir  també a  la configuració de “Release” si es vol  fer servir, 

però  treballarem  preferentment  en  configuració  “Debug”  per  poder  inspeccionar  el 

funcionament del DSP en temps d’execució. 

Trieu  C/C++  Build,  a  la  pestanya  “Tools  Settings”  obriu  el  “C5500  Compiler”.  En  l’apartat 

“Runtime Model Setting” escolliu  com a  “Specifiy    type  size  to hold  results of pointer math” 

l’opció  “32”,  i  a  “Specify  Memory  Model”  l’opció  “Huge”.  La  resta  d’opcions  haurien  de 

funcionar amb el valors per defecte  implícits sense problemes, però si hagués cap problema 

desconnecteu  (triant  “Off”)  les  opcions  de  “Allow  reassociation  of  sat  memory”  i  “Allow 

reassociation  of  FP  memory”,  i  escolliu  com  a  “Select  assembly  source  Language”  l’opció 

“mnemonic”. 

 

 

Si  treballeu  amb  un  projecte  ja  complet  amb  el  codi  correcte,  ja  podeu  compilar  i  enllaçar 

(muntar) el projecte (Project‐>Build Active Project), però no podreu provar‐lo dins de  la placa 

C5515 eZDPS USB si no teniu una configuració d’objectiu. 

 

Creaciód’unaConfiguracióObjectiu(TargetConfiguration)Per  a  poder  treballar  executant  el  codi  al  DSP,  cal  definir  una  configuració  objectiu  per  a 

connectar  el  software  CCS  amb  la  placa  USB  eZDSP  C5515.  Al menú  “Target”  triem  “New 

Target Configuration”: 

 

Aquesta  configuració  tindrà  un  nom  donat  per  l’usuari,  i  es  pot  desar  a  una  carpeta 

compartida, o al workspace propi (recomanat). 

 

 

Un cop creada cal escollir el tipus de connexió,  farem servir el “Texas  Instruments XDS100v2 

USB  Emulator”,  i  el  dispositiu,  marcant  el  tic  de  “USBSTK5515“.  XDS100  és  una  intefície 

propietària JTAG per USB de Texas Instruments, emprada per a emulació i depuració. El mòdul 

JTAG  permet  als  sistemes  integrats moderns  gaudir  d’una  porta  d’entrada  per  darrera  als 

dispositius  com  el DSP,  en  temps  real  sense  alterar  l’execució. A més,  es pot  fer  servir per 

carregar el codi i memòria al stick. Així doncs, cal notar que encara que aparentment quan es 

fa  servir  aquesta  configuració  es  treballa  amb  el  PC,  el  codi  s’està  executant  realment  al 

dispositiu DSP, i el PC només serveix per donar‐nos accés a la línia de comandes i depuració del 

procés.  

 

En acabar només caldrà desar‐la,  i si no s’assigna automàticament  la configuració al projecte, 

definir‐la com a configuració objectiu per defecte o fer link amb el projecte. 

 

 

 

ExecutarunprojecteambunaconfiguraciódonadaUn cop tenim enllestit el projecte i la configuració objectiu, caldrà compilar i enllaçar el 

projecte, a Project‐> Re/Build Active Project, i tenint la placa correctament connectada i 

detectada per l’equip, fer Target ‐> Debug Active Project. 

 

 

 

Una consola indicarà que s’ha carregat el projecte correctament, o comunicarà els possibles 

errors. Per executar el codi al DSP i controlar l’execució només caldrà fer servir els controls, 

“Run”, “Terminate” i “Halt”. 

 

   

 

Annex1:ProblemesHabitualsSi  durant  la  compilació  apareixen  errors  respecte  símbols  sense  resolució  (“unresolved 

symbol”), probablement hi hagi problemes amb els “includes”, els fitxers de capçaleres, o els 

paths si no teniu tots els fitxers i llibreries a la carpeta del projecte. 

Si hi ha un error durant l’enllaçat de l’executable (“linking”),   és possible que s’hagi d’afegir a 

la configuració del C5500 Linker (a “Properties” del projecte) alguns paths que manquin. 

Pot aparèixer un warning avisant de que una o més  seccions del  codi  cauen  a memòria no 

habilitada  per  escritura  (“non‐writable  memory”).  Si  l’executable  no  funciona,  aneu  a  les 

“Properties”  del projecte,  i  a  les opcions del  enllaçador  (C5500  Linker)  aneu  a  la pàgina de 

Runtime Environment, i canvieu el “Initialization Model” a RAM enlloc de ROM. El missatge de 

warning pot persistir, però no afectarà l’execució del codi. 

Si  apareixen  problemes  sobre  la  llibreria de  suport  (Runtime  Support  Library)  reviseu quina 

llibreria hi ha configurada, quin model de memòria, i verifiqueu que a C5500 Compiler‐> Basic 

Options,  l’opció device té valor 5515 (encara que molts del projectes també puguin funcionar 

amb el valor 5505). Generalment aquests errors parlaran sobre  incompatibilitats del model 3 

i/o el model 2. 

Si l’enllaçador esmenta errors sobre haver excedit l’espai màxim per a variables locals, moveu 

la declaració de vectors fora de la funció per fer‐les de tipus global. El compilador les col∙locarà 

en una secció diferent de memòria amb menys restriccions d’espai (però les haureu de tractar 

com a variables globals). 

És  possible  que  durant  l’execució  el  sistema  es  torni  inestable,  o  “peti”  sense  raó  aparent. 

Reinicieu el CCS i connecteu novament la placa al PC. 

Si no podeu depurar el projecte (“Debug Active Project”) reviseu la configuració objectiu, que 

sigui  per  a  la  connexió  XDS100v2  i  el  dispositu USBSTK5515,  així  com  que  sigui  activa  per 

defecte o estigui vinculada al projecte. 

   

 

Pràctica1.SegonaPart.

IntroduccióalaplacaTMS320C5515eZDSPUSBStick

RequisitsEls  laboratoris  pràctics  del  curs  es  basen  en  la  placa  TMS320CC5515  eZDSP  USB  Stick. 

L’utilització d’aquest dispositiu requerirà d’uns coneixements mitjans de C ANSI. 

Entradaisortidamapejadaamemòria(MMIO)Un DSP, com qualsevol altre processador, necessita carregar als diferents registres  les dades 

necessàries per a fer les seves operacions. Ja siguin enters, instruccions, arrays, etc... totes les 

dades  d’un  programa  es  troben mapejades  a memòria.  La memòria  es  pot  considerar  una 

mena  de  gran  array  on  s’hi  troben  totes  les  dades.  Així  quan  es  declara  una  variable  de 

qualsevol tipus, es reserva espai de memòria, esdevenint els punters l’index per accedir‐hi. 

A  la memòria mapejada  es  poden  trobar  dades  que  no  es  troben  físicament  a  la memòria 

pròpiament dita,  sinó  a diferents elements d’entrada  i  sortida. Així doncs, per  accedir  a  les 

dades relacionades amb el dispositiu, només cal accedir a la direcció de memòria escaient. Per 

exemple, l’imatge mostrada a una pantalla d’escala de grisos podria ser mapejada a memòria 

com un array de bytes, on cada byte indiqués el valor de lluminositat d’un píxel donat. De fet, 

la  majoria  de  dispositius  de  I/O  es  comuniquen  amb  els  processadors  mitjançant  MMIO 

(Memory Mapped In/Out). 

MMIOalC5515Moltes  màquines  tenen  un  mapa  de  memòria  general  que  ja  conté  l’entrada  i  sortida 

mapejades, però en el cas del DSP C5515 hi ha un espai de memòria especial dedicat a l’ús de 

dispositius  d’entrada  i  sortida.  L’accés  a  aquest  espai  s’indica  amb  la  paraula  clau  ioport, 

indicant al DSP que  l’adreça pertany a  l’espai d’adreces de  I/O enlloc de  l’espai d’adreces de 

dades.  Per  accedir  a  la MMIO  també  és  necessari  emprar  la  paraula  clau  volatile. Aquesta 

paraula clau s’utilitza per  indicar que el contingut de  la variable o adreça a memòria pot ser 

accedit per diferents elements en qualsevol moment,  i per  tant no es pot deixar  l’escriptura 

per més endavant ni fer servir lectures de “cache”. Així doncs, quan marquem amb volatile, les 

variables o punters sempre són carregades des de  i escrites a memòria en cada accés, sense 

fer servir la “cache”. Per exemple: 

volatile int * PosicioDeMemoria = (int *) 0x0007;   

// Incorrecte, adreça d’espai de memòria de dades 

ioport int * PosicioDeMemoria = (int *) 0X0007; 

// Incorrecte, no es força lectura i escriptura real a cada accés  

volatile ioport int * PosicioDeMemoria = (ioport int *) 0x0007;  

 

 

 

MMIOiLEDSaeZDSPC5515El primer  treball que es  farà al  laboratori consistirà a controlar els LEDs de  la placa. Per tant 

serà necessari escriure una funció que permeti accedir a la memòria que els controla, i usar‐la 

dins un programa. Per començar més còmodament us proveïm dels  fitxers de configuració  i 

llibreries i capçaleres necessàries, així com d’un codi main.c per fer‐lo servir de plantilla. 

El  codi  del main.c  conté  dues  funcions  que  haureu  de  completar.  Elsmeus_LEDs_init() 

configura al processador els punters per a poder accedir als pins d’I/O que connecten amb els 

diferents  LEDS.  La  funció  commuta_LED(index)  haurà  de  canviar  l’estat  del  LEDs 

corresponents,  identificats  amb  enters  de  0  a  3.  Per  completar  les  funcions  només  caldrà 

omplir el espais buits, no necessiteu modificar ni afegir cap més codi.  

En primer  lloc necessiteu  saber  com es  connecten el  LEDS al processador. Aquest  LEDS  són 

accessibles mitjançant la GPIO (General Purpose I/O), i en el document USBSTK5515 Technical 

Reference Revision A podeu veure el mapejat de pins per als LEDS. 

Contesteu les següents preguntes. 

P1. Quins pins GPIO estan  connectats a  cada  LED?(vermell, blau, groc  i verd). Consulteu els 

esquemàtics ja que hi poden haver errates a les taules del manual. 

Un cop  trobats quins són el pins connectats als LEDs haureu d’esbrinar com accedir als pins 

corresponents de GPIO. Aquesta  informació es troba en el document TMS320C5515 General‐

Purpose Input/Output User’s Guide. Mentre que  les seccions 2.4, 3.1  i 3.3 contenen el mínim 

necessari,  seria  interessant  la  lectura  dels  capítols  2  i  3  sencers  per  comprendre millor  el 

funcionament de  la GPIO. Heu de  tenir en compte que el LEDs són “active  low”, per  tant es 

connectaran quan el seu GPIO sigui “0”. 

P2. Com s’anomenen i on estan situats el registres necessaris per configurar els pins de la GPIO 

associats als LEDs com a sortides? 

P3. Quin és el nombre del bit necessari de cada registre per posar el pin de GPIO de cada LED 

com a sortida? 

P4. Suposant que  la GPIO  ja està configurada com a  sortida,  indica el nom del  registres,  les 

adreces i quins bits són necessaris escriure i amb quin valor per connectar els LEDs? 

 

Ara que ja sabeu quins valors es necessiten i en quines adreces, cal veure com treballar a nivell 

de bits. 

P5. Assumint el tipus de dada unsigned de 16 bits en llenguatge C per aquest compilador, amb 

el bit 15 com a més significatiu i el bit 0 com el de menys pes, contesteu: 

a. Quin  valor  es  representa  amb  el bit  4  a  “1”  i  la  resta  a  “0”? Contesteu  el  valor  en 

decimal i hexadecimal. 

b. Quin valor té el nombre (1<<4)? Contesteu en decimal i hexadecimal. 

c. Si x = 0x2222, quin és el valor hexadecimal de l’expressió x|=(1<<4) ? 

 

d. Escriu en C un codi que activi el bit 7 i 8 de la variable x. 

e. Escriu en C un codi que anul∙li el bit 1 de la variable x emprant l’operador “&=”. 

f. Escriu en C un codi que canvi el bit 13 de la variable x fent servir l’operador “^”. 

P6. Completeu el codi següent omplint els espais indicats de l’“a” fins l’“l”: 

 

    

#include <usbstk5515.h> #include <stdio.h> 

 

//Adreces del MMIO per al GPIO dels registres de sortida: 1,2 #define LED_OUT1 *((ioport volatile Uint16*)  espai a   ) #define LED_OUT2 *((ioport volatile Uint16*)  espai b   ) 

 

//Adreces del MMIO per al GPIO dels registres de direcció: 1,2  

#define LED_DIR1 *((ioport volatile Uint16*)  espai c   ) #define LED_DIR2 *((ioport volatile Uint16*)  espai d   ) 

 

//Commuta el LED indicat per l’index entre 0 i 3 

void commuta_LED(int index) { 

 

if(index == 3)  //Blau LED_OUT1 = LED_OUT1 ^ (1<<(  espai e  )); 

else if(index == 2)  //Groc LED_OUT1 = LED_OUT1 ^ (1<<(  espai f  )); 

else if(index == 1)  //Vermell LED_OUT2 = LED_OUT2 ^ (1<<(  espai g  )); 

else if(index == 0)  //Verd LED_OUT2 = LED_OUT2 ^ (1<<(  espai h  )); 

}  

//Prepara el GPIO associats amb els LEDs i amb la direcció correcta; els apaga també  

void elsmeus_LEDs_init() { 

LED_DIR1 |=  espai i  ; LED_DIR2 |=  espai j  ;  

LED_OUT1 |=  espai k  ;  //Apaga els LEDs 0, 1  LED_OUT2 |=  espai l  ;  //Apaga els LEDs 2, 3 

 } 

 

void main(void) { 

Uint16 valor; USBSTK5515_init(); //Inicialitza el processador elsmeus_LEDs_init(); while(1) { 

printf("Quin LED vols commutar (0, 1, 2, o 3)?\n"); scanf("%d",&valor); commuta_LED(valor); 

} }

 

Per  comprovar  que  les  vostres  respostes  són  correctes,  creeu  un  projecte  amb  les  dades 

trobades  a  l’arxiu  PDS_Sessio01_P01.zip.  Un  cop  creat  el  projecte,  ompliu  el  codi  amb  les 

respostes de  l’exercici previ  i  comproveu el  funcionament. Per  fer‐ho,  compileu  la versió de 

depuració (“debug”) i “debuga” el codi (Target‐>“Debug Active Project”).  

Si tot surt bé hauria d’aparèixer  la finestra de depuració,  i podreu  iniciar el programa amb el 

botó “Run” (fletxa verda). Pot ser que hi hagi errors, consulteu l’annex sobre errors i problemes 

freqüents. 

 

Els codis treballats en aquesta sessió són prou simples per trobar i tractar possibles errors amb 

els missatges del compilador  i/o el que es vegi en  temps d’execució. Però moltes vegades  la 

informació obtinguda d’aquesta  forma  serà  insuficient,  i  serà necessari depurar  el  codi. Ara 

treballareu aspectes bàsics, com introduir “breakpoints” i examinar la memòria. 

Per començar, un cop el codi estigui en mode depuració, inicieu el programa (“Run”), i després 

pauseu‐lo  amb  el  botó  “Halt”.  A  continuació  introduïu  un 

“breakpoint”  a  la  primera  línia  de  codi  de  la  funció 

commuta_LED.  Per  afegir  el  “breakpoint”  feu  click  amb  el 

botó dret al nombre de línia al costat esquerre del codi (no a la 

línia de codi) i seleccioneu “Toogle Breakpoint”. Aquest primer 

breakpoint permitirà examinar el valor de les variables i l’espai 

de  memòria  un  cop  inicialitzat  el  programa  però  abans  de 

canviar l’estat de cap LED. Afegeix un altre “breakpoint” al final 

de la funció, per poder estudiar el canvis que produeix. 

Per  poder  estudiar  els  canvis  a  les  dades  de  la memòria  navegueu  a  “View  ‐>Memory”,  on 

podreu seleccionar l’espai de memòria i l’adreça a observar. Executeu el programa modificant 

l’estat del LED 3. Aprofiteu els “breakpoints” per estudiar  les  següents adreces de  l’espai de 

memòria mapejat per entrada i sortida, i contesteu: 

P7.  Quins  valors  veieu  a  l’adreça  de memòria  0x1c0a  quan  canvieu  l’estat  del  LED  3?  Es 

produeix algun canvi a la memòria si actueu sobre el LED 1? Per què? 

P8. Estudia l’adreça 0x1c0b. Es produeixen canvis quan s’altera l’estat del LED 3? 

Per  poder  treballar  amb  la MMIO  sense  haver  de  fer manipulacions  a  nivell  de  bit, Digital 

Spectrum subministra una sèrie de funcions per simplificar certes operacions. Torneu a la vista 

 

de projecte i examineu el contingut del fitxer “usbstk5515_gpio.h”. Aquest fitxer de capçaleres 

conté els prototipus de  les funcions subministrades per Digital Spectrum. Discutiu que creieu 

que  fan,  i  després  comproveu  com  estan  implementades  en  C  dins  el  fitxer 

“usbstk5515_gpio.c”.  Fent  servir  les  funcions  que  acabeu  de  trobar,  reescriviu  el  codi  de 

commuta_LED fent servir les funcions, i contesteu: 

P9. Quins avantatges té treballar amb punters,  i amb  l’operador en  lloc de  les funcions de  la 

llibreria? 

P10. Quins avantatges té treballar amb les funcions de la llibreria? 

 

NOTA: tots els fitxers que s’indiquen en aquest enunciat els trobareu en la carpeta de treball 

dels PCs del laboratori.