- Compilando a CMSIS DSPLIB para os Cortex M4 da TI
- Executando um exemplo da CMSIS DSPLIB para o MSP432
Caros leitores, neste artigo ensinaremos como compilar a CMSIS-DSPLIB na IDE Code Composer Studio (CCS) para os microcontroladores ARM Cortex M4 da Texas Instruments (Stellaris, Tiva, MSP432), ampliando as possibilidades em seus projetos com estes dispositivos.
Nos últimos anos presenciamos um crescimento muito grande da eletrônica embarcada e também de sua popularidade, em especial com o surgimento/popularização dos grupos “makers”. Novas arquiteturas surgiram, outras foram atualizadas, mas o que é inegável é a quantidade de microcontroladores que temos disponíveis para nossos projetos.
Uma das arquiteturas que mais cresceram e que cada vez mais fazem parte dos projetos são os microcontroladores com núcleo ARM da família Cortex M.
Geralmente os dispositivos desta família, em especial os modelos M3 e M4 (e mais recentemente o M7), possuem grande capacidade de processamento, podendo até serem empregados em tarefas envolvendo processamento de sinais, já que possuem instruções DSP (Digital Signal Processor) nativas bem como instruções SIMD (Single Instruction Multiple Data). Com ponto especial para os modelos M4 e M7, que podem incluir (e tradicionalmente possuem) uma FPU (Float Point Unit), o que irá acelerar muito o processamento de instruções matemáticas utilizando notação de ponto flutuante ou mesmo de ponto fixo. Para conhecer um pouco mais sobre as instruções SIMD indico a leitura deste artigo do Felipe Neves.
Entretanto, muito usuários que buscam esses tipos de aplicações não tomam conhecimento da existência da “biblioteca” CMSIS, mais especificamente da CMSIS-DSPLIB que pode acelerar em muito o desenvolvimento ou mesmo adicionar novas funcionalidades. A ARM CMSIS, ou “Cortex Microcontroller Software Interface Standard” é uma camada de abstração de hardware padronizada, criada pela ARM. O nosso foco é no bloco CMSIS-DSP, uma biblioteca com mais de 60 funções (tradicionalmente utilizadas no processamento de sinais), otimizada para utilizar a FPU quando disponível e também as instruções SIMD.
Um dos dificultadores na sua utilização tem relação com dois pontos, limitada quantidade de informações e dificuldade de encontrar as bibliotecas compiladas para uso, e neste ponto surgiu a ideia deste artigo (já que passei bastante tempo pesquisando sobre como utilizar a DSPLIB em uma launchpad).
Existe um tutorial, originalmente criado para os Stellaris, mas depois de testes constatei que o mesmo procedimento (com pontuais modificações) é aplicável a linha Tiva e aos mais recentes MSP432. O documento original (“Using the CMSIS DSP Library in Code Composer Studio for TM4C MCUs”) pode ser encontrado neste link.
Neste artigo demonstrarei como compilar a CMSIS DSPLIB para o MSP432 utilizando a IDE Code Composer Studio – CCS, entretanto indicarei o ponto onde devemos realizar modificações para os outros uC’s.
Baixando os arquivos necessários
Inicialmente será necessário realizar o download da CMSIS compatível. O tutorial original se baseia na versão r4p2, entretanto nos testes que realizei a versão mais recente r4p5 funciona normalmente (caso encontrar algum problema deixe comentário ao final do artigo). Também será necessário realizar o download de alguns headers fornecidos pela TI para que a biblioteca se torne compatível. Descompacte ambos os arquivos.
Agora será necessário substituir alguns arquivos da CMSIS original pelos header fornecidos pela TI. Siga os caminhos dos headers, copie-os do header da TI e cole na respectiva pasta da CMSIS original (aparecerá o aviso para substituir o arquivo, marque SIM).
Compilando a DSPLIB
Abra o CCS (estou utilizando o CCS v6.2 no Windows 7), clique em “Project >> New CCS Project”. Selecione o modelo do uC, neste caso o MSP432P401R, escolha um nome para o projeto, de preferência algo que identifique para qual uC e qual a versão da CMSIS. Selecione um projeto vazio (sem o main.c). Clique em “Advanced settings”, então selecione:
- Output type: Static Library
- Output format: eabi (ELF)
- Device endianess: little
PS.: Caso for compilar para outro dispositivo (Stellaris ou Tiva) é nesse ponto que você deve selecionar o dispositivo correto.
PS.: No caso do MSP432 as opções output format e device endianess são fixas, mas nos Stellaris e Tiva elas estão ativas para configuração.
Uma pasta com um projeto vazio surgiu e nela iremos importar os arquivos necessários da CMSIS para posterior build. Mas antes, iremos criar um PATH VARIABLE para facilitar a portabilidade do projeto, ou mesmo garantir que após uma atualização no seu PC você não terá que repetir todos os passos. Clique em “Resource >> Linked Resource” e então adicione um novo “Path variable”, este deverá apontar para a pasta da CMSIS que anteriormente você baixou e descompactou. Se você verificar, no tutorial original não existe este passo, mas isso facilita a portabilidade. Por exemplo, você trocou a CMSIS de diretório, ao tentar compilar receberá diversos erros. Utilizando este método será necessário apenas corrigir o caminho deste PATH VARIABLE.
Agora iremos importar os arquivos necessários. Clique com o botão direito sobre o projeto que criou e então em “Import >> Import..”. Na tela que surgir selecione “General >> File System” e então clique em “Next”. Na próxima tela busque pela localização do diretório “…\CMSIS\DSP_Lib\Source”. Neste ponto marque o diretório “Source”, após isso desmarque “ARM”, “GCC”, e dentro de “TransformFunctions” desmarque “arm_bitreversal2.S”. Marque a opção “Overwrite existing resources without warning”. Clique em “Advanced”, marque “create links in workspace” e então em “create link locations relative to” selecione o PATH VARIABLE que você criou. Clique em “FINISH” para importar os arquivos.
Após este processo diversas pastas virtuais irão surgir dentro do projeto, conforme a figura a seguir.
Uma parte do processo já foi realizada, agora falta editar as propriedades do projeto, para isso clique com o botão direito sobre o projeto e selecione “Properties”. Vá até ao submenu “Build >> MSP432 Compiler >> Processor Options” (para o Stellaris ou Tiva estes serão diferentes, mas a sequência é a mesma). Verifique se o “Target processor” está como “7M4”, se o “Designate code state” está em “16” e se o “floating point support” está em “FPv4SPD16”.
Agora em “Optimization”, em “Optimization level” selecione “2 – globals”, e em “speed vs size” selecione a opção que melhor se adequar, eu tenho preferido manter no nível “2”, mantendo um bom equilíbrio entre tamanho e desempenho.
Expanda “Advanced options” e selecione “Assembler options”. Marque o ítem “Use unified assembly language (–ual)”.
Em “Diagnostic options” desmarque a opção “Emit diagnostic identifier numbers”.
Agora em “Include Options” adicione um “#include search path”, clique em adicionar, após isso clique em “Variables” e busque pela PATH VARIABLE que você criou. Após isso clique em “Extend” e selecione a pasta “Include”.
Caro leitor, não desanime, estamos quase lá. Em “Advanced Options >> Predefined Symbols”, Adicione os seguintes valores “ARM_MATH_CM4” e “__FPU_PRESENT=1” (ambos sem as aspas).
Em “Runtime Model Options” selecione “On” em “Place each function in a separate subsections”.
Finalmente chegamos ao final das edições, clique em “Ok”. Após estes procedimentos poderemos realizar o tão esperado Build. Neste ponto, aproveite seu tempo para preparar um bom café e degustá-lo (afinal, todo desenvolvedor de embarcados adora café, não é!?) já que o processo pode demorar bons minutos dependendo da sua máquina.
Ao final do processo será gerado um arquivo “.lib” que está dentro da pasta “Debug“ do seu projeto. O arquivo terá o mesmo nome do seu projeto. Neste ponto é interessante movê-lo para dentro da pasta da CMSIS, mais especificamente para a sub-pasta “Lib”. Dentro dela crie uma pasta “CCS” e então cole/mova o arquivo.
Caro leitor, chegamos ao final deste artigo. Agora você já pode compilar sua CMSIS DSPLIB. No próximo artigo apresentaremos abordaremos como testá-la, como adicioná-la a projetos já existentes no CCS.
Qualquer dúvida ou comentário, utilize o espaço abaixo. Um abraço e até a próxima!
Alguém já tentou realizar os mesmos passos no code composer 10?
Mateus, com as vesões mais recentes das bibliotecas deixou de ser necessário compilar a Cmsis DSPlib pois a biblioteca já vem compilada, inclusive com exemplos que já servem como projeto base.
De uma olhada no “Resource Explorer”, pesquise por “dsp” e depois entre na “SimpleLink MSP432”. Existem documentos sobre esse Third Party e exemplos também.