-
Aluno: Anderson Luiz de Souza Kmetiuk
-
Email: [email protected]
-
Professor: Paulo Denis Garcez da Luz
-
Email: [email protected]
-
Disciplina: ELF74 - Sistemas Embarcados
-
Ano: 2022
-
Semestre: 1
-
LEDs
- PN1 → LED 1
- PN0 → LED 2
- PF4 → LED 3
- PF0 → LED 4
-
Switchs
- PJ0 → SW1
- PJ1 → SW2
Configuração inicial da placa
- Deve-se ler uma tecla: Tecla_1 (PJ0/USR_SW1) para iniciar a contagem do tempo e enquanto a Tecla_1 não for pressionada nada acontece.
- O disparo do “tempo de jogo” deve ser feito pela Tecla_2 (PJ1/USR_SW2) somente após ter sido dado início do jogo na Tecla_1.
- Caso o tempo exceda de 3s, travar o uso da segunda tecla: Tecla_2 e indicar que o jogo acabou acendendo o LED:D4 (PF0).
- O programa pode deve reiniciar todo o processo caso a Tecla_1 (PJ0/USR_SW1) seja pressionada novamente, mesmo estando no estado do “tempo de jogo”.
- A reposta do “tempo de jogo” deve ser fornecida em "ms".
Integração de Assembly com C.
Um bitmap é composto por pixels dispostos na forma de uma matriz. Numa imagem em tons de cinza, cada pixel é representado por um valor numérico indicando o nível de luminosidade daquele pixel. Numa imagem em tons de cinza de 8-bits, cada pixel é representado por um valor de 8-bits, portanto de 0 (preto) até 255 (branco).
Um histograma é uma representação gráfica da distribuição de tons de uma imagem. O eixo horizontal apresenta os possíveis valores dos pixels (neste caso de 0 a 255) e o eixo vertical indica quantos pixels da imagem tem aquele valor.
Desenvolva uma função em assembly que constrói o histograma de uma imagem em tons de cinza com 8-bits por pixel.
- image width - número de pixels em uma linha da imagem.
- image height - altura da imagem em pixels.
- starting address - endereço do primeiro pixel da imagem.
- histogram - endereço inicial de um vetor de tamanho 256. Cada posição do vetor armazena um inteiro sem sinal de 16-bits. Este vetor não possui dados válidos quando a função é chamada. Ele é usado apenas para o retorno da função.
- O tamanho máximo da imagem é de 64K (65.536) pixels.
- A função retorna o valor 0 se o tamanho da imagem for superior a 64K.
- Inteiro sem sinal de 16 bits indicando o número de pixels processados.
- Saída em CSV (comma-separated values)
- Como a tiva não tem suporte para arquivos os valores são gerados no console e são copiados manualmente para um arquivo .csv
uint16_t EightBitHistogram(uint16_t width, uint16_t height, uint8_t * p_image, uint16_t * p_histogram);
const uint8_t image0[HEIGTH0][WIDTH0] = {
{ 20, 16, 16, 18}, {255, 255, 0, 0}, {32,32,32,32}
};
; -------------------------------------------------------------------------------
PUBLIC EightBitHistogram
SECTION .text : CODE (2)
THUMB ; Instruções do tipo Thumb-2
; -------------------------------------------------------------------------------
EXPORT EightBitHistogram ;exportar a função pro c
; -------------------------------------------------------------------------------
- R0 → width
- R1 → height
- R2 → endereço/ponteiro da imagem
- R3 → endereço/ponteiro do histograma
MOV R4, R3
BX LR
A Comunicação Serial é muito utilizada para permitir aos microcontroladores um canal de envio e recepção de dados com outros dispositivos. Não é uma comunicação considerada de alta velocidade, quando se compara aos padrões SPI e Ethernet. Porém, é de fácil utilização e configuração de hardware.
Programar um protocolo serial simples, sem paridade, checksum, C.R.C. e criptografia. Este protocolo foi desenvolvido para comandar 04 x Relés na placa do Kit TIVA EK-TM4C1294XL. Simular os Relés nos 4 leds da placa: LED1 (PN1), LED2 (PN0), LED3 (PF4) e LED4 (PF0). O LED ligado significa Relé ligado e LED desligado significa Relé desligado. O programa deve ser no estilo “Super Loop”. Deve ficar em loop infinito sempre que receber um pacote válido na serial, deve atuar no hardware.
# | Tipo | Número do LED | Estado (0: apagado / 1: ligado) |
---|
Comando | Resposta | Resultado |
---|---|---|
#R10 | @R10 | Desliga LED 1 |
#R11 | @R11 | Liga LED 1 |
#R20 | @R20 | Desliga LED 2 |
#R21 | @R21 | Liga LED 2 |
#R30 | @R30 | Desliga LED 3 |
#R31 | @R31 | Liga LED 3 |
#R40 | @R40 | Desliga LED 4 |
#R41 | @R41 | Liga LED 4 |
#RTX0 | @TX0 | Desliga tudo |
#RTX1 | @TX1 | Liga tudo |
- Duas Threads: “TLed1” e “TLed2”;
- Na TLed1 construir um código simples para que o Led1 da placa pisque a 1s.
- Na TLed2 construir um código simples para que o Led2 da placa pisque a 2s.
Criar um conjunto de 3 tarefas com temporizações conhecidas e experimentar variações de algoritmos de escalonamento no ThreadX.
1. Elabore uma rotina em C que fica num loop com número definido de execuções, acendendo e apagando um led específico. Os parâmetros de rotina são o número de loops (inteiro de 32 bits) e o identificador do led a ser acionado. Quando o led acender, apenas o led indicado deve ser aceso. Quando o led apagar, todos os leds da placa devem ser apagados.
Obs: cuide para que esta rotina seja “thread-safe”, ou seja, seja tolerante a reentrância. Não use variáveis globais nem chame funções que não são “thread-safe”.
2. Obtenha o tempo de execução de cada loop desta rotina. Várias alternativas são possíveis para este passo, escolha uma destas alternativas:
- Examinando o código em assembly e calculando a duração do mesmo para uma frequencia de clock conhecida.
- Executando o loop diversas vezes e medindo o tempo com um temporizador (p.ex. Systick ou o próprio contador de ciclos disponível na IDE).
- Executanto o loop milhões de vezes e medindo o tempo com relógio.
Obs: sua medição não precisa ser superprecisa, pode ser aproximada.
3. Crie 3 threads com as características a seguir. O tempo da thread executando é dado pela função elaborada no passo 1. O tempo da thread suspensa é dada pela função sleep do ThreadX.
Tarefa | Prioridade | Tempo Exec. | Período | LED |
---|---|---|---|---|
T1 | Alta | 300 ms | 1 s | Led1 |
T2 | Média | 500 ms | 1.5 s | Led2 |
T3 | Baixa | 800 ms | 4 s | Led3 |
4. Execute estas tarefas com as alternativas de escalonamento indicadas a seguir. Relate o efeito que você observar na execução das tarefas pela visualização dos Leds. Em particular, observe se os períodos das tarefas estão sendo obedecidos em cada caso.
a) Escalonamento por time-slice de 50 ms. Todas as tarefas com mesma prioridade.
b) Escalonamento sem time-slice e sem preempção. Prioridades estabelecidas no passo 3. A preempção pode ser evitada com o “preemption threshold” do ThreadX.
c) Escalonamento preemptivo por prioridade.
d) Implemente um Mutex compartilhado entre T1 e T3. No início de cada job estas tarefas devem solicitar este mutex e liberá-lo no final. Use mutex sem herança de prioridade. Observe o efeito na temporização das tarefas.
e) Idem acima, mas com herança de prioridade.
Elaborar uma solução de controle em malha fechada para um sistema de 3 elevadores utilizando o simulador presente em:
A Solução deverá utilizar o ThreadX e conter pelo menos 3 threads.