Sunteți pe pagina 1din 4

Com este relatrio pretende-se descrever o desenvolvimento de uma aplicao com o FreeRtos que permita ler dados de temperatura,

e envi-los para um computador atravs de uma comunicao srie. A aplicao ser constituda por 4 tarefas, sendo elas, prvLcdTask, prvFlashTask, prvUSARTTask e gettemp, tendo cada uma o seu propsito: prvLcdTask

Esta tarefa ser responsvel por mostrar no display o valor livre de memria da tarefa em questo, o nmero de tarefas, mostrar o tempo entre dados enviados pela USART e por fim mostrar o nmero de itens na fila de mensagens que possui o valor da temperatura. prvFlashTask

Tarefa que ser responsvel pela alterao do estado de um led de segundo em segundo. prvUSARTTask

Responsvel pela leitura da temperatura presente numa fila de mensagens, seguido do envio pela comunicao serie. Colocar numa fila de mensagens o valor do tempo entre envios de dados pela USART. gettemp

Ter como funo obter os dados da temperatura e coloc-los em duas filas de mensagens. Filas que sero usadas para as tarefas da usart e do lcd lerem os valores das temperaturas.

Desenvolvimento: Comeou-se por criar as 4 tarefas enunciadas acima, tendo cada uma delas um nvel de prioridade diferente, assim sendo por ordem decrescente de prioridade temos, gettemp, prvUSARTTask, prvLcdTask e prvFlashTask. A preemptividade no ficheiro

FreeRtosConfig.h mantida a 1 para ser possvel a tarefas de maior prioridade interromper tarefas de menor prioridade.

De seguida foram criadas trs filas de mensagens, uma para serem colocados os valores das temperaturas adquiridas, xQueue, para posteriormente os valores serem lidos na tarefa da usart, outra fila de mensagens xQueue_tempLCD, aonde vo ser colocados os mesmos valores de temperatura mas agora estes vo ser lidos pela tarefa do lcd, e por ltimo outra fila de mensagens, aonde vo ser colocados os valores do tempo entre envios de dados feitos pela USART. Ambas recebero valores inteiros e asseguram a colocao de 10 valores em cada uma. Gettemp

Para obter o valor da temperatura usado o ADC para fazer a converso. De modo a evitar o uso de pooling de variveis criado um semforo binrio xSemaphoreconversao, este semforo ser responsvel pelo sincronismo entre incio e fim de converso do ADC mas tambm no permitir que o CPU espere pelo fim de converso do ADC. Dado o start de converso feito de seguida o Take ao semforo, sendo feito o Give do semforo na interrupo do ADC. Para o CPU no ficar encravado esta tarefa de maior prioridade fornece a sua prioridade a uma tarefa de menor prioridade que queira executar algo permitindo assim o no encravamento. Aps feita a converso e guardado o valor obtido colocado o valor nas duas filas de mensagens, xQueue e xQueue_tempLCD, para posteriormente as tarefas da USART e do LCD lerem destas fila de mensagens os valores. prvUSARTTask

No incio esta tarefa vai ler valor a valor da temperatura presente na fila de mensagens, xQueue, e enviar cada valor para a funo USART2_sendmessage() que ter como funo enviar os valores pela porta serie. Entretanto tambm feito o clculo do tempo de envio entre envio de dados, sendo posteriormente colocados na fila de mensagens xQueue_timestamp, para posteriormente a tarefa prvLcdTask, ler estes valores e mostrar no display. prvFlashTask

Dentro desta tarefa temos um vTaskDelayUntil com 1 segundo. O que significa que sempre que esta tarefa seja executada haver uma espera de um segundo, mesmo que durante essa espera outra tarefa interrompa esta, o cpu sabe que tem que fazer a contagem. Passado 1 segundo feito o toogle ao led vermelho.

prvLcdTask

A funo uxTaskGetStackHighWaterMark(), d-nos o valor livre da stack, que a tarefa no utiliza, sendo posteriormente o valor mostrado no display. A funo

uxTaskGetNumberOfTasks() indica-nos o numero de tarefas que o cpu tem para executar. Depois lido o valor da fila de mensagens xQueue_timestamp, o valor do tempo entre envios feito pela USART e mostrado no dsiplay. So lidos os valores da temperatura inseridos na fila de mensagens xQueue_tempLCD e mostrar no display.

Dados Mostrados no Display Temperatura: 33,4 Quantidade: 9 Tempoenvios: 500 ms N Tarefas: 5 Stack_lcd: 568 De salientar que tentei obter o valor livre de memria de cada tarefa mas a partir da tarefa do lcd, para posteriormente preencher uma estrutura de dados e enviar para uma fila de mensagens, sendo estes valores lidos pela tarefa da usart e enviados pela comunicao serie. Mas no obtive sucesso. Contudo fica registado o valor de memoria livre de cada tarefa obtido em cada tarefa atravs da funo uxTaskGetStackHighWaterMark(). Stack_led: 352 Stack_usart: 248 Stack_adc: 336

O nmero de tarefas so 5 visto serem 4 tarefas mais a tarefa de idle que para qunado o cpu no tem nada para executar. O numero de itens na fila de mensagens varia consoantes o tempo entre converses do adc.

S-ar putea să vă placă și