• Nenhum resultado encontrado

Controlador de Interrupções

O controlador de interrupções implementado é responsável por gerir os eventos de interrupções externas conforme o seu modo de configuração. O processador presente na plataforma de desenvolvimento utilizada nesta dissertação integra um controlador de interrupções (NVIC) e este controlador foi descartado por o sistema não ter controlo sobre as ações deste, pois os pedidos de interrupção iriam sempre interromper o processador para que estes fossem atendidos mesmo que uma tarefa de alta prioridade estivesse em execução e esta característica é um ponto negativo detetado ao sistema, então para o sistema poder assumir total controlo sobre as interrupções houve a necessidade da implementar um controlador de interrupções dedicado e como definido nos objetivos desta dissertação todos os serviços devem seguir a metodologia implementada pelo sistema operativo sendo então necessário compreender como o FreeRTOS lida com as interrupções.

As tarefas realizadas dentro da handler de um interrupção devem ser o mais re- duzido possível, pois o processamento de uma interrupção inibe o processamento de outras interrupções que possam vir a ocorrer e é neste ponto que o FreeRTOS atua, pois ele oferece mecanismos de sincronização desenvolvidos especificamente para serem usados nestas ocasiões, de forma a prevenir situações indesejáveis. No uso de interrupções neste sistema operativo é aconselhável a que apenas o essencial seja executado dentro da interrupção e que o restante processamento seja deferido para uma tarefa correspondente ao tratamento da interrupção e para pôr isto em prática recorre-se a um dos mecanismos presentes nele, sendo os semáforos biná- rios o mecanismo de sincronização mais usado neste sistema operativo e este pode ser usado para desbloquear uma tarefa quando uma interrupção acontecer, sincro- nizando a interrupção com a tarefa, e seguindo esta metodologia de tratamento às interrupções definiu-se para este controlador de interrupções a mesma, ou seja, todas as interrupções terão uma tarefa associada.

Como caraterísticas iniciais este controlador de interrupções apenas suportará até 8 interrupções externas e o trigger para as gerar será cingido apenas às transições de flanco positivo ou negativo. O controlador de interrupções ao invés de interromper diretamente o processador com um pedido de interrupção, esse pedido é feito ao gestor de tarefas de hardware que irá posteriormente indicar ao escalonador para colocar a tarefa previamente assinada como sendo o handler da interrupção externa na lista de tarefas prontas para execução, com isto a tarefa associada à interrupção ficará a aguardar a sua execução na lista de tarefas prontas deste modo todas as

interrupções são tratadas como tarefas normais.

A Figura 5.19 mostra o desenho do controlador de interrupções.

Interupt Controller

Int_Cont_En Interrupt_n Edge_Trigger Interrupt_En Lo gic C o n tr o lle r IRQ Task_Id IRQ_Task_Id IRQ_0 IRQ_1 IRQ_2 IRQ_3 IRQ_4 IRQ_5 IRQ_6 IRQ_7 Task Addr Interrupt Priority Edge_Trigger Register Interrupt Enable Register

Task Addr Interrupt Priority Task Addr Interrupt Priority Task Addr Interrupt Priority Task Addr Interrupt Priority Task Addr Interrupt Priority Task Addr Interrupt Priority Task Addr Interrupt Priority

Figura 5.19: Visão geral do controlador de interrupções

Este controlador como dito anteriormente tem a capacidade de lidar com até oito interrupções externas e para configurar estas interrupções existem quatro registos implementados para esse propósito, sendo o primeiro registo é de habilitação das interrupções externas (Interrupt Enable Register), este é um registo composto por 8bits, onde cada bit é associado a uma das oito interrupções externas implementa- das no controlador. O registo Edge_Trigger, como o nome indica, é o responsável pela associação do tipo trigger que irá disputar a interrupção, podendo este ser definido para transição flanco positivo ou flanco negativo e os dois últimos regis- tos de configuração são os que indicam a prioridade da interrupção e o endereço da tarefa assinada como handler da interrupção, Interrupt Priority e Task Addr, respetivamente.

As prioridades das interrupções podem variar de 0 a 255 e quanto mais alto for o valor correspondente à interrupção maior será a sua prioridade e no caso da disputa de duas ou mais interrupções simultâneas que apresentarem o mesmo valor de prioridade o desempate destas é feito pela posição destas no vetor de interrupções, sendo a interrupção na primeira posição do vetor com maior prioridade, ou seja, a interrupção externa 0 é a que apresenta maior prioridade em relação as restantes interrupções externas.

uma tarefa para ser o handler da interrupção e essa tarefa terá obrigatoriamente de ser assinada como tal. Quando uma interrupção externa habilitada é detetada, o controlador de interrupções sinaliza o gestor de tarefas de hardware com o identi- ficador da tarefa assinada como handler da interrupção e está será posteriormente desbloqueada e enviada para o escalonador de hardware como uma tarefa pronta para execução. Assim que o escalonador decidir que interrupção deverá ser aten- dida, envia para o CPU o endereço da tarefa registada como sendo o handler da interrupção.

Para configurar uma interrupção e assinar uma tarefa como o handler foi criada uma API que foi implementada dentro do módulo usado na API do gestor de tarefas, secção 5.5, e a Figura 5.20 mostra as funções implementadas para esse efeito, sendo todas elas de fácil compreensão não necessitando de explicação.

Figura 5.20: API - Controlador de Interrupções

Para a criação de um tarefa associada à interrupção houve a necessidade de adi- cionar à API de referencia do FreeRTOS uma nova função dedicada apenas à criação deste tipo de tarefas, sendo estas tarefas na mesma comuns às outras, foi então duplicada a função de criação de tarefas e foi acrescentado os parâmetros Interrupt_Config, IQRx e Trigger, e o nome também sofreu uma alteração, xTas-

kInterruptCreate, e um bloco da sua implementação para que esta tarefa não fosse

introduzida na lista de tarefas prontas mas sim nos registos do controlador de in- terrupções, a Figura 5.21 demonstra a definição da função alterada para a criação de tarefas com o propósito de serem o handler das interrupções.

Documentos relacionados