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.
Top Related