You are on page 1of 14

Lectura recomendada / Practica 0

Contenido:
1. Estructura de un programa en C.
2. Punteros, funciones, archivos y operaciones I/O
3. Estructuras de control del programa y bucles o ciclos
4. Tipos de datos soportados por la serie TMS320C55x

Nota: A lo largo del documento y para los efectos del laboratorio se insertaran cdigos en
C, estos estar dispuestos dentro de lo que llamaremos cuadros de cdigo.
Elaborada por: Br. Manuel De Oliveira - Revisado: 25/02/15
Introduccin
C ha sido distinguido por la eficiencia del cdigo que produce no solo por la
potencialidad de los comandos y estructuras de datos sino tambin por su portabilidad
para migrar entre plataformas y dispositivos DSP. Es el lenguaje de programacin ms
popular para crear desarrollos de software, para crear aplicaciones y para la programacin
de microcontroladores de todo tipo.
Se trata de un lenguaje medio nivel pero con muchas caractersticas de bajo nivel.
Dispone de las estructuras tpicas de los lenguajes de alto nivel pero, a su vez, dispone de
construcciones del lenguaje que permiten un control a muy bajo nivel. Los compiladores
suelen ofrecer extensiones al lenguaje que posibilitan mezclar cdigo en ensamblador con
cdigo C o acceder directamente a memoria o dispositivos perifricos.
El compilador C traduce programas de alto nivel a lenguaje de mquina que puede
ser ejecutado por procesadores como TMS320C55x. Los ambientes de programacin
incluyen programas de depuracin (debugger) para identificar errores en programas
fuente.
El propsito de la programacin DSP es manipular seales digitales para una
aplicacin especfica de procesamiento. Para conseguir esto los programas DSP deben ser
capaces de:
Organizar las variables ( diferentes tipos de datos)
Describir las acciones (Operadores)
Controlar las operaciones (Flujo del programa)
Mover los datos de adentro y afuera entre el mundo exterior y el programa
(Entradas/Salidas)
El presente documento tiene como objetivo hacer un compendio de los elementos
requeridos sobre este lenguaje, considerando su sintaxis, estructura y uso de sus
instrucciones, sin embargo no cubre todos los elementos en su totalidad.

1. Estructura de un programa en C
Un programa en C, consta de varias secciones en donde se determinarn que
variables y funciones tendr el programa, as como la tarea que tendr que realizar.
Los caracteres que se encuentren entre "/*" y "*/", son comentarios y no tienen
efecto para la compilacin, tambin puede usarse // para iniciar un comentario por lnea.
Aunque son opcionales, los comentarios detallados son muy importantes en el
mantenimiento de software DSP

Figura 1 Compilacin, enlace y ejecucin del programa en C

1.1.

Instrucciones para el compilador

El preprocesador es el primer paso del compilador C, como esta descrito en la


figura 1. Se lee en los archivos de cdigo fuente C como entrada y produce archivos de
salida para el compilador. Las tareas de preprocesador son eliminar los comentarios,
interpretar archivos (include). Las directivas del preprocesador dan instrucciones al
compilador que son preformadas antes de compilar el programa.
Cada directiva de preprocesador comienza con el carcter
# seguido de la palabra clave del preprocesador. Por
ejemplo, el programa puede contener las siguientes
directivas:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define K 1024

La directiva (#include <file>) copia el archivo de un directorio dentro del


compilador estndar, mientras si se usara (#include 'file') a menos que se haya
especificado una ruta directamente, copia el archivo del directorio de trabajo actual para
la compilacin. Por otro lado la directica (#define) le especfica a l preprocesador
reemplazar con cada repeticin de (K) el valor constante de (1024).
#define name
#include file
#include <file>

Asocia el smbolo name con la definicin


Copia el directorio especifico file a la compilacin actual
Incluye file de la librera estndar de C

1.2.
Programa Principal (Main)
El programa principal contiene las instrucciones y llamadas a funciones que se
ejecutan en primera instancia. Un programa en C puede constar de una o ms funciones y
una y slo una funcin llamada main() con la que el sistema comenzar a ejecutar.
Despus de iniciar la aplicacin, la funcin main() se ejecuta primero, y por lo general
es responsable del control del programa. Esta funcin se puede escribir para devolver un
valor, o puede ser escrita como una funcin void que no devuelve un valor. El cuerpo de
la funcin est encerrado entre llaves como se muestra en el ejemplo main.c.
void main()
{ unsigned long int i = 1;
short int x ; //Declaraciones para definir variables
x = 2 * i ; //Declaraciones para ejecutar programas
}

Como se muestra en el ejemplo, todas las instrucciones en C terminan con un


punto y coma (;). La funcin contiene dos tipos de declaraciones, las declaraciones que
definen las posiciones de memoria que se utilizarn en el programa y declaraciones que
especifican las acciones a tomar.
1.3. Variables y Operadores de Asignacin
Antes de que una variable se pueda utilizar en un programa C, debe ser declarada
para informar al compilador el nombre y el tipo de la variable. Una variable en C es
definida mediante la declaracin de que una secuencia de caracteres sean tratados como
un particular tipo de dato. Las constantes en C son valores especficos que se incluyen en
las sentencias, mientras que las variables son posiciones de memoria que se asignan un
nombre o identificador. La declaracin de variables usa la siguiente sintaxis:

Tipo_de_dato Nombre;

En el ejemplo del programa principal de la primera


seccin se muestra unsigned long int i donde
se indica el tipo de variable que ser almacenada como

un valor de dato entero (integer)


Un identificador o nombre puede ser cualquier secuencia de caracteres
(normalmente con un poco restriccin de longitud) que comienza con una letra o un guion
bajo, y no puede ser cualquiera de las palabras claves reservadas del compilador C. Como
veremos mas adelante incluso los arreglos y punteros de cada tipo de variable deben ser
declarados y usados tambin.
Las posiciones de memoria deben definirse antes de que otras sentencias la
utilicen. Los valores iniciales tambin se pueden especificar en el
mismo momento en que se definen las ubicaciones de memoria.
int N = 256;
En el cuadro de cdigo se define la variable N como un entero, y le
asigna con el valor 256
El ms bsico operador de asignacin en C es el signo igual sencillo (=), donde el
valor a la derecha del signo igual es asignado a la variable de la izquierda. La forma general
de la declaracin de asignacin es: identificador = expresin; donde la
expresin puede ser una constante, otra variable, o el resultado de una operacin.
C tambin permite que varias expresiones puedan ser colocadas dentro de una
declaracin separndolas con las comas. Cada expresin se evala de izquierda a derecha,
y toda la expresin asume el valor de la ltima expresin que se evala por ejemplo:
int i=j=k;

Nota: este leguaje en particular es sensitivo a maysculas haciendo que las variables DSP,
DsP, y dSP sean diferentes.
1.4. Arreglos
Un arreglo es una serie de variables distintas del mismo tipo, bajo un solo nombre.
Un arreglo de una sola dimensin se puede visualizar como una lista de valores dispuestos
en una fila o bien una columna.
Se puede asignar un identificador a un arreglo, y luego distinguir entre elementos o
valores en el utilizando subndices. Los subndices siempre comienzan con 0 y se
incrementa en 1. En C, todos los tipos de datos pueden ser declarados como un arreglo
colocando el nmero de elementos a ser asignado a un arreglo entre corchetes despus
de su nombre.

Un arreglo unidimensional se declara como:


Tipo_de_dato array_name[N];

Donde el array_name es el nombre de una serie de N elementos del tipo de datos


especificados. Arreglos multidimensionales (matrices) se pueden definir simplemente
aadiendo ms llaves que contengan el tamao de la matriz en cada dimensin, donde i y
j son ndices de fila y de columna, respectivamente.
int matriz [i][j];

Un arreglo puede ser inicializado cuando se define, o los valores se pueden asignar
a l utilizando sentencias de programa. Para inicializar la matriz al mismo tiempo cuando
se define, los valores se especifican en una secuencia que est separado por comas y
encerrada con las llaves:
int y[5]= {1.0, 0.0, 0.0, 0.0, 0.0};

2. Punteros, Funciones, Archivos y operaciones I/O.


2.1. Punteros (Pointers)
Adems de los tipos de variables mencionados en el documento, C posee otro tipo
de variable llamada puntero, un puntero es una variable que almacena una direccin de
algn dato, estos son utilizados principalmente para los siguientes propsitos:

Apuntar a diferentes elementos de datos dentro de un arreglo o array.


Permitir a un programa crear nuevas variables mientras el programa se est
ejecutando (Posicionamiento dinmico de la memoria).
Acceder a diferentes posiciones en una estructura de datos.

Son requeridos dos operadores especiales para manipular adecuadamente los


punteros: el operador de indereccin (*) es usado cuando es requerido el dato
almacenado en la direccin al que apunta el puntero, y el operador de direccin (&) se
utiliza para apuntar a la direccin de una variable.
int i = 5;
int *ptr;
ptr = &i;
*ptr = 8;

La primera sentencia declara a i como un entero de valor 5 la


segunda declara ptr como un puntero a una variable del tipo
integer, la tercera hace que el ptr apunte a la direccin de i, y
finalmente la ltima sentencia cambia el valor contenido de la
direccin apuntada de 5 a 8.

En C, el nombre de un arreglo se puede utilizar como un


puntero o puede ser utilizado para hacer referencia a elementos del
arreglo por ejemplo en la siguiente sentencia:

int *ptr;

En el cuadro de cdigo se define a ptr como un puntero a una variable del tipo
integer, por lo que *ptr y ptr[0] son exactamente equivalente, aunque el significado
de ptr[0] es con frecuencia mas claro.
Nota: Se puede apreciar que la diferencia que existe entre un puntero y un arreglo es que
el arreglo tiene una cantidad de memoria propia, mientras que el puntero no.
2.2.

Funciones
Como discutimos en las seccin 1.2 todos los programas en C tienen una o ms
funciones incluyendo el main(). En C las funciones o subrutinas estas disponibles en las
libreras, estas funciones son un conjunto de sentencias que tpicamente ejecutan una
operacin.
Para mantener la simplicidad y la legibilidad en aplicaciones complicadas, se
desarrollan programas que usen una funcin main() aadiendo otras adicionales, en
vez de usar una sola funcin main muy larga.
Una funcin consiste de una definicin de sentencia seguida por el cuerpo de
la funcin, la primera parte define el nombre de la funcin y el tipo de valor que es
devuelto por ella y una segunda dentro de un par de parntesis contiene los argumentos,
mientras que las llaves contienen las sentencias ejecutables. Por ejemplo:
signed long int fir(int *x, int *h, int ntap)
{
short int yn = 0.0;// salida del filtro FIR
int i; // ndice
//ms sentencias
return(yn); // devuelve el valor de y(n) a el main
}

La primera lnea declara la funcin llamada fir que devuelve un valor del tipo
signed long int al programa principal. Note que las variables declaradas como
argumentos de la funcin son en realidad punteros.
Adicionalmente variables locales (yn,i) se declaran en el cuerpo de la funcin, la
sentencia return(yn)devuelve el resultado a la funcin que hizo el llamado. Tenga en
cuenta que el tipo de expresin debe coincidir con el tipo de retorno indiciado en la
definicin de la funcin, si la funcin no devolviese un valor, el tipo es void.

La declaracin de una sentencia de funcin define los parmetros que son


requeridos por la funcin y estos parmetros se denominan parmetros formales.
Cualquier declaracin que llama a la funcin debe incluir los valores que corresponden a
los parmetros y estos son llamados parmetros actuales. Los parmetros formales y
actuales correspondientes deben coincidir en nmero, el tipo y el orden. Tomando la
sentencia del ejemplo anterior:
signed long int fir(int *x, int *h, int ntap)

La sentencia desde el programa principal que llama a la funcin es


Yn = fir(xn, bn, k); // salida del filtro FIR

As, las variables:


x, h, ntap son los parmetros formales.
xn, bn, k son los parmetros actuales.
Cuando las referencias a la funcin fir se ejecutan en el programa principal
main, los valores de los parmetros actuales son copiados a los parmetros formales, y
las sentencias en la funcin fir son ejecutadas usando los nuevos valores en x, h,
ntap.
2.3.
Archivos y operaciones I/O.
En DSP en particular las funciones para interaccin con el usuario no son utilizadas,
sin embargo con ciertas funciones podremos interactuar con el procesador y sus
perifricos. Para usar el estndar de funciones (input/output) provista por el compilador C,
debemos tener la directiva del procesador #include <stdio.h> que incluyen los
archivos de cabecera del estndar I/O para la declaracin de funciones. Las funciones ms
usadas identifican los archivos para lectura o escritura con el uso de archivos punteros
para almacenar la direccin de la informacin requerida para acceder al archivo.
Las funciones como printf()y scanf() ejecutan entradas y salidas
formateadas, lo que hace referencia al control de como el dato es ledo o escrito, lo que
permite convertir por ejemplo una entrada a un tipo de variable especifico (int, char,
etc) o escribir una salida de cierta manera. Son usadas del siguiente modo:
printf("formato",variable_1, variable_2);
scanf("formato",&variable_1, &variable_2);

En cuanto al formato para printf hace referencia a un string que contiene el


texto que va a salir en pantalla, por otro lado las funciones scanf proporcionan una
entrada formateada para lectura, por ejemplo en el cuadro de cdigo la sentencia lee
desde consola una variable mediante el operador de direccin &.

Las funciones de formato I/O tambin reconocen los siguientes formatos:


%d - Para entero decimal (integer)
%f - Para flotante (float)
%lf - Para double
%c - Para char
%x Para hexadecimales
\n - Saltos de lnea (return)
La funcin fwrite escribe datos binarios. Es decir, fwrite escribe bloques de
datos sin formato a un archivo que se ha abierto en modo binario. Los datos escritos
pueden ser enteros o nmeros de punto flotante en formato binario (ellos pueden
representar sonidos digitales o imgenes). Por el contrario, la funcin de fread se utiliza
para leer datos de un archivo sin formato binario. La funcin de fread requiere cuatro
argumentos. Por ejemplo, las sentencias de ambas funciones serian de la forma:
fread(&xn, sizeof(int), 1, fpin);
fwrite(&yn, sizeof(int), 1, fpout);

3. Estructuras de control del programa y bucles o ciclos


El lenguaje C tiene un conjunto completo de caractersticas de control del
programa que permiten la ejecucin condicional o la repeticin de declaraciones en bucles
basados en el resultado de una expresin.
3.1. Estructuras de Control
El lenguaje C proporciona dos mtodos bsicos para la ejecucin de una declaracin o
serie declaraciones condicionales: la declaracin (if) y (switch-case).
Declaracin If
La declaracin if nos permite probar una condicin y luego ejecutar sentencias en
funcin de si la condicin dada es verdadera o falsa.
El presente diagrama de
flujo indica la lgica
asociada al uso de esta
estructura de control:

if(condicin)
{
sentencia1;
sentencia2;
}

Si la condicin es verdadera las sentencias dentro de los


llaves sern ejecutas de lo contrario sern omitidas.

Declaracin if / else
Una declaracin if/else permite ejecutar un conjunto de sentencias si la
condicin es verdadera y un conjunto diferente si por el contrario es falsa.
if(condicin)
{ sentencia A;
}
else
{ sentencia B;
}

Declaracin switch-case
Cuando un programa tiene que elegir entre varias alternativas, el if/else es
inconveniente y algo ineficaz. Cuando se eligen ms de cuatro alternativas desde una sola
expresin, la declaracin switch-case es muy til.

switch(expresin entera)
{
case constante_1:
sentencia;
break;
case constante_2;
sentencia;
break;
...
default:
sentencia;
}

El control del programa salta a la sentencia


si la etiqueta (case) con la constante (que puede
ser un carcter entero o solo entre comillas)
coincide con el resultado de la expresin de
entero en la sentencia switch.
Si no coincide con el valor constante de la
expresin, el control pasa a la instruccin que
sigue con la etiqueta (default). Cuando se
produce una coincidencia, se ejecutarn las
instrucciones que siguen a la etiqueta (case)
correspondiente.

El programa de ejecucin continuar hasta que el final de la sentencia switch es


conseguida, o una declaracin (break) redirija el control hasta el final de la sentencia
switch-case. Una declaracin (break) se debe incluir en cada (case) y no se
requiere despus del ltimo (case) o sentencia (default).

3.2. Bucles o ciclos (Loops)


El lenguaje C proporciona tres tipos deferentes de estructuras de bucles o ciclos
que permiten que una sentencia o un grupo de estas sean repetidas un nmero fijo o
variable.
Bucle For
Muchas operaciones DSP requieren ciclos que son basados en el valor de la
variable que es incrementada o decrementada (contador del ciclo), cuando este alcanza
un valor especifico se desea que el programa en ejecucin salga del ciclo. El bucle for
combina una declaracin de inicializacin, una de finalizacin y una de accin, ejecutada al
final de cada ciclo, es una de las estructuras de control fundamentales para DSP.
for(k=1; k<N; k++)
{ y[k]= 0.0;
}

Las instrucciones dentro de las llaves se repetirn


varias veces. Inicialmente K tomar el valor 1 Cada vez
que se repita el ciclo, K aumentar en 1 hasta que K sea
igual a N.

Nota: El algoritmo previo describe que el entero K es incrementado si la condicin k<N es


verdadera, cuando el bucle finaliza los elementos del arreglo y son fijados a cero desde
y[1] hasta y[N-1].
Bucle While
Este bucle repetir las sentencias hasta que la condicin sea probada como falsa o
cero, lo que quiere decir que mientras sea verdadera seguir ejecutndose. Para disear
esas condiciones pueden utilizarse los operadores lgicos (Ver Apndice A).
La condicin se evala antes que se ejecuten las
sentencias dentro del ciclo. Si la condicin es falsa, las
sentencias de dentro del bucle se omiten, y la ejecucin
contina con la declaracin despus del bucle while. Si la
condicin es verdadera, entonces las sentencias de bucle se
ejecutan, y la condicin se evala de nuevo.

while (condicin)
{ sentencias
}

Esta repeticin contina hasta que la condicin es falsa. Tenga en cuenta que la
decisin de ir entrar al bucle se hace antes que el bucle inicie. Debido a esto es posible
que el bucle nunca se ejecute.
Bucle Do/While
do{ Sentencia;
}
while(condicin);

Este bucle es usado cuando un grupo de sentencias


necesitan ser repetidas y la condicin de salida debe ser
probada al final del lazo el formato general es que se
muestra en los cuadros de cdigo

4. Tipos de datos soportados por el TMS320C55x


La serie de procesadores TMS320C55x soportan la
programacin en el estndar C, en l se identifican ciertas
caractersticas definidas de implementacin que pueden
diferir de otros compiladores de C, dependiendo del tipo de
procesador, el entorno de tiempo de ejecucin DSP, y el
ambiente que aloja el compilador.
El C55x es diseado para aplicaciones en tiempo real. El tipo de dato ms comn es
el tipo entero (integer) de punto fijo de 16 bits, debido a esto una importante diferencia
en la definicin del tipo de datos que utiliza el C55x y algn otro compilador C es el
tamao entre datos del tipo. En la siguiente tabla se listan:
Tipo de datos
Char
Unsigned char
Short
Unsigned short
Int
Unsigned int
Long

Tamao
16-bit
16-bit
16-bit
16-bit
16-bit
16-bit
32-bit

Representacin
ASCII
ASCII
Complemento a 2
Binaria
Complemento a 2
Binario
Complemento a 2

Rango
[-32768, 32767]
[0, 65 535]
[-32768, 32767]
[0, 65 535]
[-32768, 32767]
[0, 65 535]
[-2147483648, 2147483647]

Unsigned long
Float
Double
Long double
Enum
Data pointer
Data pointer
Program pointer

32-bit
32-bit
32-bit
32-bit
16-bit
16-bit
23-bit
24-bit

Binario
IEEE 32-bit
IEEE 32-bit
IEEE 32-bit
Complemento a 2
Memoria small
Memoria large
Funcin

[0, 4294967295]
[1.175494
,3.40282346
[1.175494
,3.40282346
[1.175494
,3.40282346
[-32768, 32767]
[0x0, 0xFFFF]
[0x0, 0x7FFFFF]
[0x0, 0xFFFFFF]

]
]
]

De la tabla debemos considerar lo siguiente:

Los tipos de datos de signo usan representacin en complemento a 2.


Es responsabilidad del programador / ingeniero / estudiante, definir y utilizar los
tipos de datos correctamente al escribir el programa.
Al portar aplicaciones de un procesador a otro es igualmente importante que la
conversin sea aplicada.

A. Apndice A. Operadores
A.1. Aritmticos
Los operadores aritmticos binarios usuales (son binarios por que realizan las operaciones
en dos operadores) los primeros cuatro son definidos para todas las variables, mientras
que el ultimo solo para operadores enteros, estos utilizan en C los siguientes smbolos.
Operadores Aritmticos

Descripcin
Multiplicaciones
Divisin
Adicin
Sustraccin
Modulo (Resto entero despus de la divisin)

C tambin incluye operadores de incremento (++) y decremento (--) para las


variables por ejemplo, la sentencia i++ es igual a la sentencia i=i+1.

Los operadores en C permiten ser combinados con el operador de asignacin = ,


por lo que cualquier sentencia de la forma: x=x+y; es igual a la sentencia x+=y;

Algunas implementaciones en compiladores pueden generar cdigo que es mas


eficiente si el operador combinado es usado, los operadores combinados incluyen
+, -, *, /,%, y algunos operadores lgicos.

Nota: C no cuenta con el operador de exponenciacin sin embargo en la libreras se


cuenta con pow(x,y) y puede ser usada para computar .
A.2. Lgicos
Los operadores lgicos son aquellos que devuelven un valor falso o verdadero. Podra
utilizarse para comparar dos valores, si el resultado de una operacin lgica es verdadera
(true) esta tendr un valor diferente de cero, por lo contrario si es falso (false) esta valdr
0.
Operadores Lgicos
Descripcin
Menor que
Mayor que
Menor o igual que
Igual a
Mayor o igual que
No igual que
AND lgico
Or lgico
Not lgico

A.3.

Bit a Bit (Bitwise)

Estos operadores a nivel de bits hacen de la programacin en C un lenguaje de


programacin eficiente para aplicaciones DSP.
Operadores Bit a Bit

Descripcin
AND bit a bit
Or bit a bit
Or exclusivo bit a bit
Desplazamiento a la izquierda (del nmero de bits operando)
Desplazamiento a la izquierda (del nmero de bits operando)
Not bit a bit

Referencias
[1]
[2]
[3]

P. M. Embree, C Algorithms for Real-Time DSP, Englewood Cliffs, NJ: Prentice-Hall,


1995.
P. M. Embree and B. Kimble, C Language Algorithms for Digital Signal Processing,
Englewood Cliffs, NJ: Prentice-Hall, 1991.
S. P. Harbison and G. L. Harbison, C: A Reference Manual, Englewood Cliffs, NJ:
Prentice-Hall, 1987.

You might also like