Por que os candidatos a emprego de engenheiro de hardware precisam ser proficientes em CC++?

Por que os candidatos a emprego de engenheiro de hardware precisam ser proficientes em C/C++?

Compartilhe algumas respostas aqui, há um certo valor de referência, bem-vindo para deixar uma mensagem para discussão!

///Interlude: No início deste ano, gravei um tutorial introdutório relativamente sistemático de microcomputador de chip único. Se você quiser, pode me encontrar e levá-lo gratuitamente. Você pode me enviar uma mensagem privada~ Clique no meu avatar em fonte preta e adicione-me Terra. Você também pode obtê-lo. Eu tenho sido relativamente livre recentemente, e completei o projeto com alunos, e levei alunos para participar de competições provinciais ou superiores ///

026899f6a3fad26b8804ab2f5345b48d.png

resposta 1

A maioria dos chamados projetos de chip único não usa C++ porque o conhecimento médio de software dos profissionais em todo o setor de desenvolvimento embarcado caiu a um nível ultrajante.

A maioria dos engenheiros embarcados nasceu em eletrônica, comunicação, automação e outros cursos. Devido à falta de educação profissional e sua própria capacidade de aprendizado, eles não possuem conhecimentos básicos de design orientado a objetos, padrões de design, engenharia de software, etc. na opinião deles C Semelhante ao C++, não há necessidade de ir para o C++.

Um engenheiro de baixo nível está cheio de bobagens sobre estabilidade, confiabilidade, mercado, custo e custo-benefício o dia todo, mas ele nunca ouviu falar da essência das tecnologias de software modernas, como padrões de projeto, reutilização de código, escalabilidade, teste de unidade , e integração contínua.

Aqueles que sabem sabem que você é um engenheiro incorporado que força seus respeitos, e aqueles que não sabem pensam que você é o grande chefe que comanda milhares de tropas.

(Eu pré-julguei seu pré-julgamento, e este parágrafo realmente atingiu alguns engenheiros embarcados tradicionais. Alguém realmente me disse que padrões de design, testes de unidade e integração contínua não são importantes? Eu estou interpretando essas pessoas ao longo do artigo. Cara, depois você foi espancado, você me disse: você só bateu na cara, você não bateu na chave, você não iria bater em ninguém! Eu rolei no chão de tanto rir!)

Todos os projetos de aplicativos MCU que não usam C++ (a biblioteca de drivers subjacente não está incluída) são devido à sua pequena escala e aplicação muito simples. Uma ou duas pessoas, no máximo, não mais que 5 pessoas podem concluir todo o desenvolvimento. projeto não usa apenas Not C++, nem mesmo C, ou mesmo feito em assembly, muito menos quaisquer técnicas modernas de engenharia de software.

Como candidato ao desenvolvimento embarcado, se você quiser se juntar a uma grande fábrica e participar de qualquer projeto embarcado de grande escala, seu nível C++ é o seu teto.

13dbe4415b87b26ae6b1853a025a0ffd.png

As grandes fábricas aqui não são apenas Huawei e DJI, mas até Zhou Ligong, o proprietário do "Zhou Ligong MCU" familiar para muitos entusiastas, afirmou repetidamente em público que eles mudaram totalmente para C++, e engenheiros que só conhecem C não obter oportunidades de trabalho. .

O Arduino é talvez o projeto AVR (microcontrolador de 8 bits) mais famoso do mundo, ninguém.

O pacote Arduino usa C++ e design orientado a objetos por toda parte. O polimorfismo de tempo de execução baseado na implementação de função virtual é amplamente utilizado, e muitos projetos seguem importantes princípios de projeto, como o princípio aberto-fechado, isolamento de interface e inversão de dependência.

Em projetos ARM, C++ é mais usado. O projeto mbed promovido oficialmente pela ARM é aproximadamente um dos projetos mais conhecidos na área de microcontroladores ARM.

Se você quer dizer que o Arduino é um brinquedo e não tem força industrial, então o projeto mbed é definitivamente projetado para aplicações de nível industrial, desde o RTOS inferior até a camada de abstração de hardware superior HAL.

O mbed é implementado em C++, usa amplamente o princípio aberto-fechado e a inversão de dependência e exige que os usuários concluam implementações relacionadas à plataforma herdando classes base virtuais para obter extensões.

Se você é um engenheiro integrado de linha de frente, mas não sabe o que significam alguns dos termos profissionais que mencionei, acho que você deveria refletir sobre por que seu salário não está subindo. Porque esses são o senso comum mais básico de padrões de design e orientados a objetos.

Por fim, responda à pergunta: por que os engenheiros de microcontroladores exigem C++? Não é tão simples? Porque as empresas não são estúpidas!

Na verdade, também sou um fã ferrenho de C, e C, sem dúvida, desempenha um papel fundamental no campo incorporado.

Acredito firmemente que em sistemas embarcados modernos, a coexistência de C e C++ será generalizada e haverá uma tendência crescente. Usar C na camada de abstração de hardware e C++ nas camadas de aplicação e interface é uma prática muito comum.

Esta também é uma resposta positiva para esta pergunta, por que você precisa conhecer C++ para incorporado? Já que tanto C quanto C++ são úteis em aplicações embarcadas.

Dito isso, se sua opinião ainda é "C++ é inútil, C++ sai do embutido", boa sorte!

Resposta 2

A maioria das descrições de trabalho pode estar duplicando as necessidades de empresas incorporadas semelhantes e compensando-as, então essa frase foi deixada de lado e não está rabiscada, mas na verdade é muito diferente dos requisitos reais de recrutamento.

Pela minha experiência em entrevistas incorporadas de não menos que 20 a 30 vezes em fábricas grandes e pequenas, a maioria das empresas não envolverá C++ ao recrutar (exceto para produtos de aplicação QT em suas próprias empresas, mas não na direção de microcomputadores de chip único) Os requisitos da linguagem estão longe de serem proficientes, e eles são basicamente proficientes na sintaxe da linguagem C.

75ff77b51f40658a6060a416bcd1a335.png

Percorra o > uma vez e domine os principais detalhes mencionados nas anotações a seguir. O teste escrito é basicamente a sintaxe básica de C (palavras-chave, macros, estruturas, enumerações, ponteiros e referências, arrays, casts, deslocamentos, endianness, área de armazenamento, robustez da função), na estrutura de dados conjunta (classificação, busca, árvore binária), na categoria de algum conhecimento de hardware como (interrupção, precisão AD, conversão de relógio RTC), o conhecimento da linguagem C examinado aqui Na minha opinião, está longe do ponto de domínio.

Como um profissional embarcado, com base em minha experiência ao longo dos anos, a menos que eu esteja envolvido no desenvolvimento de Linux embarcado, e seja na direção da aplicação de interface QT, é necessária reserva de conhecimento C++.

Para a maioria dos engenheiros de MCU que conheço, mesmo que a força seja muito mais forte que a minha, C++ está basicamente preso em C com Classe, e não há muitos modelos mestres, sem mencionar o poderoso STL por trás e o impacto da programação funcional. lambda e meta-programação de templates, ou seja, pessoas como eu que são ociosas e gostam de ler código e código, vão gastar muito tempo estudando C++11, e até mesmo buscando entender o framework front-end, pois esses conhecimentos são realmente importante para o desenvolvimento de microcomputadores de chip único.

Para microcomputadores de chip único, por um lado, é necessário buscar estabilidade e controlabilidade, por outro lado, o custo é rigoroso e os recursos (RAM/FLASH) são limitados.

Assim, você pode ver que os brinquedos de desenvolvimento e depuração do NodeMcu e do MicroPython estão vendendo muito, mas é difícil ver a tecnologia correspondente usada no campo do produto.

O mesmo vale para C++, o uso de STL trará inevitável expansão de resultados de compilação (capacidade de código).Se essa parte for castrada, é melhor usar a linguagem C por simplicidade e conveniência, o que também limita o mercado para C++.

No campo de microcomputador de chip único e desenvolvimento de drivers embarcados, a linguagem C ocupa basicamente uma posição absoluta. pode-se dizer que é um absurdo ser proficiente em C++. De fato, quão alto é o requisito para ser proficiente em C++, você pode ir para a pergunta correspondente para ver como essa pessoa usaria C++ castrado para desenvolver microcomputadores de chip único.

Finalmente, o problema de ser proficiente na linguagem C, especialmente a linguagem C na área de microcomputadores single-chip, é uma coisa muito difícil, pelo menos para mim neste momento, está um pouco longe de ser proficiente na linguagem C Língua.

Porque ser proficiente em linguagem C não é apenas dominar palavras-chave e recursos gramaticais, mas também as seguintes operações complexas, mas práticas, como campos de bits para implementar operações de bits em registradores, uso de conversões de construção para várias análises de protocolo e ponteiros de função para implementar callbacks assíncronos , a formatação da função implementada pela definição da macro mais ##;

Embora sejam complicados, pelo menos há um conjunto de regras e regulamentos, que podem ser entendidos e dominados apenas pela leitura de livros e prática, mas quando você usa a linguagem C para completar códigos de projetos complexos e estáveis ​​e superar vários bugs anormais, você saiba que a proficiência da linguagem C não é apenas o conhecimento acima dessas gramáticas fixas.

Na depuração, você pode encontrar ponteiros fora dos limites, estouro de pilha, recursos compartilhados desprotegidos, exceções de acesso desalinhadas, erros de otimização do compilador, etc. Esses problemas podem ser fáceis de descobrir individualmente, mas no código complexo de centenas de milhares de linhas , o desempenho do local errado muitas vezes é normal, mas interfere em outras partes, resultando em execução anormal no local onde não há erro. Isso requer não só a linguagem C, mas também o conhecimento do kernel do sistema, barramento arquitetura e montagem.Essa é a dificuldade de dominar a linguagem C.

Você precisa entender as coisas sistemáticas no domínio da tecnologia de computadores e ter um entendimento claro de alocação de memória, arquitetura de barramento, kernel e assembly.

Por exemplo, sabendo que o espaço dentro da função está na pilha, quando precisarmos usar um array grande na função, devemos considerar se devemos defini-la como uma variável estática (para evitar estouro de pilha). arrays, devemos considerar se devemos adicionar gerenciamento de memória.

e193db2b01ba834fffd15ac630ee80ca.png

Se o array for acessado por um ponteiro de 2 bytes/4 bytes, você considera alinhamento forçado ao declará-lo (encontrei #pragma pack(1) esqueci de fechar depois dele, resultando em variáveis ​​globais desalinhadas, 4 palavras An A exceção é acionada quando o ponteiro de seção é acessado e leva muito tempo para encontrar e localizar a solução devido a conversões repetidas no meio.

Além disso, se forem usados ​​Cache e MPU, todo o sistema fica mais complicado, quando escrever de volta, quando usar CacheLine inválido, o significado de volátil e os cuidados para usar com Cache.

O domínio desses conhecimentos é, na verdade, parte de ser proficiente na linguagem C incorporada, portanto, não é fácil ser proficiente na linguagem C.

おすすめ

転載: blog.csdn.net/danpianji777/article/details/124381421