Aplicação de Protocol Buffers em Sistemas Embarcados ARM com Linguagem C

Instalação do protobuf e protobuf-c no ambiente de desenvolvimento PC

Para utilizar o Protocol Buffers em plataformas ARM embacradas, é necessário primeiro preparar o ambiente de desenvolvimento no PC. Isso envolve a instalação das ferramentas protobuf e protobuf-c.

Repositório oficial do protobuf: https://github.com/protocolbuffers/protobuf

Recomenda-se baixar a versão v21.12, pois versões mais recentes podem não ser totalmente compatíveis com o protobuf-c.

cd protobuf-21.12
./autogen.sh
./configure  # Instalação padrão em /usr/local/
make
sudo make install

Em seguida, instale o protobuf-c a partir do seu repositório.

Repositório do protobuf-c: https://github.com/protobuf-c/protobuf-c

git clone https://github.com/protobuf-c/protobuf-c.git
cd protobuf-c
./autogen.sh
./configure
make
sudo make install
sudo ldconfig

Isso gerará os executáveis protoc-c e protoc-gen-c em /usr/local/bin/, utilizados para compilar arquivos .proto em código-fonte C.

Compilação cruzada da biblioteca protobuf-c para a plataforma alvo ARM

Após a instalação no PC, é necessário compilar a biblioteca protobuf-c de forma cruzada para a arquitetura ARM. Retorne ao diretório do código-fonte do protobuf-c e limpe as configurações anteriores.

make clean
./configure --host=arm-none-linux-gnueabihf CC=arm-none-linux-gnueabihf-gcc CXX=arm-none-linux-gnueabihf-g++ --disable-protoc --prefix=$(pwd)/saida
make
make install

Isso prdouzirá os diretórios lib e include dentro do caminho de instalação. As bibliotecas compartilhadas como libprotobuf-c.so* devem ser copiadas para o sistema de arquivos do dispositivo ARM, por exemplo, no diretório /lib.

Exemplo prático de uso do Protocol Buffers com C

Crie um arquivo de definição de mensagem, como mensagem_exemplo.proto, com a sintaxe proto3.

syntax = "proto3";

message RespostaSensor
{
  string identificador = 1;
  uint32 endereco = 2;
  uint32 quantidade = 3;
  repeated uint32 valores = 4;
}

Compile o arquivo .proto para gerar os fontes em C utilizando o compilador do protobuf-c.

protoc --c_out=. mensagem_exemplo.proto

Isso gerará automaticamente os arquivos mensagem_exemplo.pb-c.c e mensagem_exemplo.pb-c.h. O arquivo de cabeçalho contém as funções essenciais para serialização e desserialização.

/* Inicializa a estrutura da mensagem RespostaSensor */
void   resposta_sensor__init
                     (RespostaSensor   *msg);

/* Serializa a mensagem 'msg' no buffer 'saida', retornando o tamanho em bytes */
size_t resposta_sensor__pack
                     (const RespostaSensor *msg,
                      uint8_t              *saida);

/* Desserializa os dados do buffer 'dados' para uma estrutura RespostaSensor, usando o alocador fornecido */
RespostaSensor *
       resposta_sensor__unpack
                     (ProtobufCAllocator  *alocador,
                      size_t              tamanho,
                      const uint8_t       *dados);

/* Libera a memória alocada para uma mensagem desserializada */
void   resposta_sensor__free_unpacked
                     (RespostaSensor     *msg,
                      ProtobufCAllocator *alocador);

Ao compilar a aplicação final para a plataforma ARM, lembre-se de vincular a biblioteca libprotobuf-c.so* gerada na etapa de compilação cruzada.

Referência adicional: https://blog.csdn.net/zhengnianli/article/details/110914259

Tags: protobuf protobuf-c ARM embedded-systems c-language

Publicado em 6-2 05:03 por Thomas