Adaptando FreeRTOS para utilización con LPC2114

Tabla de Contenidos

Adaptando FreeRTOS para utilización con LPC2114

Introducción

Modificaciones al Proyecto Original

Eliminación de otras arquitecturas

Modificación del Linker Script

Modificación del Makefile

Script de Compilación

Configuración del FreeRTOS

Modificación de "main.c"

Cambiando Nombres

Compilando y Ejecutando

Conclusiones

Referencias

Introducción

FreeRTOS[1] (Free Real Time Operating System) es un mini Kernel de Tiempo Real, que se distribuye bajouna versión modificada de la GPL[2], cuya única diferencia consiste en que no obliga a liberar el código desarrollado independientemente del núcleo del OS, aún cuando el código esté "linkeado" dinámica o estáticamente al del FreeRTOS.

Vamos a utilizar la versión 5.3.0, cuyo código fuente se puede descargar desde la página oficial de FreeRTOS[1].

Modificaciones al Proyecto Original

El código que descargamos contiene ejemplos para utilizar FreeRTOS en varias arquitecturas de hardware, y con varios compiladores distintos.

Como ninguno de estos ejemplos corresponde exactamente a al microcontrolador NXP LPC2114 que queremos utlizar, optamos por modificar el que se encuentra en FreeRTOS/Demo/ARM7_LPC2106_GCC.

Eliminación de otras arquitecturas

De todo el árbol de directorios, solo dejamos los que necesitamos, que son:

Demo/ARM7_LPC2106_GCC

Demo/Common/Full

Demo/Common/include

Demo/Common/Minimal

License

Source/include

Source/portable/GCC/ARM7_LPC2000

Source/portable/MemMang

Modificación del Linker Script

Cambiamos en las líneas 4 y 7 del archivo Demo/ARM7_LPC2106_GCC/lpc2106-rom.ld donde dice "64K" (RAM del lpc2106) por "16K" (RAM del lpc2114). Hacemos lo mismo con lpc2106-ram.ld.

Modificación del Makefile

Eliminamos los siguientes archivos fuente, que pertencen a ejemplos de módulos que no vamos a utilizar:

$(DEMO_SOURCE_DIR)/integer.c \

$(DEMO_SOURCE_DIR)/PollQ.c \

$(DEMO_SOURCE_DIR)/semtest.c \

$(DEMO_SOURCE_DIR)/dynamic.c \

$(DEMO_SOURCE_DIR)/BlockQ.c \

Agregamos a la sección "clean", la siguiente instrucción

"rm rtosdemo.*" (para que solo queden archivos fuente cuando queremos hacer un "commit" al SVN).

Agregamos las siguientes secciones con las siguientes instrucciones:

grabar_s: lpc21isp -wipe -hex rtosdemo.hex /dev/ttyS0 115200 14745grabar_u: lpc21isp -wipe -hex rtosdemo.hex /dev/ttyUSB1 115200 14745

Con estos comandos podemos elegir si quermos grabar el ejecutable a través de un puerto serie, o a través de un conversor USB a RS232.

Script de Compilación

Se utiliza para automatizar los pasos que se deben dar para compilar el proyecto. En general lo que se hace es definir variables de entorno que luego se utilizan para realizar compilación condicional.

En Demo/ARM7_LPC2106_GCC/ boramos todos los archivos ".bat", que solo sirven bajo Windows, y creamos el archivo "rom_arm.sh" (al que debemos darle permiso de ejecución), con el siguiente contenido:

export USE_THUMB_MODE=NOexport DEBUG=export OPTIM=-O3export RUN_MODE=RUN_FROM_ROMexport LDSCRIPT=lpc2106-rom.ldecho $USE_THUMB_MODEecho $DEBUGecho $OPTIMecho $RUN_MODEecho $LDSCRIPTmake

Configuración del FreeRTOS

En el archivo "Demo/ARM7_LPC2106/FreeRTOSConfig.h" se encuentran una serie de definiciones que sirven para configurar el funcionamiento de FreeRTOS y también del mirocontrolador en si.

Los cambios que realizamos son:

"#include <lpc2114.h>" en vez de "#include <lpc210x.h>" (línea 55)

En "#define configMINIMAL_STACK_SIZE" (línea 76) cambiamos el valor, de 128 a 100 (reduciendo el tamaño mínimo de la pila de cada tarea)

En "#define configTOTAL_HEAP_SIZE" (línea 77) cambiamos el valor, de "24 * 1024" a "14200"

Modificación de "main.c"

Eliminar las siguientes líneas (que pertenecen a módulos no utilizados):

Encabezados:

#include <string.h>#include "integer.h"#include "PollQ.h"#include "semtest.h"#include "flop.h"#include "dynamic.h"#include "BlockQ.h"

En "main()":

vStartIntegerMathTasks( tskIDLE_PRIORITY );vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );vStartMathTasks( tskIDLE_PRIORITY );vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );vStartDynamicPriorityTasks();vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );

En "prvCheckOtherTasksAreStillRunning()"

if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) { lReturn = ( portLONG ) pdFAIL; } if( xArePollingQueuesStillRunning() != pdTRUE ) { lReturn = ( portLONG ) pdFAIL; } if( xAreMathsTaskStillRunning() != pdTRUE ) { lReturn = ( portLONG ) pdFAIL; } if( xAreSemaphoreTasksStillRunning() != pdTRUE ) { lReturn = ( portLONG ) pdFAIL; } if( xAreDynamicPriorityTasksStillRunning() != pdTRUE ) { lReturn = ( portLONG ) pdFAIL; } if( xAreBlockingQueuesStillRunning() != pdTRUE ) { lReturn = ( portLONG ) pdFAIL; }

Cambiando Nombres

Cambiamos los nombres de los siguientes archivos:

Demo/ARM7_LPC2106_GCC por ARM7_LPC_2114_GCC

Demo/ARM7_LPC2114_GCC/lpc2106-ram.ld por lpc2114-ram.ld

Demo/ARM7_LPC2114_GCC/lpc2106-rom.ld por lpc2114-rom.ld (y cambiamos la línea correspondiente en rom_arm.sh).

Compilando y Ejecutando

Desde una consola ejecutamos:

> ./rom_arm.sh> make grabar_s

Y el programa ya está compilado y grabado en el micro. Abriendo algún emulador de terminal serie, veremos que el micro envía caracteres desde la 'A' a la 'X'.

Conclusiones

Para poder llevar a cabo esta adaptación, tuvimos que interiorizarnos en el funcionamiento interno de FreeRTOS, cómo funcionan sus módulos y cómo está organizado el código. Esperamos a partir de ahora ir de a poco agragándole las funciones necesarias para el RoMAA.

Ejecutando las siguientes instrucciones desde Demo/ARM7_LPC2106_GCC

#ReFer

Referencias

http://www.freertos.org

http://www.freertos.org/index.html?http://www.freertos.org/a00114.html