quarta-feira, 20 de junho de 2012

Arquitetura do ESCoRT

A abordagem do ESCoRT para obter um bom nível de portabilidade é manter ao máximo o software modularizado, de forma que os módulos que interagem com o hardware possuam interfaces bem definidas, e qualquer alteração na plataforma de hardware só necessita modificar estes módulos. Outro fato é que, no campo de software embarcado, uma das grandes barreiras para a portabilidade e reuso dos códigos são os diversos compiladores existentes frequentemente apresentarem divergência em alguns pontos da sintaxe. A fim de atacar este problema, a metodologia do ESCoRT contempla uma forma de abstrair qual o compilador utilizado no projeto por meio de uma interface padronizada. Isso não quer dizer que todos os componentes implementados com o ESCoRT sejam independentes do compilador. Entretanto, o código é organizado de forma a isolar toda implementação específica de um determinado compilador, abstraindo esta dependência dos outros componentes.
Além do uso de interfaces padronizadas, o seccionamento do código segundo a sua função dentro dos sistemas embarcados também tem uma participação fundamental na forma como o ESCoRT lida com os problemas de portabilidade e reuso, mencionados acima. Separar fluxo de controle do fluxo de dados mostrou-se essencial para alcançar um alto grau de reuso.
A arquitetura que apoia o ESCoRT utiliza o padrão de projetos Layered Pattern , organizando o software embarcado em camadas. O foco principal da arquitetura é promover a portabilidade, dividindo os componentes de acordo com sua função na plataforma embarcada.




HAL

Esta sigla significa Camada de Abstração de Hardware (Hardware Abstraction Layer) e é um conceito muito comum no campo de sistemas operacionais. Tem a finalidade de abstrair as especificidades de hardware de uma plataforma. Já que os diferentes microcontroladores possuem vários periféricos em comum, esta camada tem a função de fornecer uma API padronizada para estes periféricos. Dessa forma as camadas superiores podem ser independentes do hardware que está sendo utilizado. Um componente HAL é implementado herdando as características de um componente abstrato. Por exemplo: o componente nxp.lpc2368.hal.SPI herda de escort.hal.ISPI , que é abstrato e apenas define a interface padrão da SPI.


Kernel

A função desta camada não é criar uma interface padrão para todos os kernels, diferentemente da camada HAL. A ideia é encapsular esta parte do sistema e assim facilitar o reuso. A fim de promover uma maior modularidade, esta camada tem uma subdivisão, chamada Kernel Port . Os componentes que se encaixam nesta classificação implementam a parte do kernel que é dependente do processador e do compilador utilizados. Dessa forma, é possível, por exemplo, trocar de microcontrolador sem precisar criar outro componente Kernel.


Driver

Esta camada, assim como a camada HAL, provê uma abstração de hardware. Entretanto, os drivers assumem um papel de controle de acesso dos dados, realizando os tratamentos de interrupção e implementando os protocolos de acesso aos dispositivos de hardware. Os componentes HAL, por sua vez, apenas fazem alteração e leitura de dados nos periféricos. Dessa forma, se o sistema precisar mudar de processador, somente a camada HAL precisará ser alterada, uma vez que a lógica de controle dos dados continuará a mesma. Um componente Driver é construído com base na API da camada HAL e por isso não depende de um hardware específico. Um driver também pode fazer uso de outro driver , como é o caso do componente atmel.memory.serialflash.driver.AT45DB que utiliza um componente do tipo escort.driver.ISPI para acessar a interface SPI do chip de memória. Além disso, alguns componentes Driver necessitam de serviços do kernel para controlar a sincronização de acesso aos dados. Por exemplo, o componente freertos.driver.UARTDriver utiliza o serviço de fila do componente freertos.kernel.FreeRTOSKernel para armazenar os bytes que são recebidos pela interface da UART.


Service

Existem certas funcionalidades numa plataforma de software que estão além do controle de dispositivos de I/O. Tais funcionalidades normalmente são serviços compartilhados entre as tarefas do sistema e disponibilizados pelo sistema operacional, como File System e TCP/IP. Estes serviços são reusados em diversas aplicações e por este motivo foi criada a camada Service. Os componentes desta camada utilizam os componentes da camada Driver ou acessam diretamente componentes da camada HAL. Este último caso pode ser ilustrado por um serviço de piscagem de LED, que precisa apenas ligar e desligar um pino do processador. Essa funcionalidade não requer a complexidade de um driver para manipular o status de um pino, um componente do tipo escort.hal.IGPIOPin é suficiente para implementar este componente Service. Alguns serviços precisam executar uma tarefa para prover a funcionalidade a que se destinam. Um exemplo é o componente service.GPS, que precisa ler as informações de posicionamento periodicamente enviadas pelo dispositivo de GPS e atualizar as variáveis de latitude e longitude correntes. Neste caso a tarefa criada pelo componente deve ser escalonada junto com as tarefas da aplicação.


Application

Esta camada contém os componentes da aplicação embarcada propriamente dita. O desenvolvedor implementa as funcionalidades do sistema embarcado tendo como base a plataforma constituída pelos componentes das camadas subjacentes.

Nenhum comentário:

Postar um comentário