精华内容
下载资源
问答
  • 嵌入式软件架构设计

    热门讨论 2021-11-15 16:11:01
    嵌入式软件架构设计 如何设计一个好的软件架构,如何提高软件的扩展性,移植性,复用性和可读性? 很多做嵌入式开发的朋友经常会遇到这种情况:一个项目软件设计完成了,客户提出了一些新的功能需求。这时侯如果客户...

    如何设计一个好的软件架构,如何提高软件的扩展性,移植性,复用性和可读性?

    很多做嵌入式开发的朋友经常会遇到这种情况:一个项目软件设计完成了,客户提出了一些新的功能需求。这时侯如果客户新需求不多,软件增加一些新功能即可,但是增加新功能后程序容易出现各种异常问题;这时侯如果客户新需求很多,导致软件全局很多地方需要修改,甚至有可能导致软件重写。造成这种结果的原因是,软件设计没有遵循软件设计原则,没有使用正确的设计模式和正确的软件架构。

    软件设计五大原则:单一原则 ,开闭原则,里氏代换原则,接口隔离原则,依赖倒置原则。

    27种设计模式:适配器模式,装饰模式,观察者模式,迭代器模式,拜访者模式等等(不一一列举)。

    软件架构:分层架构,过滤器架构,插件架构,MVC架构等等。

    规则和方法繁多,往往难以融会贯通地使用到实际项目中,接下来我用一个项目来介绍如何遵循软件设计原则,如何使用良好的设计模式和架构,这个项目是一个用于智能家具系统的网关软件设计项目。

    我们先来了解一下智能家居系统,它是由网关,智能触控屏,控制模块,检测模块等组成,实现对家居设备智能控制。该系统可以控制灯,空调,窗帘,蓝牙音乐,地暖等家居设备。用户可以通过语音指令,智能触控屏,手机APP,电脑云端等方式监控家居设备状态。该系统应用场景如图:
    在这里插入图片描述
    网关功能描述

    智能家居系统的控制枢纽是网关,网关的主要任务是实现对触控模块,控制模块,检测模块的状态监测和控制。网关的功能如下:

    1、使用嵌入式以太网控制器硬件实现TCP访问局域网内的本地服务器和外网的云端服务器。本地服务器可以配置网关参数,可以通过网口对网关固件进行升级,用户通过手机APP使用云端服务器下发数据给网关。

    2、使用485总线接收面板的和环境传感器的上报数据,分析数据并下发485指令操作开关控制器实现对执行单元的控制。

    3、用户可以通过扩展的输入输出IO口,实现简单的开关输入和控制。

    网关硬件描述

    网关的硬件使用华大的HC32F460单片机为核心,外围设备有485电路,RTC电路,LCD电路,以太网控制器电路,IO控制电路。网关的硬件框图如下:
    在这里插入图片描述
    软件框架

    网关软件使用FreeRTOS操作系统,采用了模块化设计方法,每个功能独立成一个模块,每个单独的模块采用了分层设计。软件框架图如下:
    在这里插入图片描述
    软件使用了模块化设计的方法,模块化设计核心思想就是“分而治之”, 就是把一个复杂的问题分解为若干个简单的问题,然后逐个解决。在嵌入式软件设计中通常以硬件外设划分模块如:485模块,RTC模块,LCD模块,温湿度模块,ADC数据采集模块,GPIO控制模块等。模块化设计提高了软件系统的扩展性,模块可以根据需求布署和删除,模块化设计遵循了单一原则。软件工程源码中模块的划分如下:
    在这里插入图片描述
    单独的功能模块采用了的分层设计,分层设计的核心思想也是“分而治之”,分层设计将软件功能水平分割成合理的多个子系统,软件中紧密关联的部分被集中放在一个层内。分层设计的框图如下:
    在这里插入图片描述
    分层架构有以下优点:

    1、每一层都把一个具体功能抽象化。

    2、可以降低代码的相互依赖程度,更改代码时影响的层很少。

    3、层可以被复用。

    软件工程源码中GPIO任务的BSP层代码如下:
    在这里插入图片描述
    每个层都有一个xxxx_interface()函数,上层文件通过这个函数使用下层提供的服务,这种设计原则为接口隔离原则。3层模型的调用关系图如下:
    在这里插入图片描述
    每个功能模块采用了3层的分层设计,第1层处理MCU寄存器相关操作,第2层处理驱动控制和逻辑控制,第2层用来处理与其他业务模块的数据交互.分层设计提高了软件系统的移植性,如果项目更换了MCU那么只用修改第1层,如果更换改了外设那么只用修改第2层,如果更改了业务逻辑那么只用修改第3层。

    任务之间通信

    网关软件中的普通任务相互隔离,所有普通任务只与消息推送任务进行数据交互,消息推送任务将消息推送给相应任务。各个任务之间的信息交互模式如下:
    在这里插入图片描述
    这种设计模式为中间者模式。在中间者模式,对象之间不能直接通信,而是间接地通过中间者进行通信。中间者收到信息后,再将信息转发给相关对象,这样减少了对象之间的相互依赖。中间者模式有以下优点:

    1、对象之间是松耦合

    2、将多对多的关系通过中间者转换成一对一的关系

    3、修改一个对象,不需要考虑其它对象通信适应问题。

    消息推送任务采用订阅与发布机制。普通任务状态改变向消息推送任务发布消息,推送任务获取发布任务的发布信息名称,并一层检查其他任务的订阅信息名称,是否包含发布信息名称,然后将信息推送给相关任务。这样减少了任务之间的耦合,提高了软件的扩展性。消息推送任务代码如下:
    在这里插入图片描述
    业务控制

    网关软件使用模块化设计,普通任务不参入软件的整体业务控制,每个普通任务只负责完成模块内部的控制逻辑,如RTC任务时负责设置时间和读取时间,GPIO只负责读取IO口和控制IO口。软件设计了一个特殊的逻辑控制任务,这个任务负责记录软件整体状态,并通过发布消息改变其他的任务的状态。这种也是使用的中间者模式。逻辑框图如下:
    在这里插入图片描述
    逻辑控制任务是通过发布特定的消息来实现对子任务的控制,子任务状态改变后也是通过发布消息通知逻辑控制任务。

    逻辑控制任务分析

    网关软件中逻辑控制任务控制整个程序运行状态,因此逻辑控制任务设计非常关键,逻辑控制任务设计软件设计框架如下:
    在这里插入图片描述
    子任务将信息发布给逻辑控制任务,由于不同的子任务发布的消息格式不同,数据长度不同,因此逻辑控制任务先用指令归一化接口,将不同模块的不同格式的数据转换成逻辑任务中统一的数据格式如:指令类型+指令数据。代码如下:
    在这里插入图片描述
    指令归一化处理后将指令放入队列缓存器中,然后指令过滤器读取队列缓存器中的指令进行处理,这种设计模式为命令模式,这种设计模式可以把一个命令的形成和执行在时间上去耦,命令的生成和执行可以在不用时间完成。

    指令过滤器从指令队列中读取指令,并一层一层处理指令得到有效的执行指令,这种设计构架为过滤器构架,代码如下:
    在这里插入图片描述
    经过逻辑处理后产生一些控制指令,并将控制指令放入队列缓存,指令分发处理模块读取控制指令,根据控制指令类型发布消息给相应的任务。

    总结

    网关的软件框架基本描述完了,希望获取源码的朋友们可以在评论区里留言,我将提供学习源码(删减部分与商业相关代码)。

    总结一下关键词:

    模块化设计,分层设计,单一原则,接口隔离原则,中间者模式,订阅发布,归一化,命令模式,过滤器架构

    创作不易希望朋友们点赞,转发,关注。希望获取源码的朋友们在评论区里留言。
    作者:李巍
    Github:liyinuoman2017

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

    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.良好的学习能力及团队领导力,喜欢挑战。

    展开全文
  • 在正规的项目开发中,项目往往是并行开发的,也就是说硬件设计、底层软件设计、应用软件设计等是同步进行的。比如说在开发板上调试模块驱动,在其他平台上调试应用程序再移植到目前这个平台等。嵌入式专...

    在正规的项目开发中,项目往往是并行开发的,也就是说硬件设计、底层软件设计、应用软件设计等是同步进行的。比如说在开发板上调试模块驱动,在其他平台上调试应用程序再移植到目前这个平台等。

    嵌入式专栏

    1

    为什么很少看见嵌入式软件架构师职位

    在招聘网站搜索架构师,会出现各种系统架构师:web架构师,后台服务端架构师等等,但是唯独很难看到嵌入式软件架构师。嵌入式软件不需要架构吗,驱动不需要架构吗?

    答案当然是需要,不过为什么没有这方面的职位?

    一般的人会说,小项目才用单片机,实现功能简单,无需太多人参与,所以无需注重软件设计。其实是很幼稚的观点(刚毕业时我也是这样认为的)。

    目前国内的嵌入式开发主要分为嵌入式底层开发和嵌入式应用开发,嵌入式的底层开发一般叫做驱动开发,或者bsp开发,有时也有称之为linux内核开发,名字听着都很高大上的感觉。

    而嵌入式上的应用开发,一般业务逻辑比较简单,被很多人忽略,所以招聘方也会感觉没必要招架构师级别的了。

    嵌入式专栏

    2

    嵌入式软件架构的好处

    为什么有人觉得没必要有嵌入式软件架构设计,那可能你做的项目只是流水灯级别吧。

    当然,不能说完全需要,至少对于大多数项目而言,都需要有一个软件架构设计,好处也是有很多,这里罗列一些:

    1、应用的代码逻辑清晰,且避免重复的造轮子。

    2、如果没有好的架构,移植将会是一件很痛苦的事情。

    3、方便后期维护和升级。

    4、最大限度的复用。

    5、高内聚低耦合。 

    嵌入式专栏

    3

    嵌入式软件架构设计之分层设计

    经典的linux arm配置属于资源比较丰富,高配的嵌入式系统,其操作系统本身就很强大,软件设计也变得水到渠成。

    本文所要提到的嵌入式,其实更偏向于单片机,结合一个案例给大家讲讲分层设计。以MCU IAR为例,讲讲把底层软件和应用软件分开。

    第一种方式把底层软件生成一个静态库提供給应用。但是这样就会有一个问题,如果静态库改变了,得重新编译,然后提供給应用,应用程序也得重新编译一下,这显然是很麻烦的一种处理方式。

    另外一种方式底层软件和应用软件是两个独立的bin文件,姑且叫libdev.bin和app.bin。非操作系统的嵌入式是没有动态库.so这样一说的,不过底层软件这个可执行文件姑且就认为是app的.so吧。

    这两个bin文件通过配置icf,映射到不同的flash空间以及分配不同的RAM空间。显然,这两个bin文件的关系是app.bin会调用libdev.bin的实现。

    但是他们是独立的bin文件,如何关联起来呢。这事就需要一个函数表告诉app.bin到哪里去调用libdev.bin里面的函数实现。要实现这个函数表,就需要有统一的函数接口才方便管理。这个函数表可用静态库.a实现(libdev.a)。libdev.a的功能就是要映射所有libdev的接口函数,使app调用某一接口函数时,可以跳转到libdev.bin里面执行。

    具体设计思路:

    1.函数表用结构体的方式实现,结构体元素为函数指针。

    struct libdev_ops{ 
       int (*dev_PortOpen)(int PortNum, char *PortParm);
    };
    

    2.在libdev.bin里面,对结构体里面的函数指针赋值。

    void libdev_ops_init(struct libdev_ops *ops){
      ops->dev_PortOpen = dev_PortOpen;//把函数地址赋给对应的函数指针
    }
    

    3.程序启动时,先进入libdev.bin,然后再跳转到app.bin。在此需要一个地址跳转函数(在libdev.a里面)。

    struct libdev_ops ops;
    void call_app(int addr)
    { 
       int (*startup)(struct libdev_ops *ops);    
       startup = (int(*)(struct libdev_ops *))(addr);    
       libdev_ops_init(&ops);    
       startup(&ops);
    }
    

    4.重新封装所有函数,如下:

    int dev_PortOpen(int PortNum, char *PortPara)
    { 
       return ops->dev_PortOpen(PortNum,PortPara);
    }
    

    5.实现libdev.bin需要跳转地址的函数(在app.bin)。

    void common_startup(struct libdev_ops *libdev_ops)
    {
        ......    
        ops = libdev_ops;    
        dev_printf = ops->printf;//printf为不定参函数,不能在步骤2中进行赋值,所以在静态库里进行初始化赋值。    
        main();//跳到app的main中
    }
    

    6.app.bin程序的启动地址修改,修改 IAR配置

    进入options--linker--library--勾选override default program entry,在Entry symbol 后面输入common_startup。

    7.因为有两个.bin程序。所以就需要配置icf文件,并且call_app(addr)这个addr为app.bin里面common_startup函数的地址。因此需要编译app.bin后在output文件里面的app.map里面查看common_startup的地址是多少(由于这个函数是程序最先执行的函数,所以其地址为icf配置的起始地址)。

    8.然后你在应用里面包含了dev_PortOpen函数的头文件就可以正常调用这个函数了。

    因为libdev.bin和app.bin是同时运行的(app.bin调用的libdev函数的实现在libdev.bin里面),因此必须把RAM和ROM分成两份,不得重叠。

    声明:

    本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

    展开全文
  • 关注「嵌入式大杂烩」,选择「星标公众号」一起进步!在实际的项目开发中,项目往往是并行开发的,也就是说硬件设计,底层软件设计,应用软件设计是同步进行的。比如说在开发板上调试模块驱动,在其他平...

    关注「嵌入式大杂烩」,选择「星标公众号」一起进步!

    在实际的项目开发中,项目往往是并行开发的,也就是说硬件设计,底层软件设计,应用软件设计是同步进行的。比如说在开发板上调试模块驱动,在其他平台上调试应用再移植到目前这个平台等。

    这里又涉及到如何提高嵌入式应用软件的可移植性的问题,这个问题在下一篇博文中专门讲解,敬请期待。要想开发的应用程序在不同的嵌入式平台上具有高效率的可移植性,像Android sdk一样,统一的接口规范是必须的。

    本文所要提到的嵌入式,其实更偏向于单片机。因为经典的linux+arm配置属于资源比较丰富,高配的嵌入式系统,其操作系统本身就很强大,软件设计也变得水到渠成。

    一般的人会说,小项目才用单片机,实现功能简单,无需太多人参与,所以无需注重软件设计。其实是很幼稚的观点(刚毕业时我也是这样认为的)。

    因为目前mcu的处理速度,和实现功能已经可以满足很多项目的要求了。并且这些项目的软件也是越来越复杂。因此注重单片机类嵌入式软件设计是项目前期必须考虑的工作。

    下面具体讲解单片机软件开发的分层设计思路。本例子所使用的是飞思卡尔K21 MCU,IAR编译器。本文主题是讲软件分层,也就是底层软件和应用软件分开。

    当然可以把底层软件生成一个静态库提供給应用。但是这样就会有一个问题,如果静态库改变了,得重新编译,然后提供給应用,应用程序也得重新编译一下,这显然是很麻烦的一种处理方式。

    于是我们可以用另外一种思路去实现:底层软件和应用软件是两个独立的bin文件,姑且叫libdev.bin和app.bin。非操作系统的嵌入式是没有动态库.so这样一说的,不过底层软件这个可执行文件姑且就认为是app的.so吧。这两个bin文件通过配置icf,映射到不同的flash空间以及分配不同的RAM空间。

    显然,这两个bin文件的关系是app.bin会调用libdev.bin的实现。但是他们是独立的bin文件,如何关联起来呢。这事就需要一个函数表告诉app.bin到哪里去调用libdev.bin里面的函数实现。要实现这个函数表,就需要有统一的函数接口才方便管理。这个函数表可用静态库.a实现(libdev.a)。

    libdev.a的功能就是要映射所有libdev的接口函数,使app调用某一接口函数时,可以跳转到libdev.bin里面执行。如何实现上述思路,下面用一个具体实例讲解:

    「1.函数表用结构体的方式实现,结构体元素为函数指针。」

    eg:

    struct libdev_ops{
        int (*dev_PortOpen)(int PortNum, char *PortParm);
    };
    

    「2.在libdev.bin里面,对结构体里面的函数指针赋值。」

    eg:

    void libdev_ops_init(struct libdev_ops *ops){
        ops->dev_PortOpen = dev_PortOpen;//把函数地址赋给对应的函数指针
    }
    

    「3.程序启动时,先进入libdev.bin,然后再跳转到app.bin。在此需要一个地址跳转函数。」

    eg:

    struct libdev_ops ops;
    void call_app(int addr)
    {
        int (*startup)(struct libdev_ops *ops);
        startup = (int(*)(struct libdev_ops *))(addr);
        libdev_ops_init(&ops);
        startup(&ops);
    }
    

    在libdev.a里面

    「4.重新封装所有函数,如下:」

    int dev_PortOpen(int PortNum, char *PortPara)
    {
        return ops->dev_PortOpen(PortNum,PortPara);
    }
    

    「5.实现libdev.bin需要跳转地址的函数」

    eg:

    void common_startup(struct libdev_ops *libdev_ops)
    {
        ......
        ops = libdev_ops;
        dev_printf = ops->printf;//printf为不定参函数,不能在步骤2中进行赋值,所以在静态库里进行初始化赋值。
        main();//跳到app的main中
    }
    

    在app.bin

    「6.app.bin程序的启动地址修改,修改 IAR配置」

    工程名字--options--linker--library--勾选override default program entry,在Entry symbol 后面输入common_startup。

    「7.配置icf文件」

    因为有两个.bin程序。所以就需要配置icf文件,并且call_app(addr)这个addr为app.bin里面common_startup函数的地址。因此需要编译app.bin后在output文件里面的app.map里面查看common_startup的地址是多少(由于这个函数是程序最先执行的函数,所以其地址为icf配置的起始地址)。

    「8.然后你在应用里面包含了dev_PortOpen函数的头文件就可以正常调用这个函数了。」

    因为libdev.bin和app.bin是同时运行的(app.bin调用的libdev函数的实现在libdev.bin里面),因此必须把RAM和ROM分成两份,不得重叠。

    来源:https://blog.51cto.com/kenotu/1614390

    本文来源网络,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

    猜你喜欢:

    往期推荐

    从零开始开发一款嵌入式产品的一些经验(长文,收藏细读)

    嵌入式那么大杂烩,哪些方向比较有钱途?

    一个高效的BootLoader与APP固件合并方法

    带你快速对比SPI、UART、I2C通信的区别与应用!

    一个清晰的LCD驱动编写思路(附代码分析)

    展开全文
  • CSDN,GIT等各大论坛上很多文章都有讲,如何设计项目的嵌入式软件架构,But门槛实在太高了,需要懂什么软件架构设计的生命周期,画用例图,写用例描述,画鲁棒图,归纳子系统,分层,分模块等等,实不相瞒这些没有...
  • 基于此,提到简单嵌入式系统的软件架构,我脑海中立马浮现这样的画面: 看到这张图,不同的人,可能会有不同的感受:有的高手能一眼看破,能马上进行万千补充、引申;有的会心领神会,从而期待后面的内容;而有的,...
  • 软件分层 应用层 驱动层 硬件层 固件层 ①最底层为固件层,Firmware 这一层通常是官方给的库,库函数对寄存器进行操作,例如: /** * @brief Transmits a Data through the SPIx/I2Sx peripheral. * @...
  • 深度:嵌入式系统的软件架构设计 1. 前言 嵌入式是软件设计领域的一个分支,它自身的诸多特点决定了系统架构师的选择,同时它的一些问题又具有相当的通用性,可以推广到其他的领域。 提起嵌入式软件设计,...
  • 关注、星标公众号,直达精彩内容来源:嵌入式云IOT技术圈| veryarm1. 前言嵌入式软件设计领域的一个分支,它自身的诸多特点决定了系统架构师的选择,同时它的一些问题又具有相当的通...
  • 嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。 软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发。 我相信在嵌入式或...
  • 点击上方“小麦大叔”,选择“置顶/星标公众号”福利干货,第一时间送达前言在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠...
  • 在工作中经过摸索实验,总结出单片机大致应用程序的架构有四种: 1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用程序即可。 2.状态机 3. 时间...
  • 嵌入式开源RTOS架构

    2021-05-03 22:22:01
    RT-Thread 架构图: RT-Thread开发指南 开源地址 内核层:RT-Thread 内核,是 RT-Thread 的核心部分,包括了内核系统中对象的实现,例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等;libcpu/BSP...
  • 关注、星标公众号,直达精彩内容来源:网络素材| ZeroMing222这系列开始谈软件上面的设计,对设计模式在面向对象里面应该各位都知道,或许你在实际开发当中用到,也或许你见过别人的代码...
  • (5)现在自己公司闭源的nav系统 三、搭建软件架构示例 (1)麦轮小车STM32程序架构 (2)四足机器人软件系统架构设计 (3)NAVOS 总结 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同...
  • 嵌入并发,意味着多...声明:文章基于《C嵌入式编程设计模式》这本书,英文是DesignPatternsforEmbeddedSystems in C。主要是做个笔记,并添加一点个人的理解,分享出来与各位探讨。 1.嵌入并发和资源管理的设计...
  • 关注+星标公众号,不错过精彩内容来源| 网络我从事嵌入式软件开发有6、7个年头,bsp,驱动,应用软件,android hall,framework等都有涉猎。平时除了关注嵌入式行业的发...
  • 本文针对中高端嵌入式软件产品的开发,提出了一种多进程的开发框架。使用该框架,可以实现多人并行开发,加快产品开发周期,提供产品稳定性,是一种有益的尝试。 关键字:框架 多进程 嵌入式软件 0 引言 ...
  • 它具有很强的灵活性,主要由嵌入式硬件平台、相关支撑硬件、嵌入式操作系统、支撑软件以及应用软件组成。其中,“嵌入性”、“专用性”与“计算机系统”是嵌入式系统的三个基本的核心要素,具体来讲: 嵌入性:指...
  • 点击上方“小麦大叔”,选择“置顶/星标公众号”福利干货,第一时间送达我从事嵌入式软件开发有6、7个年头,bsp,驱动,应用软件,android hall,framework等都有涉猎。平时...
  • 每当面对这个问题的时候,其实我也是一脸懵逼状态的,这些问题真心很不好回答,说少了,有敷衍的嫌疑,说多了,又是长篇大论,于是为了解答这个问题我决定写下这篇文章,暂定的名字叫《嵌入式系统架构师之道》。...
  • 嵌入式开发中的三种程序构架

    千次阅读 2020-12-30 11:54:18
    关注、星标公众号,直达精彩内容0、前言在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架...
  • 关注+星标公众号,不错过精彩内容作者 | strongerHuang微信公众号|嵌入式专栏为了方便大家平时公交、地铁、外出办事也能用手机回顾查看文章,我特意用心精选,并分类整理了部分文...
  • 远程教学录播系统得到了广泛的应用,但是不同厂家产品不一定能兼容...在选购的过程中又如何区别PC架构上与嵌入式架构呢?下面跟随捷视飞通小编一起来了解下。PC架构的录播主机也叫做工控式录播主机。这种PC架构录播...
  • 中断服务程序中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序(ISR),类似于__interrupt、#program interrupt等。当一...
  • 嵌入式应用软件架构

    2021-03-19 12:57:05
    嵌入式应用软件架构架构1: 顺序执行(前后台系统)架构2: 时间片轮询架构3: 嵌入式实时操作系统 参考文献: 《ARM嵌入式应用程序架构设计实例精讲》 架构1: 顺序执行(前后台系统) 架构2: 时间片轮询 架构3: ...
  • 嵌入式工程师在企业工作的真实内容嵌入式软件开发具体可以分三类:嵌入式驱动工程师:编写和移植各种芯片驱动(如音频芯片),优化硬件设备驱动(如温湿度传感器),得精通各种硬件接口协议(如I2C协议)、系统调度、信号...
  • 来源 | IOT物联网小镇这可能是一个有争议的话题,到底需不需要,还是要结合实际情况。什么是架构设计1.架构设计概念的认识相信看这篇文章的同学,大部分都是从事嵌入式开发的,大家也肯定有这...
  • 嵌入式硬件平台、相关支撑硬件、嵌入式操作系统、支撑软件以及相应的应用软件。 3. 嵌入式系统的特点 ①专用性强;②实时性强;③软硬件依赖性强;④处理器专用;⑤多种技术紧密结合;⑥系统透明性;⑦系统资源...
  • 汽车电子技术——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...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,216
精华内容 21,286
关键字:

嵌入式软件架构设计