O padrão CMSIS

- por Sergio Prado

Categorias: Hardware Tags: , ,

CMSIS é uma sigla para Cortex Microcontroller Software Interface Standard, um padrão criado pela própria ARM que define uma camada de abstração (API) de acesso ao hardware para processadores da linha Cortex-M.

Na prática, o CMSIS é um conjunto de arquivos “.c” e “.h” que possibilitam a criação de um BSP (Board Support Package) para microcontroladores da linha ARM Cortex-M. Desta forma, se você usar as funções definidas pelo padrão CMSIS na sua aplicação, poderá migrar mais facilmente para outros chips da mesma família. A curva de aprendizado também é menor, já que você não precisa aprender como usar diferentes APIs e bibliotecas fornecidas por fabricantes de chip, basta aprender a interface provida pelo CMSIS.

No momento em que escrevo este artigo, o padrão esta na versão 3 e é composto basicamente por 4 componentes:

  • CMSIS-CORE: interface principal com o core da CPU e com os periféricos do chip.
  • CMSIS-DSP: biblioteca com funções de ponto flutuante para a aplicação. Para os microcontroladores da linha M0 e M3, a implementação é toda por software. Já para os microcontroladores da linha M4, a implementação é otimizada para usar o DSP do chip e a unidade de ponto flutuante, caso seja um Cotex-M4F.
  • CMSIS-RTOS: interface para RTOS (sistema operacional de tempo real).
  • CMSIS-SVD: padrão de arquivos XML (SVD – System View Description) para descrever o sistema completo (microcontrolador e periféricos).

Que tal entender como isso funciona na prática?

USANDO O CMSIS

Para usar a camada CMSIS-CORE na sua aplicação, quatro arquivos são necessários:

  • startup_<device>.s: arquivo de inicialização, incluindo a rotina de reset, a configuração do stack pointer e a tabela de vetores de interrupção. Pode estar implementado em C ou assembly.
  • system_<device>.c e system_<device>.h: arquivos com rotinas genéricas de configuração do sistema (inicialização, clock, barramentos, etc).
  • <device>.h: arquivo de cabeçalho com definições de estruturas e constantes de acesso aos registradores da CPU e dos periféricos do chip.

Se o fabricante do chip que você esta usando não fornecer a implementação do CMSIS, você mesmo pode implementar baseado nos exemplos fornecidos pela ARM. É só baixar a última versão da especificação e pegar os templates, que estão organizados por core da CPU (M0, M3, M4, etc) e compilador (ARM, GCC, IAR, etc). Por exemplo, esta é a estrutura de arquivos que você vai precisar se for utilizar o CMSIS em um Cortex-M3 com o GCC:

Device/
├── ARM
    ├── ARMCM3
        ├── Include
        │   ├── ARMCM3.h
        │   └── system_ARMCM3.h
        └── Source
            ├── GCC
            │    ├── gcc_arm.ld
            │    └── startup_ARMCM3.S
            └── system_ARMCM3.c

Depois é só usar as funções disponibilizadas pelo padrão CMSIS na sua aplicação, incluindo:

  • NVIC_EnableIRQ()/NVIC_DisableIRQ() -> habilitar/desabilitar interrupções.
  • NVIC_SetPriority()/NVIC_GetPriority() -> configurar as prioridades das interrupções.
  • NVIC_SystemReset() -> Reiniciar a sistema.
  • SystemCoreClockUpdate() -> atualizar a variável global SystemCoreClock, que indica a velocidade atual do clock da CPU.
  • SysTick_Config() -> configurar o System Tick.
  • __enable_irq()/__disable_irq() -> habilitar/desabilitar todas interrupções.
  • __get_CONTROL()/__set_CONTROL/__get_IPSR()/__get_APSR()/etc -> acesso aos registradores da CPU.

Na camada de DSP o padrão disponibiliza mais de 60 rotinas comuns usadas em aplicações de processamento de sinal, incluindo operações em vetores, seno, cosseno, diversas funções de filtro, operações em matrizes, FFT, e por aí vai.

E na camada de RTOS temos uma API de abstração para rotinas comuns em sistemas operacionais de tempo real, como gerenciamento de threads, semáforos e queues. No momento, existem apenas duas implementações para esta camada, uma para o RTX kernel da Keil/ARM, e outra para a plataforma mbed.

E OS FABRICANTES?

A idéia do padrão CMSIS é boa, mas existe uma variação muito grande entre as implementações dos fabricantes de chip. A NXP me parece ter um suporte bom para o CMSIS, fornecendo a implementação da versão 2 do padrão para seus principais chips. A Texas também possui uma implementação para os chips da linha Stellaris, só que ainda na versão 1. Os desenvolvedores de IDEs como a Keil e a IAR também parecem ter uma boa integração com o padrão para determinados chips. Já a ST, Atmel e Freescale não possui uma implementação oficial, apesar de ser possível encontrar projetos alternativos na Internet.

Na prática, se você pretende desenvolver seu novo projeto com um microcontrolador da linha ARM Cortex-M, vale a pena analisar a possibilidade de usar o padrão CMSIS. Principalmente se você pretende ter uma linha de diferentes produtos baseados na mesma arquitetura. Vai te ajudar no processo de desenvolvimento de um framework de software para sua linha de produtos, facilitar a manutenção e melhorar a compatibilidade de software com chips de outros fabricantes da linha ARM Cortex-M.

Um abraço,

Sergio Prado

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.