精华内容
下载资源
问答
  • 嵌入式开发代码优化

    2021-08-21 15:49:53
    2.如何减少代码耦合性 1)关于flag的使用 A.尽量使用该模块下可以代替Flag的方式实现,如读取状态等。(tim) B.也可以使用系统级机制实现,如互斥信号量。 C.实在需要使用,则尽量只在本模块中使用,尽量不要...

    1.如何减少CPU消耗

    1)在一个任务或者线程中,如果以频繁轮询的方式工作,将很耗CPU。

    如while(1);此时,可以将轮询改为信号量等,给CPU减负。

    2.如何减少代码的耦合性

    1)关于flag的使用

    A.尽量使用该模块下可以代替Flag的方式实现,如读取状态等。(tim)

    B.也可以使用系统级机制实现,如互斥信号量。

    C.实在需要使用,则尽量只在本模块中使用,尽量不要在其他文件中调用。

    展开全文
  • 低耦合高内聚 原则的应用

    千次阅读 2017-08-25 23:59:53
    这次主要是分享对软件设计中的“低耦合、高内聚”原则的一些个人体会,通过lorawan代码等实例分析,让大家对这个设计思想有更具象的理解。

    这次主要是分享对软件设计中的“低耦合、高内聚”原则的一些个人体会,通过lorawan代码等实例分析,让大家对这个设计思想有一些具象的理解。

    本文作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/

    前言

    “低耦合、高内聚”,乍听一下特别有逼格,瞬间让我们这次培训高大上了不少。

    在一些设计模式的书籍,以及一些面向对象的书籍中,常常会看到这个词。设计模式主要是软件工程领域,特别是面向对象编程这个领域,大家原本都用一些很笨的办法在写代码,后面慢慢有一些人发现一些小技巧,可以让代码更易读、更易维护,再后来一些偏学术型的大牛,把一些常见的设计思路提炼提炼出来,就成了我们现在听到的设计模式。

    因此今天要讲的耦合coupling,最早就是来自于面向对象编程。

    那它是什么意思呢?

    说下概念

    作为一个正经的培训,我们来看看书中对它的定义:

    耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息

    内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。

    所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。

    对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合。

    举个通俗的例子

    这个例子是《大话设计模式》中介绍的,我觉得还挺有意思。

    三国时期,(卧槽,三国时期? 嗯,三国时期),曹操在灭掉北方势力之后,带领百万大军攻打东吴,眼看就要灭掉东吴,统一天下,于是大宴众文武。酒席间,曹操诗兴大发,不觉吟道:“喝酒唱歌,人生真爽。……”。众文武齐呼:“丞相好诗!”于是一臣子速命印刷工匠刻板印刷,以便流传填下。

    样张出来给曹操一看,曹操感觉不妥,说道:“喝与唱,此话过俗,应改为‘对酒当歌’较好!”,于是此臣就命工匠重新来过。工匠眼看连夜刻版之工,彻底白费,心中叫苦不喋。只得照办。

    样张再次出来请曹操过目,曹操细细一品,觉得还是不好,说:“人生真爽太过直接,应改问语才够意境,因此应改为‘对酒当歌,人生几何?…………’!”当臣转告工匠之时,工匠卒…………

    这里的刻板就是一个耦合体,所有的字都耦合在一块板子上。如果我们能单独对某个字进行修改,降低字与字之间的耦合,那就轻松多了。

    喝酒唱歌,人生真爽。
    对酒当歌,人生几何。

    一大段的短歌行,这样只要改4个字。北宋的毕昇就是这样想的,于是活字印刷术诞生了。

    怎么做

    虽然说耦合性、内聚性是联系紧密程度的度量,但它是个挺虚的概念。我们只能想办法去尽量的实现“低耦合、高内聚”。

    那究竟怎么做呢?

    方法一 从总体结构上分解系统

    这应该是最容易想到的办法,把复杂的系统“化整为零,各个击破”。功能上分解开了,一个模块实现一个独立的功能,自然就不耦合在一起了。

    这在软件设计上,称之为 单一职责原则SRP(Single Responsibility Principle)。

    比如我们早先的演示代码,就将各种业务功能与LoRa传输杂糅在一个模块里。

    有一个我印象很深的例子,就是LoRaWAN的协议文档。原本协议框架及命令等,是和各个国家的地区参数一起发布的,后来由于LoRaWAN逐步应用过程中肯定会有很多新区域加进来,为了不影响旧有协议文档主体,所以从V1.0.2版本开始,联盟把地区参数这块内容单独出来。这就是一个解耦的例子。

    方法二 从层级上提炼出抽象层

    依赖倒转原则DIP(the Dependency Inversion Principle DIP),这个原则是 Martin, Robert C 在1996年提出来的。

    A. High-level modules should not depend on low-level modules. Both should depend on abstractions.
    B. Abstractions should not depend on details. Details should depend on abstractions.

    具体怎么讲呢?

    这是传统的设计思路:

    In conventional application architecture, lower-level components are designed to be consumed by higher-level components which enable increasingly complex systems to be built. In this composition, higher-level components depend directly upon lower-level components to achieve some task. This dependency upon lower-level components limits the reuse opportunities of the higher-level components.

    这是DIP原则的实现方式:

    DIP中提出了一个抽象接口。抽象接口是对低层模块的抽象,低层模块按要求来实现这个抽象接口。高层模块不直接依赖低层模块,而是依赖这个抽象接口。
    所以,原本是高层依赖低层的情况,通过这个抽象接口操作,反而变成了低层模块要向上依赖这个抽象接口。这就是依赖倒转。

    这样做的好处就是,高层模块和低层模块的耦合降低,高层模块的复用性极大的增强了。

    事实上,这个思路大家应该都清楚。特别是我们嵌入式界,面对茫茫多的硬件设备,提炼出稳定的硬件抽象层,就显得特别重要。这样很多模块都可以复用。

    这个方法在LoRaWAN协议栈中有一些运用。

    关于这个Radio的用法,据我所知,物联网OS排行榜的第一名contiki也是这样定义的。

    方法三 模块间尽量做到单向依赖

    第三种方法,也是大家常会遇到的。

    假设A是上层,B是它的下层,A依赖B。假如B也直接依赖A,那就可能造成循环依赖。比如说编译A模块时需要包含到B模块的文件,而编译B时同样要直接包含到A的文件。这种情况下,A和B的耦合就比较严重了。

    单向依赖,就是说A模块可以调用B模块暴露的API,但B模块绝不允许调用A模块的API。

    比如刚才提到的LoRaMac就有这种情况,当发数据时,是MAC传递给Radio,但接收数据时,是Radio传回给MAC。

    这种情况下,就变成MAC和Radio循环依赖,这样子耦合就变得很严重。如果我们要换一个MAC,比如不走LoRaWAN的协议,那Radio中原来MAC的接口也要相应的变化。

    我们最常见的办法是设置回调,这个例子中,MAC把接收函数以回调形式通过注册函数注入到Radio中,这样MAC还是依赖Radio的注册函数。

    如下,MAC把接收函数注入到Radio中。

    void LoRaMacInitialization(void)
    {
        RadioEvents.TxDone = OnRadioTxDone;
        RadioEvents.RxDone = OnRadioRxDone;
        RadioEvents.RxError = OnRadioRxError;
        RadioEvents.TxTimeout = OnRadioTxTimeout;
        RadioEvents.RxTimeout = OnRadioRxTimeout;
        Radio.Init( &RadioEvents );
    }
    

    Radio 接收数据后,处理回调函数

    void SX1276OnDio0Irq( void ) 
    {
        if( ( RadioEvents != NULL ) && ( RadioEvents->RxDone != NULL ) )
        {
            RadioEvents->RxDone( RxTxBuffer, SX1276.Settings.FskPacketHandler.Size, SX1276.Settings.FskPacketHandler.RssiValue, 0 );
        }
    }
    

    总结

    今天这篇分享,主要从“总体结构”->“系统层级”->“模块间”这三个从大到小的层面,分享了代码设计上解耦的一些思路。

    希望对大家有所启发。


    展开全文
  • 从踏入编程世界开始,无论是在学习理论知识的课本上,还是在进行项目过程中,我们经常听到大家一次次的念叨“代码模块尽量做到低耦合、高内聚“”,那么什么是耦合?怎样做到低耦合?怎么进行解耦合实现低耦合,下面...

           从踏入编程世界开始,无论是在学习理论知识的课本上,还是在进行项目过程中,我们经常听到大家一次次的念叨“代码模块尽量做到低耦合、高内聚“”,那么什么是耦合?怎样做到低耦合?怎么进行解耦合实现低耦合,下面我一条条给大家说

          耦合指的就是两个类之间的联系的紧密程度。比如有A和B两个类,B类的参数,必须是A,那么这个两个类之间的耦合就是非常强的。如果A类和B类全部实现一个接口IBase,此时有一个C类的参数是IBase类型,则C类参数类型可以是A或者B,耦合度就会大大降低。

           解除耦合一个很常用的方式就是解除类与类之间的直接关系,比如:在关系之间加入接口,不依赖具体的类(在机房收费系统的项目中工厂层,就是选用了IDAL接口层作为中介,不在依赖于具体的类型,从而降低了耦合度);或者使用设计模式,在设计模式中有很多模式也都是加入一个中间类来解决之间的关系,比如中介者模式,适配器模式等等。

           分层也是解除耦合的一个方式,不过是一个比较大的范围之间。分层是为了降低各层之间的依赖程度,在变动某一层的功能时不会影响到其他内容。分层将相同的内容归拢到一起,使代码更有条理,更容易维护,特别是在大型的软件开发过程中,每个人分别负责相应的内容,专注于某一单独功能的开发

    展开全文
  • 嵌入式c代码测评心得

    2019-04-03 10:50:50
    高内聚,松耦合,高扇入,合理扇出 高内聚: 内聚是函数内各个元素彼此结合的紧密程度。越紧密代表了函数的独立性越强。 松耦合: 耦合是一个软件结构内不同函数之间互连程度的度量,耦合性也叫块间联系。模块...

    函数式编程要归结于一句话:
    高内聚,松耦合,高扇入,合理扇出

    高内聚:
    内聚是函数内各个元素彼此结合的紧密程度。越紧密代表了函数的独立性越强。
    松耦合:
    耦合是一个软件结构内不同函数之间互连程度的度量,耦合性也叫块间联系。模块之间尽量有紧密联系
    高扇入:
    扇入是一个函数被其他函数调用的次数。被调用越多代表这个函数价值越高
    合理扇出(<7):
    扇出是一个函数内部调用其他函数的次数,调用函数越多,当其中一个函数变化时会影响被调用函数。
    嵌入式c也是有单元测试的,例如 CUnit,主要是断言和log显示结果~~以后再分析

    公司采用的都是华为规范来进行代码测评

    1,逻辑连接符需加括号

    extern BOOL get_bool ( void );
    void static_49(void)
    {
       BOOL flag = TRUE;
       INT_32 y = 0, x = 0, z = 1;
       if (x < 0 || z + y != 0)  /* not compliant - 逻辑运算符两边运算要加括号 */
       {
          flag = FALSE;
       } 
       if ( flag && get_bool() )  /* not compliant - 设置206可不报错,否则报错 */
       {
          flag = FALSE;
       }    
    }
    

    2,存在空语句

    if(1)
    {
    		/*如果空语句是故意的,添加一个/**/*/
    }
    
    

    3.对有符号类型位操作
    对有符号数进行位操作时非常不安全的行为。例如,与(&)或者或(|)操作符对于结果的执行时非常明确地,这就有可能导致标志位丢失,或者把数值换到了符号位当中。

    void static_120(void)
    {
       SINT_32 b = 1;
     
       b = b | 1; /* not compliant */
     }
    
    

    4,复杂表达式中使用VOLATILE变量
    volatile变量的值可能在使用过程中而被改变(非控制改变)。这个标准可以把在表达式中使用相同volatile变量多于一次的表达式报告出来。因为返回的值有可能是各个阶段表达式的值,所以有可能是不一样的,这种情况是不安全的。安全的做法是在简单不可再优化表达式中只使用变量一次。如果需要在所有表达式的部分中使用同样的值,最好是把当前值保留在一个局部变量中,用局部变量来代表volatile变量,再用于表达式当中。

    volatile UINT_32 v = 1U;
    UINT_32 x, a;
    x = v*v; /* this is unsafe, v could change*/ 
    a = v;
    x = a*a; /* this is safe, the value of v was captured */ 
    
    

    5,有符号/无符号间无强制类型转换
    不同类型之间的转换需要使用显式强制类型转换,以说明类型转换是人为的,不存在无意中丢失的信息(或已知晓会丢失)。默认类型转换是比较有代表性的定义操作,这种操作有可能导致未定义的行为发生。

    void static_434(UINT_32 us1)
    {
      SINT_32 ss1 = us1;  /* converting to signed may result in a loss of information */ 
      /* ... */ 
    }
    
    

    6,默认转换为范围更窄整型
    转换成一个更小范围的类型需要使用强制类型转换,以说明类型转换是人为的,不存在无意中丢失的信息(或已知晓会丢失)。默认类型转换是比较有代表性的定义操作,这种操作有可能导致未定义的行为发生。

    static void static_446 ( void )
    {
      UINT_16 u16;
      UINT_32 u32a,
              u32b;
     
      u16 = u32a + u32b;  /* not compliant – 会默认从32位转换成16位 */ 
    }
    
    

    7,if,else需要加括号
    8,枚举初始化

    enum (x,y,z)	       /*GOOD (unless type 377 is set) – 未明确初始化*/ 
    enum (x=1,y,z)      /*GOOD – 只初始化第一个值*/ 
    enum (x=2,y=3,z=4)  /*GOOD – 初始化所有值*/ 
    enum (x,y,z=1)      /*BAD – 不允许只初始化部分*/ 
    

    不规范案例

    enum
    {
    		a = 0x01,
    		b,
    		c=0xff,
    }
    

    9,必须要有形参

    {
    	void fun(void)
    }
    

    10,函数返回局部结构体
    一个函数不应该返回一个指向局部结构体对象的指针。在被调用函数的返回后,局部对象会存在于数据范围之外并且不再存在。

    struct tag
    {
       UCHAR  * uptr;
    };
     
    static struct tag SDA_077 (void)
    {
       UCHAR  loc = 42;
     
       struct tag rtag;
       rtag.uptr = &loc;
     
       return   rtag; /* Not compliant  */ 
    }
    
    

    11,指针相减地址并不指向数组
    指向不同对象的指针不能直接相减,这样得出的地址指向的并不是数组,且有可能会导致无法定义的行为发生。

    typedef signed int Sint_32;
      
    void foo(void)
    {
      Sint_32 ss1[10];
      Sint_32 ss2[10];
     
      Sint_32 *ss1_ptr = &ss1[0];
      Sint_32 *ss2_ptr = &ss2[0];
      Sint_32 ss3 = ss1_ptr - ss2_ptr; 
    /* not compliant – 指向不同数组的指针不能直接相减*/
     
    }
    
    

    12,IF语句中没有ELSE分支
    13,数组初始化 应该赋值为0,尽管bbs段默认赋值为0
    14,FOR循环语句初始化过于复杂
    For循环中的初始化表达式(即第一项)不应该存在执行语句,除了给循环参数赋一个简单值。

    void static_270(void)
    {
      UINT_32 loop;
      UINT_32 myVar = 0U;
      const UINT_32 max = 10U;
     
      for ( ++myVar, loop = 0U; loop < max; loop++ ) /* not compliant */
      {
        /* ... */
      }
    }
    
    

    15,结构成员名称重用

    struct I_var_a
    {
      INT_32 ip1;
      INT_32 ip2;
    } I_var_a;
     
    struct I_var_b
    {
      INT_32 ip2;   /* not compliant */ 
      INT_32 ip3;
      INT_32 ip4;
    } I_var_b;
    
    

    16,强制转换VOLATILE 值
    尽量避免抛弃volatile条件,因为这有可能会导致编译器最优化有效执行时,在建立优化的时候出现意想不到的结果。

    volatile UINT_32 *y1;
     
    static void static_344 ( void )
    {
       UINT_32 *y2 = (UINT_32 *)y1;  
    /* not compliant - cast to ... a pointer to non-volatile int */ 
    }  
    
    

    17,循环中不止一条break/goto
    所有内部操作中都应该最多只有一条break语句来用于结束一个循环。如果代码是良好结构的,那是没有必要使用多于一个break语句的。

    #include "c_standards.h"
    #include <stdio.h>
     
    const INT_32 max_num = 10;
     
    void static_409( char arr[] )
    {
      INT_32 sub;
     
      for (sub = 0; sub < max_num; sub++)
      {
        if (arr[sub] == '\0')
        {
          break;
        }
     
        (void) printf("%c", arr[sub]);
     
        if (arr[sub] == 'z')
        {
          break;  /* not compliant – 这个循环已经出现过一次break了*/
        }
      } 
    }
    
    

    18, 指针运算不在数组上
    在非数组的指针上进行算术运算被认为是非常不安全的做法(直接对地址进行操作),因为这样很难保证结果是在有效地址上的。

    #include "c_standards.h" 
     
    static void static_567( UINT_32 * pp );
     
    static void static_567( UINT_32 * pp )
    {
      UINT_32 * xx;
      xx = pp +7;    /* not compliant */ 
    }
    
    

    19,在循环体内改变循环计数
    一个循环计数是在循环中用于反复计数的,不应该在循环体内被改变。改变循环计数变量会导致代码难以阅读和维护。

    static void SDA_055( UINT_32 max_count )
    {
      UINT_32 loop_counter = 0U;
     
      for (loop_counter = 0U; loop_counter < max_count; loop_counter++)
      {
        if (loop_counter == 7U)
        {
          loop_counter++;   /* not compliant */
        }
        else
        {
          /* do nothing  */
        }
      }
    }
    
    
    展开全文
  • 直播主题高内聚和低耦合是一个永恒的话题,本次直播宋老师将用实际的代码设计案例,浅显易懂地讲解高内聚和低耦合的关系,以及如何在做软件设计的时候,实现这样的目标。本次直播中的案例涉及现实生活、...
  • 心情好再将这篇文章贴上来,hoho! 
  • ”高内聚 ,低耦合“到底是什么意思?

    万次阅读 多人点赞 2015-08-05 15:27:38
    ‘高内聚,低耦合’是相对于代码而言,一个项目中: 每个模块之间相互联系的紧密程度,模块之间联系越紧密,则耦合性越高,模块的独立性就越差!反之同理; 一个模块中各个元素之间的联系的紧密程度,如果各个元素...
  • 其实我们说到最后,好的代码,我们分层,做模块,无非就是实现一个高内聚和低耦合。 举个简单的例子,将某个模块代码直接删除之后,将上层调用处注释,重新编译,是否还能编过?(不考虑功能的运行) 如果还能,说.....
  • 什么是高内聚,低耦合

    千次阅读 2020-07-13 07:39:43
    高内聚,低耦合是一个老生常谈的话题,所以拿出来说一下我们在看Linux的一些资料,或者是在面试,又或者跟一个比较牛的大佬讨论技术的时候,可能会听到这个概念。所以,什么是高内聚,低耦合呢?...
  • 我是一个JAVA初学者,以前只知道把程序写完写出来就好,再加上足够多的注解就算完成了,从不关心程序是否写的合理,更不知道什么叫设计模式,更不要说是低耦合,高内聚是什么东西,直到培训的老师讲到这,才开始找...
  • [Embeded--SW_分层]嵌入式C代码分层

    千次阅读 2015-07-11 00:16:48
    问题描述:嵌入式、单片机中C代码实现较大的工程时,代码量非常大,查看维护起来也比较吃力,除非代码组织得层次分明,各个功能的划分很明晰,如果仅是一堆实现了功能的代码,没有进行层次的设计,维护起来将是一场...
  •   这里不从设计模式上去讲,只是对日常编码经常使用的方法与经验的一个总结。 本次使用的更多的是spring文件配置上来做文章  
  • 嵌入式测试

    千次阅读 2007-01-27 19:16:00
    嵌入式测试来源:中科永联高级技术培训中心 嵌入式软件测试/嵌入式测试或叫交叉测试(cross-test)的日的与非嵌入式软件是相同的。但是,在嵌入式系统设计中,软件正越来越多地取代硬件,以降低系统的成本,获得更...
  • 嵌入式概述

    2020-03-01 10:25:42
    (2)操作系统:管理资源(包括软件资源和硬件资源),降低耦合,起到“管家”的作用。操作系统是多任务机制,提供了丰富的网络协议、开源软件和库。 2.嵌入式软件和非嵌入式软件的区别 嵌入式是在操作系统上做开发...
  • 嵌入式系统

    千次阅读 2012-07-05 22:38:54
     1)对实时多任务有很强的支持能力,能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时内核心的执行时间减少到最低限度。   2)具有功能很强的存储区保护功能。这是由于嵌入式系统的软件结构已...
  • 嵌入式开发概括

    千次阅读 2020-02-26 19:00:20
    学习笔记一: 嵌入式系统课程学习储备知识:C语言+单片机(硬件的工作原理) 1、嵌入式技术是什么?...即在已有的硬件上移植操作系统,让操作系统去管理软硬件资源,使软硬件耦合度降低,在操作系统之上做上层应用开...
  • 一、初识嵌入式1.1 什么是嵌入式?1.1.1单片机开发:1.1.2嵌入式开发:1.2 单片机开发与嵌入式开发分区别1.2.1单片机开发1.2.2嵌入式开发1.3 嵌入式操作系统1.3.1什么是开源?1.3.2常见的嵌入式操作系统包括:1.4 ...
  • 嵌入式:在已有的硬件上移植(需要修改操作系统源码,安装不需要)操作系统解决软硬件耦合导致的问题。 嵌入式软件和非嵌入式软件的区别即传统开发和嵌入式开发的优缺点: 传统开发的缺点:1.软硬件耦合度高导致软件...
  • 嵌入式概述总结

    2021-08-12 20:37:57
    CSDN我来了~~ 学习者的...嵌入式系统是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统(系统角度) 特点 功耗限制 嵌入式系统中,尤其是在用电池供电的嵌入式系统中,这是一个主要考虑的因素。...
  • 嵌入式系统开发

    2021-08-12 15:27:07
    资源受限:要求小型化、轻型化、功耗及成本,因此软硬件资源受到限制 高可靠性:任何误动作都可能会产生致命的后果 实时性:需要实时数据 软件固化:软件都固化在只读存储器ROM中,用户不能随意更改其程序功能 ...
  • 蓝桥杯嵌入式备赛手册

    万次阅读 多人点赞 2018-06-02 15:28:44
    本文是我参加蓝桥杯嵌入式比赛后的一些心得体会和一些自己总结的驱动代码,希望能给以后参加蓝桥杯嵌入式的同学带来一些帮助。 本文没有经过校对,如有错误还请包涵,欢迎大家交流和指正,转载请注明出处。 一...
  • 解析嵌入式软件开发语言:嵌入式C编程 在我们初学嵌入式开发的时候,总会出现一个问题。那就是C语言和嵌入式C编程有...然而,由于该语言编写开发过程的复杂性,通常不选择它用于嵌入式系统开发,而C语言是一种“
  • 嵌入式软件分层

    千次阅读 2017-07-09 09:45:56
     解耦:通过代码分层实现“高内聚”和“低耦合”,每个层、模块间在功能上独立  扩展性/可维护性强:因为各层及模块间功能相互独立,没有严格依赖关系,所以它的扩展性/可维护性比较强  移植性:每一层都实现指定...
  • matlab代码影响耦合模拟 多物理场有限差分耦合模拟(可执行代码) Linux中的自动化(Bash) MATLAB中的数据处理 模拟 该数据集及其相关代码有助于进行多物理场仿真,并在一次自动运行中创建耦合模型。 该算法使用多...
  • 传统模式下,软件与硬件耦合度很高,移植性较差。嵌入式技术在已有硬件上移植操作系统! 2.嵌入式的开发方向 嵌入式应用开发(C,C++) 嵌入式底层开发(驱动,内核,bsp) 3就业前景:随着互联网泡沫的破灭和美国对...
  • 2017嵌入式软件行业现状及概述

    万次阅读 多人点赞 2017-11-05 16:41:38
    本文章介绍了截止2017年为止的嵌入式软件行业现状,包括就业方向,行业产品类型,待遇等等。另外还简单概述了下嵌入式软件所需的知识技能以及未来可能的技能发展走向。本文章远不如专业的行业报告一般精准、专业,...
  • 嵌入式系统简介

    2021-01-16 12:08:26
    (一)嵌入式发展历程 嵌入式计算机的真正发展是在微处理器问世之后。1971年11月,算术运算器和控制器电路成功的被集成在一起,推出了第一款微处理器,其后各厂家陆续推出了8位、16位微处理器。以这些微处理器为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,817
精华内容 5,526
关键字:

嵌入式代码低耦合