libc da arte incorporada é uma implementação de biblioteca padrão C destinada para sistemas incorporados baseados em microcontroladores.
Para economizar recursos de memória preciosa, esta biblioteca não fornece a implementação completa da biblioteca padrão C. Em vez disso, foi selecionado um subconjunto de funções úteis em sistemas incorporados de metal nu. Se você possui um sistema incorporado à base de metal ou RTOs, esta biblioteca é para você!
Ao contrário de muitas outras bibliotecas C que eu encontrei, esta biblioteca implementa testes de unidade e abordou falhas de longa data nas implementações de código aberto das funções de biblioteca padrão C. Estamos continuamente adicionando testes e fazendo melhorias adicionais nas implementações da linha de base.
malloc e free não estão incluídos nesta biblioteca. Se você precisar de suporte dinâmico de alocação de memória, precisará acoplar essa biblioteca a algo como libmemory da Artistry Incorted, que contém implementações de malloc e free .
Se você estiver interessado em contribuir para este projeto, leia o guia CONTRIBUTING .
libc da arte incorporada tem como objetivo fornecer um conjunto portátil de funções úteis de biblioteca padrão C que permitam a criação rápida de novos sistemas incorporados à base de metal e RTOs.
Além disso, queremos fornecer uma implementação libc de alta qualidade, garantindo que cada função tenha cobertura de teste de unidade e aborda falhas expostas pelo analisador estático. Muitas implementações de função da biblioteca C permanecem não testadas e contêm erros. Estamos lutando contra implementações ruins.
Para conservar a memória, esta biblioteca não fornece a funcionalidade completa da biblioteca padrão C. Em vez disso, foi selecionado um subconjunto de funções úteis em sistemas incorporados de metal nu. Essa seleção foi impulsionada principalmente por minha própria experiência no desenvolvimento focado em microcontrolador. Se você precisar de recursos adicionais, registre um problema e faça uma solicitação de recurso.
As implementações funcionais nesta biblioteca foram selecionadas para portabilidade e criação rápida de novos sistemas. Pode haver implementações mais eficientes para essas funções, mas geralmente elas são implementações específicas da arquitetura. Se você tem sugestões para melhorar o desempenho, estamos sempre felizes em ouvi -los.
malloc e free não estão incluídos nesta biblioteca. Como os esquemas de alocação de memória variam muito com sistemas incorporados (alguns nem mesmo permitindo memória dinâmica), você precisará fornecer suas próprias implementações com base nas necessidades do seu sistema. Você pode associar esta biblioteca à arte incorporada libmemory , que contém implementações de malloc e free .
Esta biblioteca fornece uma implementação completa para compilar e vincular a libc++ e libc++abi da CLANG (consulte o projeto LIBCPP da arte incorporada). Para conseguir isso, algumas funções são definidas apenas nos cabeçalhos, mas não têm uma implementação. As funções não suportadas, mas definidas, podem ser removidas usando uma opção de compilação ( hide-unimplemented-libc-apis ).
As seguintes partes da biblioteca C foram implementadas:
assertcrt.c , exit , atexit , etc.)atoXabs , labs , llabsbsearchcallocdiv , ldiv , lldivheapsort , heapsort_rimaxabs , imaxdivqsort , qsort_rrandreallocstrtoX (muitas via gdtoa )printf (a maioria via embeddedartistry/printf , baseada em eyalroz/printf e originalmente mpaland/printf )putcharputstime e asctime()wctype tipo wchar Além disso, esta biblioteca fornece implementações para __stack_chk_guard e __stack_chk_fail .
Atualmente, as seguintes arquiteturas são suportadas:
Os seguintes testes de unidade precisam ser adicionados:
reallocrandEstes não são implementados por podem ser adicionados no futuro:
wcharerrno (ativado como um interruptor de tempo de compilação)getopttimeFILE e funções adicionais do stdioNo momento, não estamos planejando suporte total para:
localeEste projeto usa o sistema de construção padrão da arte de arte incorporada e as dependências são descritas em detalhes em nosso site.
No mínimo, você precisará:
git-lfs , usado para armazenar arquivos binários neste repositório Este projeto armazena alguns arquivos usando git-lfs .
Para instalar git-lfs no Linux:
sudo apt install git-lfs
Para instalar git-lfs no macOS:
brew install git-lfs
Instruções de instalação adicionais podem ser encontradas no site git-lfs .
O sistema de construção de meson depende do python3 e ninja-build .
Para instalar no Linux:
sudo apt-get install python3 python3-pip ninja-build
Para instalar no OSX:
brew install python3 ninja
Meson pode ser instalado através pip3 :
pip3 install meson
Se você deseja instalar o Meson globalmente no Linux, use:
sudo -H pip3 install meson
Este projeto usa git-lfs ; portanto, instale-o antes da clonagem. Se você clonou antes de instalar git-lfs , basta executar git lfs pull após a instalação.
Este projeto está hospedado no Github. Você pode clonar o projeto diretamente usando este comando:
git clone --recursive [email protected]:embeddedartistry/libc.git
Se você não clonar recursivamente, execute o seguinte comando no repositório ou sua construção falhará:
git submodule update --init
Se a marca estiver instalada, a biblioteca poderá ser construída emitindo o seguinte comando:
make
Isso criará todos os objetivos para sua arquitetura atual.
Você pode limpar as construções usando:
make clean
Você pode eliminar a pasta buildresults gerada usando:
make distclean
Você também pode usar meson diretamente para compilar.
Crie uma pasta de saída de construção:
meson buildresults
E construir todos os alvos correndo
ninja -C buildresults
A compilação cruzada é tratada usando arquivos cruzados meson . Os arquivos de exemplo estão incluídos na pasta build/cross . Você pode escrever seus próprios arquivos cruzados para o seu processador específico, definindo a cadeia de ferramentas, sinalizadores de compilação e sinalizadores de ligação. Essas configurações serão usadas para compilar libc . (ou abra um problema e podemos ajudá -lo).
A compilação cruzada deve ser configurada usando o comando meson ao criar a pasta de saída de construção. Por exemplo:
meson buildresults --cross-file build/cross/gcc_arm_cortex-m4.txt
Depois disso, você pode executar make (na raiz do projeto) ou ninja para construir o projeto.
Os testes não serão compilados cruzados. Eles serão construídos apenas para a plataforma nativa.
As instruções completas para a criação do projeto, o uso de cadeias de ferramentas alternativas e a execução de ferramentas de suporte são documentadas no sistema de construção de meson padronizado da arte incorporada em nosso site.
O Código Independente de Posição (PIC) é ativado por padrão, mas pode ser desativado durante o estágio de configuração de Meson, definindo a opção interna b_staticpic para false :
meson buildresults -Db_staticpic=false
A otimização do tempo de link (LTO) pode ser ativada durante o estágio de configuração de Meson, definindo a opção interna b_lto como true :
meson buildresults -Db_lto=true
Isso pode ser combinado com outras opções de construção.
Se você não usa meson para o seu projeto, o melhor método para usar este projeto é construí -lo separadamente e copiar os cabeçalhos e o conteúdo da biblioteca em sua árvore de origem.
include/ diretório em sua árvore de origem.buildresults/srcExemplo de sinalizadores de ligação:
-Lpath/to/libc.a -lc
Se você estiver usando meson , pode usar libc como um subprojeto. Coloque -o no seu diretório de escolha de subproject e adicione uma instrução subproject :
libc = subproject('libc')
Você precisará promover a variável de dependência de subprojeto desejada para o seu projeto:
libc_dep = libc.get_variable('libc_dep')
Você pode usar a dependência da sua configuração de biblioteca de destino em suas declarações executable (s) ou outras dependências. Por exemplo:
fwdemo_sim_platform_dep = declare_dependency(
include_directories: fwdemo_sim_platform_inc,
dependencies: [
fwdemo_simulator_hw_platform_dep,
posix_os_dep,
libmemory_native_dep,
libc_dep, # <----- libc added here
libcxxabi_native_dep,
libcxx_full_native_dep,
logging_subsystem_dep
],
sources: files('platform.cpp'),
)
Os testes para esta biblioteca são escritos com o CMOCKA, que é incluído como um subproject e não precisa ser instalado no seu sistema. Você pode executar os testes emitindo o seguinte comando:
make test
Por padrão, os resultados dos testes são gerados para uso pelo servidor de CI e são formatados no Junit XML. Os arquivos XML dos resultados do teste podem ser encontrados em buildresults/test/ .
As seguintes opções do projeto Meson podem ser definidas para esta biblioteca ao criar o diretório de resultados de compilação com meson ou usando meson configure :
enable-pedantic : Ligue os avisos pedanticenable-pedantic-error : Ligue os avisos e erros pedantichide-unimplemented-libc-apis : esconde as definições de cabeçalho para funções que não são realmente implementadasenable-gnu-extensions permitirão extensões GNU libc que são implementadas nesta bibliotecadisable-builtins dirá ao compilador para não gerar funções internas, forçando-o a usar as funções da bibliotecadisable-stack-protection dirá ao compilador para não inserir chamadas de proteção de pilhastack-canary-value permite que você personalize o valor canário do seu aplicativo. Forneça uma sequência hexadecimal (por exemplo, '0xdeadbeef' ) com o mesmo comprimento do tamanho da palavra do seu processador.disable-stk-guard-runtime-config desativa o código usado para configurar __stk_chk_guard durante a inicialização do programa. Quando essa opção for true , o programa será revertido para usar uma definição codificada para o valor de guarda. As opções podem ser especificadas usando -D e o nome da opção:
meson buildresults -Ddisable-builtins=false
O mesmo estilo funciona com meson configure :
cd buildresults
meson configure -Ddisable-builtins=false
Esta biblioteca fornece uma implementação de __stack_chk_guard e __stack_chk_fail , o que permite que ele seja usado com o Código de Proteção de Pilha do GCC e CLANG.
O valor padrão para __stack_chk_guard pode ser substituído pela opção Build stack-canary-value .
[A documentação para a versão mais recente sempre pode ser encontrada aqui] https://embeddededartistry.github.io/libc/index.html.
A documentação pode ser construída localmente executando o seguinte comando:
make docs
A documentação pode ser encontrada em buildresults/docs , e a página raiz é index.html .
Se você precisar de mais assistência ou tiver alguma dúvida, registre um problema do GitHub ou envie um email usando o formulário de contato da arte incorporado.
Você também pode entrar em contato com o Twitter: MbdedDartistry.
Se você estiver interessado em contribuir para este projeto, leia nossas diretrizes contribuintes.
Copyright © 2022 Incorpded Artistry LLC
Este projeto está licenciado sob a licença do MIT - consulte o arquivo de licença para obter detalhes.
Para outras licenças de código aberto, consulte o inventário de software.
Gostaria de agradecer às seguintes indivíduos por suas contribuições diretas neste projeto:
printf )printf da MPaland e o desenvolvimento contínuo)Muitas das implementações de função de código aberto usadas nesta biblioteca foram retiradas de duas fontes primárias:
Também usei e melhorei a biblioteca gdtoa de código aberto.
As bases iniciais dos testes foram implementadas referenciando o projeto de teste LIBC.
De volta ao topo