Adaptando FreeRTOS para utilización con LPC2114
Tabla de Contenidos
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 14745 grabar_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=NO export DEBUG= export OPTIM=-O3 export RUN_MODE=RUN_FROM_ROM export LDSCRIPT=lpc2106-rom.ld echo $USE_THUMB_MODE echo $DEBUG echo $OPTIM echo $RUN_MODE echo $LDSCRIPT make
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