Quem não conhece o sistema operacional de tempo-real FreeRTOS? Se você nunca teve contato com ele, aconselho que o faça! Quando usar um sistema operacional de tempo-real num projeto é uma questão muito subjetiva. Sendo um projeto simples, em que o overhead apresentado por um RTOS é considerável, usar uma solução bare-metal pode ser a melhor escolha. Já em sistemas mais complexos, em que muitas tarefas devem ser executadas, tal como gerenciamento de interfaces externas, memórias, interação com o usuário, etc, o uso de um kernel torna-se aconselhável, para não dizer necessário.
Para aqueles que nunca trabalharam com um sistema operacional de tempo-real, digo que desenvolver um projeto que faça uso desse tipo de serviço traz consigo um pacote de vantagens, tais como:
- Abstração de tempo: o kernel é responsável por executar as tarefas no devido tempo, sem que a aplicação se preocupe com isso;
- Manutenabilidade, escalabilidade e modularização: cada uma das tarefas criadas pela aplicação é executada isoladamente e, dessa forma, tem a responsabilidade de gerenciar os recursos do seu respectivo módulo;
- Planejamento de tarefas de uma equipe: uma vez que os módulos do projeto são muito bem definidos, há a necessidade de se estabelecer a interface entre eles. Uma vez que essas atividades são definidas no projeto, ele pode ser alocado entre diferentes membros da equipe e ser desenvolvido em paralelo;
- Facilidade em realização de testes: os testes de um módulo são mais fáceis de serem executados dado que a sua interface esteja muito bem definida.
Muitas outras vantagens podem ser listadas, mas vou focar aqui nas mudanças apresentadas pela nova versão do FreeRTOS, a 8.2.0. Para fazer o seu download, acesse aqui.
Mudanças
Dentre as mudanças realizadas no kernel, podemos destacar:
- Adição de mais um serviço de comunicação entre tarefas (Inter-task Communication), chamado RTOS Task Notifications;
- Foi criado o arquivo de cabeçalho FreeRTOS/Source/include/deprecated_definitions.h.
A grande mudança fica por conta do RTOS Task Notifications, criando uma nova alternativa para comunicação de eventos e dados entre as tarefas. Mais detalhes das mudanças feitas podem ser encontrados aqui.
Foi criada uma nova API para esse serviço:
- xTaskNotifyGive();
- vTaskNotifyGiveFromISR();
- ulTaskNotifyTake();
- xTaskNotify();
- xTaskNotifyFromISR();
- xTaskNotifyWait().
O kernel agora disponibiliza para cada tarefa criada um valor de 32 bits, chamado de "notification value", que é inicializado com o valor zero quando a tarefa é criada. A função base xTaskNotify() pode ser utilizada para gerar eventos (notification value) para uma segunda tarefa. A tarefa que recebe o novo valor é removida do estado bloqueado, e o que ela faz com esse dado fica a cargo dela, podendo ser uma das seguintes opções:
- Atualizar o seu "notification value" interno;
- Incrementar o valor do seu "notification value";
- Setar um ou mais bits do seu "notification value";
- Decidir por deixar o seu "notification value" inalterado.
Essas ações são estabelecidas pela função xTaskNotifyWait(), que fica aguardando, dentro de uma tarefa, um evento de uma outra tarefa. Dessa forma esse meio de comunicação pode assumir características de message queue e event group. Além disso, é possível usar esse novo tipo de notificação como semáforos binários e semáforos contadores. Para isso pode-se usar as funções xTaskNotifyGive(), vTaskNotifyGiveFromISR() e ulTaskNotifyTake().
Mas qual a grande vantagem desse novo meio de comunicação entre tarefas? De acordo com o pessoal da Real Time Engineers Ltd. existem duas grandes vantagens:
- Proporciona flexibilidade ao design do projeto, já que task notifications pode ser utilizado onde antes tinha que ser criada uma fila de mensagem, um semáforo binário, um semáforo contador ou um event group;
- Tirar uma tarefa do estado bloqueado por meio de task notification é 45% mais rápido e usa menos memória RAM que realizar a mesma tarefa usando um semáforo binário, por exemplo.
O arquivo de cabeçalho deprecated_definitions.h foi adicionado para não ser usado! Pois é, está lá só para compilar projetos antigos. Não façam uso das definições contidas nesse arquivo! Vejam os comentários contidos no arquivo portable.h do kernel:
1 2 3 4 5 6 7 8 9 10 11 | /* Each FreeRTOS port has a unique portmacro.h header file. Originally a pre-processor definition was used to ensure the pre-processor found the correct portmacro.h file for the port being used. That scheme was deprecated in favour of setting the compiler's include path such that it found the correct portmacro.h file - removing the need for the constant and allowing the portmacro.h file to be located anywhere in relation to the port being used. Purely for reasons of backward compatibility the old method is still valid, but to make it clear that new projects should not use it, support for the port specific constants has been moved into the deprecated_definitions.h header file. */ #include "deprecated_definitions.h" |
Teremos mais artigos no Embarcados envolvendo o uso do FreeRTOS em projetos. E aí, gostaram dessa nova feature do FreeRTOS?
Referências
http://www.freertos.org/index.html
http://sourceforge.net/projects/freertos/files/latest/download?source=files
http://www.freertos.org/RTOS-task-notifications.html
http://www.freertos.org/History.txt
Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.
Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Estou usando intensamente o FreeRTOS em dois projetos que estou tocando. A flexibilidade e reusabilidade que ele coloca no código fonte é tremenda.
Todos os pontos elencados por você no artigo, em relação ao aumento da produção e qualidade de código, foram também observados por mim durante o desenvolvimento dos projetos.
Agora, sobre estas novas implementações do FreeRTOS na nova versão: achei fantástico.
O ruim é que vou acabar investindo um tempo para entender como funciona tudo isso... hehehe
Pois é Rafael, tem vindo novidades nesse kernel, e a tendência é crescer mais. É difícil manter o passo!! Essa última é como um canivete suiço, multi-utilizadades rs.
Abraços