精华内容
下载资源
问答
  • 基于此,提到简单嵌入式系统的软件架构,我脑海中立马浮现这样的画面: 看到这张图,不同的人,可能会有不同的感受:有的高手能一眼看破,能马上进行万千补充、引申;有的会心领神会,从而期待后面的内容;而有的,...

    本文为原创,以下链接有比较及时的更新:
    https://www.yuque.com/docs/share/334f4a3d-2974-49db-8f68-4db6601a0d21?# 《简单嵌入式系统》

    引言

    本文描述的内容,适用范围是简单嵌入式系统。举一些可能不恰当的例子,如手环、蓝牙温湿度传感器、小家电这一类产品的软件复杂程度,在我看来,就是一个简单嵌入式系统可把控的。

    基于此,提到简单嵌入式系统的软件架构,我脑海中立马浮现这样的画面:

    在这里插入图片描述

    看到这张图,不同的人,可能会有不同的感受:有的高手能一眼看破,能马上进行万千补充、引申;有的会心领神会,从而期待后面的内容;而有的,可能会一头雾水,或懵懵懂懂。

    就本人而言,我当前的技术水平是能用代码将这张图构建的相对稳定、完整;期望有一天,我(或我们)能站在万米高空俯视这张图,一眼看破框图背后的种种玄机,轻松写意地构建出一个个优雅的嵌入式系统软件。

    回归正题,为什么要进行以上框图所示的层次划分?我是这么考虑的:

    关于硬件层:

    一般会说,设计该层次的目的在于封装掉硬件的细节,使在其上层的软件具备跨平台的移植性。不过在我看来,想要做到这点其实非常困难。就本人所在领域(BLE芯片)的开发而言,固件工程师一般都会在芯片厂商提供的 SDK 的基础上进行开发。换芯片、换 SDK,几乎不可能只靠修改硬件层就能完成适配。

    因此,在我看来,设计该层次的主要目的是为了方便维护,统一管理。通过对硬件相关的软件模块进行一定的抽象,我们能找到他们之间的一些共性:

    比如,对硬件的操作,一般都会有一个初始化、工作、解初始化流程 。因此,接口设计上,会有:

    void xxx_init(param);
    
    void xxx_start(param);
    
    void xxx_pause(param);
    
    void xxx_deinit(param);
    
    或者:
    
    void xxx_init(param);
    
    void xxx_send(param);
    
    void xxx_recv_cb_register(param);
    
    void xxx_deinit(param);
    

    又比如,将片内外设的 IO 接口、外设配置单独列在一个头文件中,方便进行统一的 IO 口、外设的适配:

    #ifndef __XXX_COMMON_H__
    #define __XXX_COMMON_H__
    
    #include <stdint.h>
    #include <stdbool.h>
    
    #include "iic.h"
    #include "spi.h"
    
    /*****************************************
     iic configuration
    *****************************************/
    #define XXX_IIC_IO_SDA_PORT 
    #define XXX_IIC_IO_SDA_PIN
    #define XXX_IIC_MODE
    
    /*****************************************
     spi configuation
    *****************************************/
    #define XXX_SPI_IO_CS_PORT  
    #define XXX_SPI_IO_CS_PIN
    #define XXX_SPI_MODE
    
    #endif // __XXX_COMMON_H__
    

    该层次各个模块的职责范围,应只是进行单纯的硬件操作。有多纯?比如,对于 IO 口按键,在该层次,IO 口模块应只提供 IO 口的初始化、读写、中断配置等功能,而不应该提供比如短按、长按、双击等动作触发功能。因为按键长按等动作的实现,需要调用两个该层次的软件模块:io_driver 和 timer_driver,这会导致层次内模块和模块之间产生了依赖,如图:

    在这里插入图片描述

    同层次,模块和模块之间不要产生依赖,这个可以理解,但上面这个图,好像没什么问题啊,我们可以把硬件层分成两个层次:片内外设和片外外设?

    在这里插入图片描述

    是可以的。

    但这里还有另外一个思路:在同一个层次内,我们仍然可以区分片内外设和片外外设,但可以通过一些 C 语言技巧来让他们不产生依赖,从而可以不用再分出一个层次。还是以按键功能为例,最终我们要实现的效果的框图是:

    在这里插入图片描述

    以上四个软件模块,可以假设其功能为:

    button:和系统的消息总线对接、根据底层的按键事件,向系统发送按键消息。

    drv_button:实现按键的触发、消抖、短按、长按等逻辑,并在各个节点产生回调。

    xxx_io:配置寄存器,提供 IO 口的读、写、中断配置等操作

    xxx_timer:配置寄存器,提供 timer 寄存器的配置等操作

    把按键逻辑抽象出来,做到不对 io 和 timer 产生依赖,有一个好处:为上层的 button 组件兼容各种按键类型提供便利。button 组件可以随意地组合 io, timer, 各种按键逻辑(IO 按键,触摸按键,矩阵键盘等),统一进行管理。

    另外,从硬件层的角度,在编写 drv_button 的时候,也不需要为未来可能的应用过多的考虑,在接口的灵活性设计上花费精力。

    综上,对于下面这两种层次架构:

    在这里插入图片描述

    其优缺点,我的理解是:

    • 前者的 drv_button 的应用比较难。因为需要 button 组件自己、结合 timer 和 io 来实现完整的功能。后者的 drv_button 功能相对完善
    • 前者相对比较灵活。button 组件可以相对随意地组合 drv_button, io, timer。后者在某些场景下,可能会导致重写 drv_button。举个例子,drv_button_1 用到了 io1, drv_button_2 也用到了 io1, 这时候,编写 drv_button 的工程师就得考虑 io 1 被复用的场景,否则会导致 drv_button 需要重写。
    • 前者的层次架构简单

    简而言之,前者在应对未来的需求改动上,比较有优势;后者适用于需求比较固定的场景,它的实现相对简单且符合直觉(一般人自然而然就会这么写)。

    两者的示例代码如下:

    。。。

    好吧,第一个图片里的架构有点写不出来。。。感觉这里有点过度设计了。

    写不出来的原因主要是:在不直接引用 xxx_timer 的情况下,比较难抽象出 drv_io_button/drv_matrix_button 模块的逻辑;因为 drv_xxx_button 的实现和和 xxx_timer 模块息息相关(也和 xxx_io 模块的使用关联性比较大),上层的 button 模块需要了解比较多 drv_xxx_button 模块的内在逻辑才能比较好的应用它们;这给上层模块造成了过大的负担。并且,在这种架构下的 button 模块的实现,会随着需求的增加而变得过于庞大和复杂。

    其实,上文中对于“片内外设”层,和“片内外设”层的概念的抽象,对于简单嵌入式系统来说也是一个没有必要的行为。

    行文至此,我应该把前面的内容删除部分的,不过也可以保留着作为一种思路历程的记录。

    经过反思,由于有 “drv_io_button” 和 “drv_matrix_button” 两种按键驱动的需求,对于按键功能的实现,有如下设计:

    在这里插入图片描述

    见上图,增加了 “bsp_button” 模块,用于抽象出硬件驱动的一些共性,屏蔽底层硬件实现的细节,从而为上层提供一个简单应用的接口(外观模式)。

    反思后的架构示例代码如下:

    硬件层实现示例代码

    bsp_button

    该模块主要为了封装低层的硬件实现细节,向上层提供一个简单的接口。

    采用自顶向下的设计思想,先把接口写出来,然后再根据这个接口来写低层的实现代码。

    接口有:

    /* bsp_button.h */
    
    #define BSP_EVT_ID_BTN_BASE         0x0100
    
    enum bsp_evt_id_btn_e
    {
        BSP_EVT_ID_BTN_INVALID = BSP_EVT_ID_BTN_BASE,
        BSP_EVT_ID_BTN_SHORT,
        BSP_EVT_ID_BTN_DOUBLE,
        BSP_EVT_ID_BTN_LONG,
        BSP_EVT_ID_BTN_CONTINUE,
    };
    
    typedef struct bsp_btn_evt_param_s
    {
        uint8_t type;                               // 0:io button, 1: matrix button
        uint8_t state;                              // 0: released, 1: pressed
        uint16_t number;                            // sequence number of the buttons
    } bsp_btn_evt_param_t;
    
    typedef struct bsp_btn_evt_s
    {
        uint16_t                evt_id;             // bsp_evt_id_btn_e
        bsp_btn_evt_param_t*    p_evt_param;        // bsp_btn_evt_param_t
    } bsp_btn_evt_t;
    
    typedef void (*bsp_btn_evt_hanlder_t)(bsp_btn_evt_t);
    
    
    uint8_t bsp_button_init(bsp_btn_evt_hanlder_t);
    
    uint8_t bsp_button_deinit(void);
    
    uint8_t bsp_button_enable(void);
    
    uint8_t bsp_button_disable(void);
    

    此处采用“事件回调”的方式来和上层对接,上层只需要注册一个回调函数给到该模块,便可“坐等”各种事件的通知,然后再根据各种事件做相应的处理。

    有一些细节、思路:

    一、以下关于事件的定义
    事件的参数使用的是 void * 类型,主要考虑到之后的扩展性。
    typedef struct bsp_btn_evt_s
    {
    uint16_t evt_id; // bsp_evt_id_btn_e
    void* p_evt_param; // bsp_btn_evt_param_t
    } bsp_btn_evt_t;
    目前该接口不能支持两个或以上按键同时按下的情况;

    但当未来有这种需求时,可再增加一些按键事件 ID,并另外定义一种事件参数类型来添加。

    二、关于 BSP_EVT_ID_BTN_BASE
    当 BSP 模块增多(如 bsp_spi, bsp_iic)时,可通过不同的 BASE 来区分不同模块并在考虑增加一个 bsp_config.h 文件来统一定义、管理

    三、bsp_btn_evt_param_t 中的 number 参数
    用于标识不同的硬件按键。是 bsp_button 这个模块的核心!
    从宏观上来观察这个模块,它完成了具体的“硬件按键”到抽象的“按键事件”的映射;
    上层在应用这个模块的时候,可以再把“按键事件”映射为“系统消息”(也是上层(app_button 组件)的核心功能);
    以此形成层层映射,由底至上搭建成套的基于“事件回调”机制的软件架构。

    drv_io_button

    关于组件层:

    组件,顾名思义、组成部件。理想状态下,更换某个组件,应该像更换一个积木一样直观、简单;但现实往往是,需要像治疗癌症一样,清除掉一个癌细胞,损伤一片好的细胞。组件接口的设计是一门艺术,大神抽象出来的组件接口令人叹为观止。而有的人嘛,一个组件就是一个项目……

    关于组件接口的设计,我的思考是:

    展开全文
  • 嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。 软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发。 我相信在嵌入式或...

    前言

    在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。

    软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发。

    我相信在嵌入式或单片机软件开发的初期大多数开发者采用的都是简单的前后台顺序执行架构(我就是这样的)。在嵌入式软件开发中,程序架构主要分为三种,本篇文章将对这三种程序架构做出详解。

    软件架构存在的意义

    可以说一个好的程序架构,是一个有经验的工程师和一个初学者的分水岭。软件架构对于开发人员是友好的,你希望先执行什么任务后执行什么任务,或者这一个时间点执行什么任务下一个执行什么任务,又或者什么事件会同步到某个任务等等,在不同的软件架构下,解决上述问题的具体方法都是有所区别的。

    软件架构对开发者最大的帮助是:帮助开发者掌控整个工程的框架,当你熟练使用其中某一个程序架构后,对于系统中出现的bug你一定能够快速的定位并解决。当然,我建议要根据需要选择合适的软件架构进行开发,具体原因在文章后面会进行介绍。

    深入介绍三种不同的程序架构

    三种常用的软件架构有:顺序执行的前后台系统、时间片轮询系统和多任务操作系统。为了让大家有一个更为清晰的认识,我分别用三种软件架构对一个实例进行介绍说明。这个实例如下:它有4个任务,这4个任务为按键扫描、声光报警、显示屏刷新和超声波测距。这个实例的具体功能是通过按键设置测量距离的阈值,当测距距离低于设置的阈值时,触发声光报警并且将测量距离实时显示在显示屏上(这个应用是汽车倒车雷达的具体体现)。

    1、顺序执行的前后台系统

    在顺序执行的前后台系统中,我会把键盘扫描用查询的方式放在while(1)中,而显示屏刷新和超声波测距使用中断,在中断服务函数中获取测量距离后进行显示,在主函数的循环中进行按键的检测,声光处理也放在主循环中。这样整个程序就以变量标志的同步方式在主循环和后台中断中执行,对应的程序代码如图所示:

    图片

    上面代码是顺序执行前后台系统的主函数。

    图片

    如上代码,顺序执行前后台系统的中断服务函数。 

    这种架构的优点是使用简单易于理解,而缺点是每个任务所占的CPU时间过长的话,会导致程序的实时性能差,就比如按键的检测等。

    2、时间片轮询系统和多任务操作系统

    时间片轮询法实际上通常出现在操作系统中,也就是说他属于操作系统,但在这里所说的是基于前后台系统的时间片轮询。

    时间片轮询法的实质其实就是选出一个定时器,每进一次定时中断对计数值进行自加,在主循环中根据这个计数值执行任务,这个计数值也就是任务轮询的时间片。

    在这个实例中,如果采用时间片轮询系统的话,首先选用主控芯片的任一定时器,定时器定时时间周期由我们决定,为了保证实时性和运行效率,这个值通常取10ms、30ms、50ms等,我会将按键扫描轮值值设置为20ms,因为按键抖动的时长一般为20ms,这样处理既达到了消抖的目的,又不会漏掉按键的检测。

    而显示屏的刷新设置为30ms,如果你觉得刷新反应慢了也可以修改这一轮询值得到改善;而超声波测距的轮询值设置为100ms,即每隔100模式触发测距一次,这个测距频率已经能够满足大多数的情况了。

    程序代码如下:

    图片

    如上代码,时间片轮询系统的主函数。

    图片

     

    如上代码,时间片轮询系统的定时器中断函数。

    可以看出时间片轮询法相比顺序执行还是有很大优势的,既有顺序执行法的优点,也有操作系统的部分优点。

    3、多任务操作系统

    操作系统的本身是一个比较复杂的东西,任务的管理和调度实现的底层是很复杂和困难的。

    但是,我们一般都是把操作系统本身作为一个工具一个平台,我们的目的是使用它的功能而不是开发一个操作系统。

    我使用过ucos和freertos小型的实时操作系统,也使用过Linux大型的操作系统,有了操作系统,不管是对于程序的稳定性和开发的效率都会好很多。

    我们在使用操作系统的时候更多的需要去学习和理解它的一些调度和通信的方式。

    实际上真正能使用操作系统的人并不多,反而是跑裸机的占大多数,这也和产品的具体要求有关,很多简单的系统只需要裸机即可满足。

    在这里本我不过多的介绍操作系统本身,因为操作系统确实挺复杂的,下面图例中的代码是在freertos中创建按键控制LED亮灭的程序结构,大家可以对比一下:

    图片

    如上,freertos多任务系统中主函数。

    图片

       

    如上,freertos多任务操作系统中的任务回调函数。

    如何选择合适的软件架构

    我使用过多种不同MCU做项目开发,例如:STM32、STC15、新唐等,也接触过复杂的设计需求,例如:车载智能系统和智能家居,跑过操作系统ucos、freertos和Linux等等,在回到裸机开发时,就会不然而然的去思考完整系统的软件架构的设计问题,相信在读者中开发裸机的也占大多数。

    我认为没有最好的软件架构(程序架构),而是只有最合适的。因为在不同的应用场景中适合采用不同的程序设计,而单纯的去比较哪种程序架构是最好的没有什么实际的意义。

    那接下来我们来对具体的应用场景进行分析:

    • 在一些逻辑清晰功能单一的系统中就很适合选择顺序执行的前后台架构,这个软件架构往往能够满足我们大部分的需求,比如电饭煲、电磁炉和声控灯泡等;

    • 在一些资源缺乏的单片机并且对系统可靠性要求较高的情况下非常适合,因为这种方法的系统耗费比较小,只是牺牲了一个定时器而已,但是选择此种程序架构需要我们对时间片进行深思熟虑的划分;

    • 最后,在一些功能复杂,逻辑控制较为困难的系统中就适合选择多任务操作系统,比如视频监控系统、无人机等等应用场景。

    作为嵌入式软件工程师,掌握这三种软件架构是非常有必要的,它们可以让我们在设计程序时拥有更多的选择和思考,而每一种不同的程序架构都具备它自己的优势与不足,这需要我们去用心实践方可体会到它的奥妙。

    展开全文
  • 嵌入式软件架构

    2021-04-12 21:17:36
    嵌入式软件架构师 Base上海/深圳 岗位职责: 1.收集并分析市场和产品需求,完成架构设计; 2.制定相关技术演进的roadmap,以及实施计划; 3.带领团队设计并开发复杂异构的操作系统以及多媒体系统解决方案,满足不同...

    嵌入式软件架构师
    Base上海/深圳
    岗位职责:
    1.收集并分析市场和产品需求,完成架构设计;
    2.制定相关技术演进的roadmap,以及实施计划;
    3.带领团队设计并开发复杂异构的操作系统以及多媒体系统解决方案,满足不同应用场景的需求;
    4.深入理解产品,参与产品的整个生命周期的开发过程,包括需求定义、设计、实现、测试、生产、售后等;
    5.制定和改善软件的开发流程;
    6.跟踪嵌入式领域最新的技术发展,对团队进行技术指导。
    任职要求:
    1.至少是EE,CE,CS或同等专业的硕士,至少6年以上的开发经验,以及1年以上架构师经验;
    2.深度参与至少1款产品的架构设计,对于设计简单、高复用、高扩展、高可靠、高性能、低功耗的架构有深入理解和体会;
    3.丰富的嵌入式软件开发经验,如:操作系统(RTOS、Linux、Android)、安全、媒体链路、GPU等;
    4.深入理解SoC架构,以及系统优化方法,如NEON、DSP、GPU等;
    5.具备较强的开发和编程实践能力,以及良好的质量意识;
    6.至少参与过一款产品的敏捷开发实践,如:Scrum、Kanban等;
    7.良好的沟通协调能力,以及较好的驱动力;
    8.良好的学习能力及团队领导力,喜欢挑战。

    展开全文
  • 嵌入式软件开发入门

    2021-09-16 23:25:53
    1. 如何学习嵌入式软件开发嵌入式软件开发一定要结合开发板来学习,所有的知识都可以在开发板上实现,我的嵌入式学习主要分为两个主要阶段。 1.1 对于MCU的学习: 这个阶段主要学习基础的硬件知识,因为MCU...

    1. 如何学习嵌入式软件开发

            做嵌入式软件开发一定要结合开发板来学习,所有的知识都可以在开发板上实现,我的嵌入式学习主要分为两个主要阶段。

    1.1 对于MCU的学习:

            这个阶段主要学习基础的硬件知识,因为MCU没有复杂操作系统的封装,可以直接了解硬件特性,是学习硬件和协议的最好的平台。另外基于MCU也可以掌握RTOS系统,LWIP等基础知识。

    1.2 对于SOC的学习

            这个阶段主要学习bootloader, Linux,文件系统,buildroot, yocto等基于linux系统的衍生技术。主要包括bootloader的开发,Linux驱动的开发,构建嵌入式文件系统,系统管理及配置等。由于Linux平台过于复杂,可以根据自己的兴趣爱好来分块研究。

    2. 学习嵌入式开发的准备

    嵌入式开发板:

            MCU: 我用的是正点原子的STM32F407的板子,烧录工具使用的是STLINK

            SOC:我用的是正点原子的IMX6ULL开发板,这个不需要烧录工具,有USB线就可以烧录

    虽然我使用的都是开发板,当然网上也有相应的教程,但我后面的内容还是跟网上的教程很不一样的。我会更多的去分享更深入的知识,以及结合我多年工作经验的总结,希望与大家共同交流,共同进步。

    3. 第一阶段的学习

            接下来的第一阶段我会基于STM32来展开我的博客,包括Cortex-M4的基础知识,基础硬件的知识,STM32的软件构造,启动逻辑,烧写逻辑,功能开发,系统移植,协议栈适配等内容。

            由于STM32使用比较广泛,文档也相对比较全面,网上还有很多基于STM32的DIY,所以使用STM32来做嵌入式入门的学习非常适合。

    4. 第二阶段的学习

            第二阶段的内容我会基于IMX6ULL来展开我的博客,本身我对IMX6/8系列就非常熟悉,到时会分享我在工作中所遇到的问题及相关经验的总结。

            主要的内容围绕bootloader的开发,驱动的开发,使用yocto或buildroot定制嵌入式文件系统,systemd系统管理,Linux驱动架构等内容展开。

    Note:

    由于我是一个Linux的狂热者,所以我的所有开发环境都是基于Linux系统(ubuntu), 我不会去使用KEIL等IDE,因为IDE会屏蔽软件的构造及芯片的原理,所以会很难真正了解它底层的原理。

            我的博客会很随意,涉及到什么知识就简单展开相关的内容和大家讨论,由于个人技术能力有限,希望大家不要吝啬您的评价,谢谢

    展开全文
  • 汽车电子技术——ECU/MCU软件开发1. ECU/MCU软件开发知识储备1.1 ECU/MCU相关基础知识1.2 C语言编程知识1.3 外围电路2 MCU开发板实践学习2.1 STM32F103开发板2.2 MDK5软件集成开发2.3 简单应用示例——流水灯 ECU...
  • Linux linux和windows的换行符有什么不同?...Linux开发用的是服务器还是虚拟机? 怎么把编译的镜像放到板子上? uboot的启动流程了解吗? Linux设备有几种类型? 为什么有时候linux需要关闭中断?想一个场景。 简介
  • 解决复杂软件开发效率低下的路径:模块化开发 (一个复杂的系统包含很多模块,每个模块都比较简单,这样来提高开发效率) 我们的设计会更改,修正。 我们为了避免得出一个高复杂的软件架构,我们应该...
  • 嵌入式软件开发是做什么的?要学哪些课程?

    千次阅读 多人点赞 2021-08-25 17:10:49
    一说到嵌入式开发,大多数人想到的是ARM、Linux、C++、安卓等等。 看了很多相关的入门学习文章,一脸茫然,这学习的东西也太多了吧?门槛也太高了吧? 我做了这个行业10年,现在...1.嵌入式软件开发是做什么的? 很
  • 文章目录嵌入式软件开发简介常用软件流程轮询方式中断驱动方式多任务系统C程序中的数据类型Cortex微控制器软件接口标准(CMSIS)CMSIS简介CMSIS-Core所做的标准化处理器外设的标准化定义访问处理器特性的标准化函数...
  • 以STM32裸机开发为例。 软件分层 应用层 驱动层 硬件层 固件层 ①最底层为固件层,Firmware 这一层通常是官方给的库,库函数对寄存器进行操作,例如: /** * @brief Transmits a Data through the ...
  • 嵌入式开发中的三种程序构架

    千次阅读 2020-12-30 11:54:18
    关注、星标公众号,直达精彩内容0、前言在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架...
  • 嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发。 我相信在嵌入式或...
  • 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 ...三、嵌入式软件开发1.(STM32、ARM、DSP、FPGA)微控制器底层开发【实时系统、库开发】1、嵌入式
  • 嵌入式开源RTOS架构

    2021-05-03 22:22:01
    RT-Thread 架构图: RT-Thread开发指南 开源地址 内核层:RT-Thread 内核,是 RT-Thread 的核心部分,包括了内核系统中对象的实现,例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等;libcpu/BSP...
  • 关注+星标公众号,不错过精彩内容作者 |梦人亦冷很多大学生、初学者总爱问一个问题:该不该放弃嵌入式、单片机这条路?以下是一位网友分享的嵌入式开发经历,希望可以帮到你。阶段 1大一到大三这...
  • 查找文件内容 查找文件 cat命令 GCC常用指令 预处理 编译为汇编代码(Compilation) 汇编(Assembly) 连接(Linking) 一步到位编译 多文件编译 忽略警告 GDB调试命令 内核中空间的分配函数有哪些 Linux驱动开发内容 ...
  • PLC转行嵌入式软件开发的辛路历程

    千次阅读 2021-02-06 10:21:28
    我是04年毕业的,毕业后一直在做PLC方面的工作,本以为...先说说我为什么想转嵌入式,第一原因当然是为了钱,各位可以去各大招聘网站了解一下。第二个原因,不想长期出差,我以有十年以上PLC工作经验来告诉大家,做P
  • 嵌入式工程师在企业工作的真实内容嵌入式软件开发具体可以分三类:嵌入式驱动工程师:编写和移植各种芯片驱动(如音频芯片),优化硬件设备驱动(如温湿度传感器),得精通各种硬件接口协议(如I2C协议)、系统调度、信号...
  • 来源 | IOT物联网小镇这可能是一个有争议的话题,到底需不需要,还是要结合实际情况。什么是架构设计1.架构设计概念的认识相信看这篇文章的同学,大部分都是从事嵌入式开发的,大家也肯定有这...
  • Rhapsody 可以根据设计意图开发,基于面向对象设计对应的uml: 类图,消息图,dataflow,顺序图, 可以生成对应的 c/c++ 代码。 提高了软件代码的复用,便于产品迭代。 提供了需求和代码的映射。链接。 简介如下:...
  • 我做了嵌入式单片机开发10年,有时做产品的时候经常会跟做机械、做外壳的工程师打交道。 工作话题之余,我们也会拉拉家常,最好奇的就是各自行业的一个待遇水平。 我碰到好几个做机械的,干了7,8年甚至有的10几年...
  • 嵌入式 软件架构浅谈

    2021-06-10 23:22:21
    一个好的软件框架,对于后续业务功能扩展开发、问题分析定位、功能维护都有着 “卓越” 的优点,为什么这么说呢?且听下面分析: 1、程序架构清晰明了、
  • 伴随着计算机软件技术的发展,嵌入式软件开发也在不断的变化更新。软件的发展离不开硬件的进阶。从早期的51单片机到高性能的dsp芯片再到当今基于ARM的高性能soc芯片遍地开花,嵌入式硬件的发展经历了快速化高性能化...
  • 遍历结果 中序遍历输出为:HDIBJEAFCG 结语 小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去...
  • 嵌入式软件工程师笔试面试指南-C/C++

    千次阅读 多人点赞 2021-04-15 17:43:11
    嵌入式软件笔试,嵌入式软件面试,程序员简历书写,Linux驱动工程师笔试,Linux驱动工程师面试,BSP工程师笔试,BSP工程师面试,应届生秋招,应届生春招,C/C++笔试题目,C/C++面试题目,C/C++程序员,BSP工程师
  • 点击上方“小麦大叔”,选择“置顶/星标公众号”福利干货,第一时间送达我从事嵌入式软件开发有6、7个年头,bsp,驱动,应用软件,android hall,framework等都有涉猎。平时...
  • 关注+星标公众号,不错过精彩内容作者 | strongerHuang微信公众号|嵌入式专栏为了方便大家平时公交、地铁、外出办事也能用手机回顾查看文章,我特意用心精选,并分类整理了部分文...
  • 关注+星标公众号,不错过精彩内容来源| 网络我从事嵌入式软件开发有6、7个年头,bsp,驱动,应用软件,android hall,framework等都有涉猎。平时除了关注嵌入式行业的发...
  • 全面认识海思SDK及嵌入式开发(1)

    千次阅读 2021-11-15 21:45:39
    目录一、全面认识和检测配套开发套装1、套装配件介绍2、检测开发板3、注意二、视频设备开发的技术流1、视频从产生到被消费的整个流程2、视频行业的商业角度分段3、几个疑问点 一、全面认识和检测配套开发套装 购买...
  • 在正规的项目开发中,项目往往是并行开发的,也就是说硬件设计、底层软件设计、应用软件设计等是同步进行的。比如说在开发板上调试模块驱动,在其他平台上调试应用程序再移植到目前这个平台等。嵌入式专...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,373
精华内容 23,749
关键字:

嵌入式软件开发架构