A maior rede de estudos do Brasil

Grátis
256 pág.
Descobrindo o STM32

Pré-visualização | Página 45 de 47

bastante
longos utilizando DMA. Por exemplo, podemos usá-lo para transferir blocos
de dados para a FatFS. Em um ambiente multi-thread, é desejável que DMA
continue em segundo plano. Na nossa implementação atual usamos “busy
waiting” (espera ocupada) para a DMA completar.
while (DMA_GetFlagStatus(dmaflag) == RESET) { ; }
Tal como acontece com o código UART, esta busy waiting (espera
ocupada) pode ser substituída por um bloqueio do thread iniciando a operação
de DMA sobre um objeto de sincronização (neste caso um semáforo binário
Revision: (None) ((None)) 241
CAPÍTULO 16. SISTEMAS OPERACIONAIS DE TEMPO-REAL
é adequado) e utilizando um manipulador de interrupção para desbloquear o
thread (como mostrado a seguir).
242 Revision: (None) ((None))
16.6. FATFS
static void vExampleInterruptHandler( void )
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
// handle interrupt
...
// release semaphore
xSemaphoreGiveFromISR( xBinarySemaphore ,
↪→&xHigherPriorityTaskWoken);
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
}
No Capítulo 13, mostramos como criar manipuladores de interrupção
DMA. Para a interface SPI precisamos habilitar as interrupções para o caso
de “transferencia completa”.
Exercise 16.4 Multithreaded SPI
Crie uma interface SPI que suporte multi-threading e DMA. Você deve
usar retornos de chamada (callbacks) para a seleção de dispositivo. Teste a
sua interface com o LCD com duas threads concorrentes para usar a interface
para desenhar retângulos coloridos em locais aleatórios (cores diferentes para
os dois threads).
16.6 FatFS
O código FatFS tem algum suporte nativo para multi-thread, que deve
ser ativado no ffconf.h.
#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */
#define _FS_TIMEOUT 1000 /* Timeout period in unit of ticks */
#define _SYNC_t HANDLE /* O/S dependent type of sync object */
Cabe ao usuário definir um tipo de _SYNC_t adequada e fornecer imple-
mentações para ff_req_grant, ff_rel_grant, ff_del_syncobj e ff_cre_syncobj.
Também é necessário modificar a interface do dispositivo de baixo nível para
utilizar uma interface SPI modificada e para substituir a busy waiting com
funções de atraso do RTOS adequadas.
Exercise 16.5 Multithreaded FatFS
Revision: (None) ((None)) 243
CAPÍTULO 16. SISTEMAS OPERACIONAIS DE TEMPO-REAL
Reescreva a interface de baixo nível da FatFS para usar a nova interface
SPI e remover a busy waiting – suas alterações devem funcionar tanto em um
único ambiente de thread quanto emmulti-threaded (use o flag _FS_REENTRANT
adequadamente!) Teste o seu código com um programa multi-thread que re-
produz arquivos de áudio e mostra imagens a partir de um cartão SD. Um
thread deve reproduzir um arquivo de áudio, enquanto outro exibe uma ima-
gem.
16.7 FreeRTOS API
A API do FreeRTOS está documentado em www.freertos.org. Aqui
nós identificamos as principais funções da API utilizadas ao longo deste capí-
tulo.
244 Revision: (None) ((None))
16.8. DISCUSSÃO
Task Creation
xTaskCreate() Create task
xTaskDelete() Delete task
Task Utilities
vTaskDelay() Delay from now
vTaskDelayUntil() Delay from previous wake time
Kernel Utilities
taskYIELD() Force a context switch
vTaskSuspendAll() Prevent current task from being preempted
vTaskResumeAll() Resume normal scheduling
Queues
uxQueueMessagesWaiting() Number of messages in queue
xQueueCreate() Create queue
xQueueDelete() Create queue
xQueueSend() Send to queue
xQueueReceive() Receive from queue
xQueueSendFromISR() ISR send to queue
xQueueReceiveFromISR() ISR Receive from queue
Sempahore
vSemaphoreCreateBinary() Create a binary semaphore
vSemaphoreCreateCounting() Create a counting semaphore
vSemaphoreCreateMutex() Create a mutex
vSemaphoreCreateTake() Take from semaphore
vSemaphoreCreateGive() Give to semaphore
vSemaphoreCreateGiveFromISR() Give from ISR to semaphore
Tabela 16.1: FreeRTOS API – Key Calls
16.8 Discussão
O desenvolvimento de um projeto com FreeRTOS é muito trabalhoso!
Todas as interfaces de dispositivo têm que ser escritas para suportar multi-
thread e grande cuidado tem que ser tomado para assegurar a ausência de
condições de corrida. Uma alternativa é usar um RTOS com uma camada de
abstração de hardware, como Chibios onde grande parte do trabalho pesado
já foi feito para você.
Você provavelmente também descobriu que a depuração do código
multi-thread é muito desafiador. A mensagem é clara –- use threads somente
Revision: (None) ((None)) 245
CAPÍTULO 16. SISTEMAS OPERACIONAIS DE TEMPO-REAL
quando realmente necessário.
246 Revision: (None) ((None))
Capítulo 17
Próximos Passos
Nos capítulos anteriores você aprendeu muitas das habilidades básicas
necessárias para construir projetos interessantes que utilizam processadores
STM32 e módulos comerciais. Neste capítulo, eu forneço referências para di-
versos módulos e orientações adicionais para saber como as habilidades que
você aprendeu podem ser aplicadas para desenvolver o código para fazer inter-
face com eles. Até agora, deveria ser evidente que a SRAM é uma limitação
importante do processador da STM32 VL Discovery. Ambos newlib e FreeR-
TOS precisam de muito mais memória para operar e projetos grandes podem
se beneficiar muito com a camada adicional de abstração fornecida por essas
bibliotecas. Assim, eu começo com uma discussão de placas que fornecem
os processadores STM32 com memórias maiores. Deve também ser evidente
agora que a utilização de um LCD com base em SPI, ao mesmo tempo sufi-
ciente para displays básicos não atendem as necessidades de performance de
gráficos complexos; desempenhos superiores são conseguidos à custa de uma
nova interface.
As interfaces que você aprendeu podem ser aplicadas a uma ampla vari-
edade de novo sensores incluindo climáticos (temperatura/pressão/umidade),
posição e inercial (acelerômetro/giroscópio/magnetômetro/GPS), força (sen-
sores de flexibilidade) – vou discutir alguns deles, mas um passo útil é exami-
nar as ofertas de empresas como a SparkFun embora salientando as interfaces
que seus módulos exigem. A interface serial básica permite a utilização de
vários dispositivos de comunicação sem fios, incluindo bluetooth, wifi, e GSM
(telefone celular) enquanto a interface SPI permite o uso de dispositivos de
rádio de baixa potência. Finalmente os temporizadores fornecem a chave para
o controle de movimento, incluindo motor de passos e controle DC com o
feedback de posição.
Revision: (None) ((None)) 247
CAPÍTULO 17. PRÓXIMOS PASSOS
Este capítulo destina-se principalmente para mostrar o mundo de novas
habilidades adquiridas – não como um guia definitivo para interfaceamento e
utilização de novos módulos; esse trabalho é com você.
17.1 Processadores
O micro-controlador STM32 F100 usado na VL Discovery Board é um
membro de uma série de componentes STM32 F1xx que inclui:
• Value line STM32 F100 – 24 MHz CPU com controle de motor e funções
CEC
• Access line STM32 F101 – 36 MHz CPU, até 1 MByte Flash
• USB Access line STM32 F102 – 48 MHz com sistema de arquivos USB
• Performance line STM32 F103 – 72 MHz, até 1 Mbyte Flash com con-
trole de motor, USB e CAN
• Connectivity line STM32 F105/STM32 F107 – 72 MHz CPU com Ether-
net MAC, CAN e USB 2.0 OTG
Todas estas famílias de componentes utilizam as mesmas bibliotecas
padrão de periféricos. Elas exigem modificações no script do linker (parti-
cularmente as definições de regiões de memória) e código de inicialização (as
definições dos vetores de exceções); entretanto nenhuma das tarefas é difícil.
Eles também incluem periféricos que você ainda não viu, incluindo suporte
para memória externa (FSMC), uma interface de alto nível para SD (SDIO)
e interfaces de comunicação com USB, Ethernet e CAN. As interfaces de co-
municação em geral, exigem significativas bibliotecas de software adicionais e
podem ser muito

Crie agora seu perfil grátis para visualizar sem restrições.