• No results found

3. Life Cycle Software Reliability and Safety Activities

3.1. Planning Activities

3.1.5. Software Safety Plan

Un diagrama de flujo es la representación gráfica de los pasos o etapas de un proceso describiendo las secuencias en interacciones de dicho proceso en un algoritmo, esta representación se basa en el empleo de diferentes símbolos que representan operaciones específicas, normalmente dichas operaciones se interconectan con flechas indicando una secuencia de operación, es por tanto que se conocen como diagramas de flujo, son útiles en programación puesto que representan de manera gráfica y simple de leer los algoritmos y operaciones que se requiere implementar en un sistema computacional cualquiera, sirviendo así como medio de planificación para escribir programas.

Para evitar ambigüedades al momento de descifrar un diagrama de flujo, se han estandarizado los símbolos que en este tipo de representaciones se emplean sumado a una serie de reglas y recomendaciones (norma ISO 5807), a continuación se enumeran los símbolos más comunes y una explicación se su funcionalidad, ver figura 26:

Ovalo: Normalmente se emplea para indicar el inicio o el fin de un proceso o algoritmo. En su interior se sitúan materiales, información o acciones para comenzar el proceso o para mostrar el resultado en el final del mismo

Flecha: Indica el sentido y trayectoria del proceso de información o tarea. Rectángulo: Es el símbolo más comúnmente utilizado. Se usa para

representar un evento que ocurre de forma automática y del cual generalmente se sigue una secuencia determinada.

Rombo: Se utiliza para representar una condición. Normalmente el flujo de información entra por arriba y sale por un lado si la condición se cumple o sale por el lado opuesto si la condición no se cumple. El rombo además especifica que hay un salto o bifurcación.

Romboide: en su interior generalmente se sitúa información de apoyo necesaria para realizar una actividad.

Círculo: Representa un punto de conexión entre procesos. Se utiliza cuando es necesario dividir un diagrama de flujo en varias partes, por ejemplo por razones de espacio o simplicidad. Una referencia debe darse dentro para distinguirlo de otros. La mayoría de las veces se utilizan números en los mismos.

Ciertas reglas que hay que tener en cuenta a la hora de realizar diagramas de flujo pueden ser las siguientes:

 Debe existir siempre un camino que permite llegar a una solución (finalización del algoritmo).

 Solo debe existir un único inicio del proceso.

 Nombrar o etiquetar correctamente los procesos para evitar confusiones.

 Solo debe existir un único punto de fin para el flujo de proceso, salvo el caso de bifurcaciones a partir de rombos.

 Se deben evitar los ciclos infinitos que bloqueen el programa y las entradas que no presentan salidas.

 Evitar elementos de generación espontánea, es decir salidas que no son generadas a partir de una entrada, generalmente son situaciones erróneas.

Ejemplo: realizar el diagrama de flujo para una rutina de retrazo de 100 ms. Figura 27. Diagrama de flujo para una rutina de retrazo de 100 ms.

Como se observa en la figura 27 un simple ejemplo de cómo realizar un diagrama de flujo para un proceso muy empleado en programación de microcontroladores como lo es una rutina de retardo, la idea general de este diagrama de flujo es representar un pedazo de código que realice la funcionalidad requerida, para tal efecto se inicia un contador que se decrementa de uno en uno hasta que dicho contador sea cero, el valor con el que se inicia el contador depende del tiempo de espera que pueda ser implementado en el dispositivo, por ejemplo si dicho tiempo

de espera es de 2 ms, entonces el contador se inicia en 50 así al realizar las iteraciones requeridas para decrementar este valor a cero, la rutina finaliza una vez se cumple el retrazo requerido. Se puede observar también que en el bloque con forma de rombo es donde se toma la decisión de finalizar o no el programa. Lección 2: Programación en Lenguaje Ensamblador (Assembler).

El lenguaje ensamblador marca un buen punto de partida para el estudiante puesto que representa un estudio profundo de cualquier microcontrolador tanto en su estructura como en su juego de instrucciones, brindando las bases suficientes para adentrarse en el mundo de la programación y desarrollo de aplicaciones con los microcontroladores.

Es recomendable tener presente el manual de referencia ‟CPU08RM.pdf‟ que puede bajarse de la página del fabricante de los MCU‟s (www.freescale.com). En él se puede encontrar toda la información relevante para reforzar algunos de los temas analizados durante el curso como el modelo de programación, instrucciones, modos de direccionamiento, etc. además se encuentran ejemplos sobre el uso de algunas instrucciones.

1. El Assembler.

Como es sabido los sistemas computacionales requieren instrucciones de manera secuencial y así que puedan realizar las funciones para las cuales han sido diseñados, de otra forma serían inservibles. Estas instrucciones de forma secuencial forman lo que se conoce como programas. Existen diferentes formas de escribir programas pero independientemente de esto, los dispositivos semiconductores de procesamiento lo único que comprenden y procesan es el lenguaje de máquina.

El lenguaje de máquina está conformado por códigos de instrucción que en esencia son números representados por series binarias, todos los dispositivos de procesamiento tienen un código de operación (op.code) para cada una de sus funciones. Como se ha visto anteriormente se sabe que todas las instrucciones para cualquier lenguaje de máquina tienen por lo menos dos partes; la primera es el comando u operación en si, que dice al procesador cuál es la función que se va a realizar. La segunda parte de la instrucción es el operando, que indica al procesador donde (posición en memoria) hallar o almacenar los datos y otras instrucciones que serán manipuladas.

Puesto que para el ser humano manejar este tipo de códigos a la hora de realizar la programación de los dispositivos resultaría extremadamente tedioso se han desarrollado diferentes técnicas y lenguajes de programación tanto de alto como de bajo nivel.

El lenguaje ensamblador en un lenguaje de bajo nivel ya que es la representación más directa de los códigos de instrucción mediante nemónicos, un nemónico es un vocablo que en lenguaje ensamblador representa un código de instrucción binario, los nemónicos se emplean para facilitar el aprendizaje, por parte del programador, de los diferentes códigos que soporta un determinado dispositivo. Toda programación realizada en lenguaje ensamblador debe ser compilada o traducida a código de máquina para que el dispositivo pueda entenderla.

Para comprender mejor este concepto se presenta el siguiente ejemplo:

Se tiene el siguiente código de máquina en Binario: 10100110 01100001 (Hexadecimal: 0xA661). La representación equivalente en lenguaje ensamblador es más fácil de recordar: MOV $61; Esta instrucción significa: cargue el acumulador con el dato almacenado en la posición 61 de la memoria.

Algunos pros y contras sobre el empleo de este lenguaje se enumeran a continuación:

Pros:

 Los programas hechos en lenguaje ensamblador son generalmente más rápidos en su ejecución que los hechos en lenguajes de alto nivel con iguales funcionalidades. Al programar cuidadosamente en lenguaje ensamblador se pueden crear programas que se ejecutan de 5 a 10 veces más rápido que con lenguajes de alto nivel.

 Los programas hechos en lenguaje ensamblador generalmente ocupan menos espacio de memoria. Un buen programa en lenguaje ensamblador puede ocupar casi la mitad de espacio que su contraparte en lenguaje de alto nivel.

 Utilizando lenguajes de alto nivel, no es un buen comienzo para aprender sobre los MCU’s, mas aún, se necesita conocer todas las características de la arquitectura para poder programar con lenguajes de alto nivel.

 Con el lenguaje ensamblador se pueden crear segmentos de código imposibles de formar en un lenguaje de alto nivel.

 A medida que se aprenda a programar en assembler se pueden ir creando librerías de funciones que se pueden añadir a futuros códigos inclusive implementar en otro tipo de MCU, facilitándose así mucho el trabajo.

 Es bueno conocer el lenguaje ensamblador incluso si se programa en lenguajes de alto nivel puesto que muchos compiladores permiten la incrustación de código ensamblador en algún segmento de programa. Contras:

 Programar en lenguaje ensamblador es difícil de aprender, entender, leer, escribir, depurar y mantener, por eso surgió la necesidad de los lenguajes compilados.

 El lenguaje ensamblador no es 100% portable.  Programar en lenguaje ensamblador toma tiempo. Lección 3: Notaciones y sintaxis.

Todos los programas en assembler son creados en un editor de texto cualquiera produciéndose un archivo de texto siguiendo algunas reglas y notaciones, para empezar en las siguientes tablas se presentan las notaciones de los diferentes registros de la CPU y los bits del registro de código de condición:

Tabla 6. Notación de los registros del MCU.

Notación Registro Tamaño del registro

A Acumulador 8

CCR Reg. de condición 8

H:X Reg. Indice 16

SP Puntero de Pila 16

PC Contador de Programa 16

Tabla 7. Notación de los Bits del CCR.

Notación Descripción

H Acarreo Medio, Bit 4

I Máscara de Interrupción, Bit 3

N Bandera de Negativo, Bit 2

Z Bandera de Cero, Bit 1

C Bandera de acarreo, Bit 0

A continuación se realizan ciertas definiciones relevantes a la hora de escribir programas en assembler:

Líneas de comentario:

Son empleadas por el usuario para documentar el programa que se encuentra desarrollando, sirven para que en futuras ocasiones pueda comprender que se ha realizado o en caso de que otra persona entre a analizar el programa. Las líneas de comentario no deben afectar la programación a la hora de compilar, por lo tanto para que el compilador las identifique se debe anteponer punto y coma (;) o un asterisco en la parte mas izquierda de la línea de texto.

******************************************************************

* Este es un comentario *

****************************************************************** ;Este también es un comentario.

LDA NUM1 ; Este también es un comentario. Etiquetas:

También conocidas como identificadores, son nombres para constantes, variables, direcciones y subrutinas definidos por el programador, los nombres pueden contener letras mayúsculas y minúsculas también pueden tener números pero no pueden tener signos de puntuación ni tener más de 10 caracteres. Los nombres son sensibles a diferencias entre mayúsculas y minúsculas; por ejemplo PuertoA y puertoA son dos etiquetas diferentes.

Las etiquetas se definen colocándose en la parte más hacia la izquierda de la línea de código; el ensamblador le asigna internamente un valor igual a la dirección actual, es importante no definir las etiquetas más de una vez, de lo contrario el ensamblador registrará un error. La dirección de la memoria se va actualizando a medida que se van ocupando los bytes ya sea para programa o almacenamiento de datos.

Otra forma de definir etiquetas es empleando la directiva EQU asignando entonces el valor que se encuentra en la columna de parámetros, en este caso el espacio de memoria actual permanece invariable.

Ejemplo:

FLASH EQU $EE00

Ten EQU 10

Expresiones Matemáticas:

El lenguaje ensamblador tiene un desempeño limitado en el campo de las expresiones matemáticas, solo una operación es permitida por expresión, para escribir expresiones se debe tener en cuenta que el operador debe estar separado de los parámetros por espacios en blanco. Los operadores válidos son: suma (+), resta (-), multiplicación (x), división (/) y módulo (%).

Las anteriores operaciones aritméticas son llevadas a cabo por el ensamblador en el momento de compilar un código, es decir, el resultado de las expresiones es convertido directamente en un valor constante o una dirección de memoria. Una aplicación de las expresiones puede ser el acceso a un parámetro de varios bytes, por ejemplo, si se supone que NUM es una variable está declarada como

de 4 bytes, para acceder cada byte individualmente se emplearía NUM, NUM + 1, NUM + 2, NUM + 3.

Ejemplo:

NUM DS 4 ; Se reserva 4 Bytes para NUM.

LDA NUM + 3 ; Se carga el LSB en el Acumulador. LDA NUM ; Se carga el MSB en el Acumulador.

Es de tener en cuenta que el ensamblador asigna el primer byte para el byte más significativo (MSB), seguido por los menos significativos.

Para evitar confusiones por parte del estudiante a la hora de escribir código en assembler a continuación se resumen las convenciones que se emplean a la hora de escribir la programación en assembler.

 Cualquier texto que se encuentre después de un símbolo (;) es considerado como un comentario.

 Un asterisco en la posición más hacia la izquierda define toda la línea como un comentario.

 Las instrucciones del juego de instrucciones de la CPU pueden ser escritas en mayúsculas o minúsculas.

 Todas las etiquetas son sensibles a las mayúsculas, no pueden tener más de 10 caracteres ni signos de puntuación.

 La definición de las etiquetas debe hacerse en la parte más hacia la izquierda de una línea de código, el uso de dos puntos (:) después de una etiqueta es opcional.

 Las operaciones o directivas deben ir precedidas de un espacio en blanco o TAB horizontal.

 Los parámetros de las instrucciones deben ir separados por espacios en blanco, comas o TAB‟s horizontales.

 El direccionamiento inmediato se especifica al emplear el símbolo # precediendo un parámetro constante.

 Las constantes Binarias son precedidas por el símbolo %.

 Las constantes Hexadecimales son precedidas por el símbolo $.

 Los números serán decimales excepto los que son precedidos por % o $.  Las expresiones matemáticas se restringen a una sola operación y puede

ser +, -, x, / y %.

 Las operaciones matemáticas deben separarse de los parámetros por espacios en blanco.

 Si al final de un registro se coloca una letra H o L significa que se trata de la parte alta o baja correspondientemente, es decir los 8 bits mas significativo (parte alta) o los 8 menos significativos (parte baja).

 Una letra „n‟ inmediatamente después de un registro indica la posición o bit „n‟ de dicho registro.