Criando um projeto no LPCxpresso com FreeRTOS do Zero

Postado em Atualizado em

Olá!

Como estão? Hoje vamos criar um tutorial simples e objetivo de como usar o FreeRTOS em projetos com o LPC1768 e LPCXpresso. Entendo que existe uma pergunta quase existencial sobre o uso de S.O. em microcontroladores com capacidade de processamento tão baixa mas nem passaremos por isso aqui.

Posso dizer que o gerenciamento de recursos (cpu/memoria) e a flexibilidade são os pontos que mais me atraem neste tipo de arquitetura.

Para começar, vamos definir o software mínimo no PC:

  • LPCxpresso 7.5.0 (www.lpcware.com)
  • FreeRTOS 8.2.0 (www.freertos.com)

Abra o LPCxpresso e você tem uma tela como abaixo (ou parecida, já que estou desenvolvendo no Ubuntu):

Screenshot from 2015-01-24 00:15:57Agora vá em File -> New -> Project e escolha no wizard C/C++ -> LPCXpresso C Project. Ao escolher o tipo de projeto, na próxima janela escolha a opção abaixo (focando no LPC1768):

Screenshot from 2015-01-24 00:19:21Ao escolher essa opção, escolha o nome do projeto e o microcontrolador a ser usado. Depois, será questionado qual projeto CMSIS você quer. Aqui vamos usar o CMSIS_CORE_LPC17xx, mas para usá-lo é necessário importá-lo primeiro e para isso pressione o botão Import nesta janela e procure pelo zip a ser importado de nome CMSIS_CORE_Latest.zip

Ao escolhê-lo e for em next, verá que neste zip existe CMSIS para todas as plataformas da NXP, selecione somente a CMSIS_CORE_LPC17xx e ao continuar deixe essa opção marcada também na CMSIS Core Library.

Não adicione CMSIS para DSP e na tela de Other Options, selecione a caixa “Create ‘inc’ directory and add to path” para organizar melhor o código dos includes da nossa aplicação e finalmente na ultima janela, selecione as duas opções do Redlib para uma melhor depuração e menor consumo de memória.

Screenshot from 2015-01-24 00:34:14Com o projeto criado, temos a tela acima e agora vamos importar o FreeRTOS! Descompacte os arquivos do FreeRTOS em uma pasta no computador e depois de descompactado, copie a pasta FreeRTOS para dentro do projeto que você acabou de criar:

Screenshot from 2015-01-24 00:43:17Agora vamos integrar o FreeRTOS no nosso projeto, com o cuidado de mexer o mínimo possível na estrutura de arquivos que já existe para que possamos atualizá-lo facilmente depois. Entretanto, aqui existem vários exemplos e arquivos que não podem ser compilados pois foram feitos para outra plataforma e etc.

Então, vamos fazer uma seleção do que pode ser compilado ou não, então clique com o botão direito na pasta FreeRTOS, escolha a opção Resource Configurations -> Exclude from Build. Desmarque tudo e pressione OK.

Você está pensando: “Mas você disse que era para selecionar o que compilar e marcou tudo?!?”. Aqui colocamos todos os arquivos para compilar e agora vamos retirar somento o que não pode ser compilado, fazendo da mesma forma anterior só que deixando tudo marcado na opção Resource Configurations -> Exclude from Build.

Faça isso para as pastas dentro de FreeRTOS:

  • Toda pasta demo;
  • Em portable, todas exceto as pastas GCC e memmang;
  • Em memmang, todos arquivos heap não usados (no nosso caso, todos exceto o heap_3.c);
  • Em GCC, todas exceto a ARM_CM3.

Agora, adicione os arquivos de biblioteca (include .h) nas referencias de compilação do projeto. Então clique no nome do projeto (no meu caso usbhidtest) com o botão direito e vá em properties. Na tela que abrir, em includes, adicione os diretórios conforme a imagem abaixo:

Screenshot from 2015-01-24 01:07:21Agora para compilar, só falta adicionar o arquivo de configuração do FreeRTOS chamado FreeRTOSConfig.h. Este arquivo pode ser obtido na internet ou mesmo montado pelo usuário, mas no meu caso, eu peguei um pronto da exemplo da pasta DEMO dentro do subdiretório CORTEX_LPC1768_GCC_RedSuite e copiei para a pasta inc na raiz do projeto usbhidtest.

Como este arquivo veio do DEMO(?), ele possui o setup básico e algumas configurações deste exemplo. Então para deixar o arquivo o mais puro, o deixei dessa forma:

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

#include "LPC17xx.h"

#define configUSE_PREEMPTION           1
#define configUSE_IDLE_HOOK            0
#define configMAX_PRIORITIES           ( 5 )
#define configUSE_TICK_HOOK            0
#define configCPU_CLOCK_HZ             ( ( unsigned long ) SystemCoreClock)
#define configTICK_RATE_HZ             ( ( TickType_t ) 1000 )
#define configMINIMAL_STACK_SIZE       ( ( unsigned short ) 80 )
#define configTOTAL_HEAP_SIZE          ( ( size_t ) ( 19 * 1024 ) )
#define configMAX_TASK_NAME_LEN        ( 12 )
#define configUSE_TRACE_FACILITY       1
#define configUSE_16_BIT_TICKS         0
#define configIDLE_SHOULD_YIELD        0
#define configUSE_CO_ROUTINES          0
#define configUSE_MUTEXES              1
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
#define configUSE_COUNTING_SEMAPHORES     0
#define configUSE_ALTERNATIVE_API         0
#define configCHECK_FOR_STACK_OVERFLOW    0
#define configUSE_RECURSIVE_MUTEXES       1
#define configQUEUE_REGISTRY_SIZE         10
#define configGENERATE_RUN_TIME_STATS     0

#define INCLUDE_vTaskPrioritySet          1
#define INCLUDE_uxTaskPriorityGet         1
#define INCLUDE_vTaskDelete               1
#define INCLUDE_vTaskCleanUpResources     0
#define INCLUDE_vTaskSuspend              1
#define INCLUDE_vTaskDelayUntil           1
#define INCLUDE_vTaskDelay                1
#define INCLUDE_uxTaskGetStackHighWaterMark    1

/* Use the system definition, if there is one */
#ifdef __NVIC_PRIO_BITS
#define configPRIO_BITS       __NVIC_PRIO_BITS
#else
#define configPRIO_BITS       5        /* 32 priority levels */
#endif

/* The lowest priority. */
#define configKERNEL_INTERRUPT_PRIORITY     ( 31 << (8 - configPRIO_BITS) )
/* Priority 5, or 160 as only the top three bits are implemented. */
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY     ( 5 << (8 - configPRIO_BITS) )

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names - or at least those used in the unmodified vector table. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
#endif /* FREERTOS_CONFIG_H */

Em um post futuro, eu comento mais sobre este arquivo e suas linhas.

Agora se compilarmos o código, provavelmente não terá erros e significa que você integrou o FreeRTOS com sucesso e não deixou nenhuma referencia fora.

Para testar, vamos fazer a seguinte modificação na função do main (que está no arquivo .c com o nome do projeto). Os códigos seguintes foram obtidos em http://sergioprado.org/mbed-integrando-o-freertos-em-um-cortex-m3/ e foram modificados um pouco.

/* Inicializa o Clock */
SystemCoreClockUpdate();

/* No caso, esse será o led que piscará... */
LPC_GPIO0->FIODIR |= (1<<19);

/* create task to blink led */
xTaskCreate(blinktask, &quot;Blink&quot;, configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);

/* Start the scheduler. */
vTaskStartScheduler();

/* should never reach here! */
for(;;);

Adicione as bibliotecas para que as funções do FreeRTOS sejam referenciadas no .c:

#include "FreeRTOS.h"
#include "task.h"

Para finalizar, entre a declaração das bibliotecas e a função main, adicione a função (tarefa) que piscará o LED.

void blinktask(void *pvParameters)
{
  while(1)
  {
    LPC_GPIO0->FIOSET = (1<<19);
    vTaskDelay(500/portTICK_RATE_MS);
    LPC_GPIO0->FIOCLR = (1<<19);
    vTaskDelay(500/portTICK_RATE_MS);
  }
}

Ao compilar e executar no seu LPC1768, o LED no pino P0.19 piscará!

No mais… Até!

Um comentário em “Criando um projeto no LPCxpresso com FreeRTOS do Zero

    […] um Workspace já pronto para trabalhar com FreeRTOS. Como montar tal sistema inicial pode ser visto aqui neste blog. Depois, baixe o arquivo fonte com a pilha FatFs na pagina oficial do projeto AQUI (A versão usada […]

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s