被绕晕了,嵌入式用C好还是用C++好

单片机最好是用C,不过用C++会更温馨一些。由于单片机上写C++代码更流畅,开发效率贼快了。重要关键是不容易出错。

说白了,能够用C的都能够没区别的用C++,这是C++一初始创立的时候就定位好了的。在接近机器性能方面除了C,不给其他语言任何时机。

d88d3246e0e7796b688f05af044d8887.png

顺便说一句,我此时就在开发嵌入式,而且C++版本足够用。

假如auto thread for(auto& i : container)

其实吧,问题不在单片机,而是在于国内落后的C++教学环境。国内大学那些教师教的C++不叫C++,叫半路出家。

假如,国外的C++数据构造课程都要求学生达到模板,迭代器,输出操作符重载。这样的根底设施,我敢打包票,国内大学计算机教师,包含所有985大学,能自己写一个完整的欧美国家C++数据构造作业的都不多。

想学好单片机,以下步骤一定的做好,否则你永远都是行外人

07f0ac12e7977e5a85665a3b3969c3c0.png

第二步:单片机实战

这是真正进修单片机的过程,既让人兴奋又让人疲惫,其中的酸甜苦辣独有学过的人深有体会。思想上要有刻苦进修的决心,硬件上要有一套完整的进修开发工具,软件上要注重理论和实战相联合。

文章相对比较长,字数比较多,大家可以先打开头像关注我,之后慢慢看,///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像左下角黑色字体加我也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///

2f8f63ee903fb307c704a8f345fc0e88.png

有一套完整的进修开发工具

进修单片机是须要老本的。必需有一台电脑、一块单片机开发板(假如开发板不能直接下载程序代码的话还得须要一个编程器)、一套视频教程、一本单片机教材和一本C语言教材。

电脑是拿来编写和编译程序,并将程序代码下载到单片机上;开发板拿来运行单片机程序,验证现实中效果;视频教程就是手把手教单片机开发环境的运用、单片机编程和调试。

对于单片机初学者来说,视频教程必需看,要不然,哪怕把教材看了几遍,还是不知道怎么样下手,尤其是院校里的单片机教材,学了之后,面对真正的单片机时可能还是束手没策;单片机教材和C语言教材是理论进修资料,备忘备查。不要为了节省老本不用开发板而光用Protur软件仿真调试,这和纸上谈兵没什么差别。

要注重理论和实战相联合

单片机C语言编程理论知识并不深奥,只看书不动手也能明白。但在现实中编程的时候就没那么简略了。一个程序的构成不仅须要有C语言知识,更多须要融入个人的编程思维和算法。

编程思维和算法决定一个程序的优劣,是单片机编程的大问题,独有在现实中动手编写的时候才会有深切的感悟。一个程序能否依照意愿正常运行就要看思维和算法是否正确、合理。假如程序不正常则要反复调试(检查、修改思维和算法),直到成功。这个过程耗时、费脑、疲精神,意志不刚强者往往被绊倒在这里半途而废。

进修编写程序应该依照以下过程进修,效果会更好。看到例程题目先试着构思自己的编程思维,其次再看教材或视频教程里的代码,钻研人家的编程思维,注意与自己思维的差异;之后就照搬人家的思维亲身动手编写这个程序,领会其中每一条语句的作用;对有疑问的地方试着依照自己的思维修改程序,比较程序运行效果,领会其中的奥妙。

fa2762f16e8dc353dd4eaa60c4054ef7.png

每一个例程都坚持依照这个过程进修,很快会找得到编程的感觉,取其精髓去其糟粕,久而久之会构成独特的编程思想。

当然,刚初始,看他人的程序源代码就像看天书一样,只有硬着头皮看,看到不懂的重要关键字和语句就翻书查阅、对照。只有能坚持下来,进修收获会事半功倍。

在实战过程中不仅要学会他人的例程,还要在他人的程序上改进和拓展,让程序产生更壮大的功能。同时,还要懂得通过查阅芯片数据手册(DATASHEET)里相关芯片命令和数据的读写时序来核对他人例程的可靠性,假如觉得例程不可靠就把它修改过来,成为自己的程序。不仅如此,自己应该经常找些项目来做,以稳固所学的知识和积攒更多的经历。

aa504d726f0c81cb0fd4a174a9993660.png

第三步:单片机硬件设计

当编写自己的程序信手拈来、浏览他人的程序能够发现问题的时候,证明自己单片机编程水平相当不错了。之后就应该钻研的硬件了。硬件设计包含电路原理设计和PCB板设计。

进修做硬件要比进修做软件麻烦,老本更高,周期更长。但是,进修单片机的最终目标是做产品开发----软件和硬件相联合构成完整的控制系统。所以,做硬件也是进修单片机技术的一个必学内容。

电路原理设计波及到各种芯片的应用,而这些芯片外围电路的设计、典型应用电路和与单片机的连接等在芯片数据手册都能找得到答案,前提是要看得懂全英文的数据手册。

否则,照搬他人的设计永远落在他人的后面,做的产品就没有创意。电子技术领域的第一手资料(DATASHEET)都是英文,从第一手资料里所获得的知识可能是在教科书、网络文档和课外读物等所没有的知识。

虽然有些资料也都是在DATASHEET的根底上撰写的,但内容不全面,甚至存在翻译上的遗漏和错误。当然,浏览DATASHEET须要具备一定的英文浏览才能,这也是妨碍单片机进修者晋级的绊脚石。

在了解电路的含义之后,在进行关于PCB板的有关设计就比较简略了,在这一阶段只有对一些常见的PCB软件能够运用即可,如Protel、AltimDesigner,但假如要求最终的布线效果具有一定的美观度就须要花费一些时长了。

总的来说,作为一名单片机设计者,只有能够驾驭单片机C语言编程,并且能够运用常用PCB软件进行设计画板,此外再具备一定的英文根底。那么一定会成为一名超强的单片机高手。

145b04a430a6c066ea4c444d8ad465c9.png

对单片机感兴趣的朋友可以找我我录制了一些关于单片机的入门教程有需要的童鞋找我拿就行免费的私信我“林老师”就可以拿点击打开我的头像就能领取

<think>好的,我需要回答用户关于嵌入式软核开发中选择C语言还是C++的问题。首先,我需要理解用户的需求,他们可能是在项目初期需要选择语言,或者对两种语言的优劣不太清楚。接下来,我得整理已有的引用资料,看看是否有直接相关的信息。 根据提供的引用,引用[1]提到嵌入式C语言实现面向对象的特性,比如封装、继承和多态,这说明即使用C语言,也能通过设计模式模拟面向对象。引用[2]讨论优化驱动架构和代码实践,这可能和语言的选择有关,比如C++的某些特性是否会影响性能。引用[3]提到高质量嵌入式开发中的一些技巧,比如使用const和define,这可能更偏向C语言的习惯。引用[4]比较了不同方法获取可执行文件名,虽然主要和Linux相关,但里面提到C++的方法需要额外库,可能增加复杂度。 接下来,我需要总结C和C++嵌入式软核开发中的优缺点。C语言的优势可能在于更接近硬件、资源占用少、执行效率高,社区支持好。而C++的优势可能在于面向对象特性、代码复用性、抽象能力,但可能带来更大的代码体积和运行时开销。 还需要考虑嵌入式系统的资源限制,比如内存、处理器速度,以及团队熟悉度。实时性要求高的系统可能更倾向于C,而需要复杂逻辑或模块化设计的可能用C++更好。 此外,引用[1]中提到用C实现封装、继承和多态,说明即使使用C,也可以通过结构体和函数指针模拟面向对象,这可能在某些情况下替代C++的需求。而引用[2]强调优化代码结构和减少资源占用,这可能更符合C语言的特性,因为C++的某些高级特性可能引入额外开销。 最后,应该结合具体应用场景,比如实时控制、驱动开发可能更适合C,而需要复杂业务逻辑或框架的可能更适合C++。同时,项目规模和团队经验也是重要因素。需要提醒用户根据项目需求权衡,并参考实际案例。</think>在嵌入式软核开发中,C语言C++的选择需结合**资源限制、开发效率、性能需求**及**团队经验**综合判断。以下是具体分析: --- ### **1. C语言的优势与适用场景** #### **优势** - **资源占用低** C语言生成的代码体积小,运行时内存消耗少,适合资源受限的嵌入式系统(如ROM/RAM较小的MCU)[^3]。 - **执行效率高** 直接操作硬件的能力强,语法简洁,无运行时类型检查或虚函数等额外开销。 - **兼容性与生态成熟** 广泛支持各类编译器和调试工具,驱动开发、实时操作系统(RTOS)等底层代码普遍采用C语言[^2]。 - **确定性控制** 无动态内存分配(如默认不依赖`new/delete`),适用于对实时性要求严格的场景(如电机控制、信号处理)。 #### **适用场景** - 裸机开发或RTOS任务层代码 - 资源极度受限的MCU(如8/16位处理器) - 需要直接操作寄存器或硬件外设的驱动开发 - 强实时性要求的系统(如航空航天控制) --- ### **2. C++的优势与适用场景** #### **优势** - **面向对象特性** 支持封装、继承、多态,提升代码复用性和可维护性。例如,可通过类抽象硬件外设(如`UARTDriver`)[^1]。 - **模板与泛型编程** 减少重复代码,例如实现类型安全的容器(如`std::array`替代裸数组)。 - **RAII(资源获取即初始化)** 自动管理资源(如互斥锁、文件句柄),减少内存泄漏风险。 - **标准库支持** STL提供高效算法和数据结构(需注意嵌入式适配性)。 #### **适用场景** - 复杂业务逻辑的应用层开发(如协议栈、用户交互) - 需要模块化设计的系统(如通信框架) - 资源相对丰富的嵌入式处理器(如ARM Cortex-A系列) - 长期维护的大型项目 --- ### **3. 关键对比维度** | **维度** | **C语言** | **C++** | |----------------|---------------------------------------|----------------------------------------| | **代码体积** | 更小(无运行时类型信息)[^3] | 可能较大(依赖模板实例化、RTTI) | | **执行效率** | 高(无虚函数、异常处理开销) | 可控(禁用RTTI/异常后接近C) | | **开发效率** | 低(需手动管理抽象) | 高(利用类、模板等抽象机制) | | **硬件控制** | 更直接(如位操作语法`|=`、`&=`) | 需注意编译器优化(如`volatile`关键字) | | **维护成本** | 高(易出现冗余代码) | 低(通过封装降低耦合) | --- ### **4. 实践建议** - **混合使用策略** - 底层驱动、中断服务例程(ISR)用C实现,确保时序确定性。 - 上层应用逻辑用C++开发,利用抽象简化复杂逻辑。 - **编译器配置优化** - 禁用C++的RTTI(运行时类型识别)和异常处理以减小代码体积。 - 使用`-fno-exceptions`(GCC)等编译选项。 - **资源管理规范** - 避免动态内存分配(如替换`new/delete`为静态内存池)。 - 限制模板实例化次数,防止代码膨胀。 --- ### **示例对比** #### **C语言实现GPIO封装** ```c typedef struct { volatile uint32_t* port; uint8_t pin; } GPIO; void GPIO_Init(GPIO* gpio, volatile uint32_t* port, uint8_t pin) { gpio->port = port; gpio->pin = pin; } void GPIO_Toggle(GPIO* gpio) { *gpio->port ^= (1 << gpio->pin); } ``` #### **C++实现(利用RAII和类封装)** ```cpp class GPIO { private: volatile uint32_t* port_; uint8_t pin_; public: GPIO(volatile uint32_t* port, uint8_t pin) : port_(port), pin_(pin) {} void toggle() { *port_ ^= (1 << pin_); } }; ``` ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值