嵌入式软件工程师 订阅
嵌入式软件工程师主要从事嵌入式软件开发工作。涉及应用层以及底层软件开发和设计工作。 展开全文
嵌入式软件工程师主要从事嵌入式软件开发工作。涉及应用层以及底层软件开发和设计工作。
信息
适用于
应用系统对功能等要求计算机系统
基    础
计算机技术
中文名
嵌入式软件工程师
中    心
应用
嵌入式软件工程师基本介绍
嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。嵌入式软件工程师就是编写嵌入式系统的工程师。
收起全文
精华内容
下载资源
问答
  • 本文主要介绍嵌入式软件工程师前期的职业生涯规划。
  • 抛砖引玉,公布一下自己的常用软件,也许有些是你也没有用过的开发利器哦。当然,我也希望能够知道你的经验,可以帮助我提高项目的研发效率。更简单、更便捷、更快、更稳定....好了,下面一一点评
  • 华为,嵌入式软件工程师,试题汇。
  • 一、C语言基础 1、do{}while(); 和while(){};的区别? 答:do{}while();至少执行一次,while(){};可能一次也不会执行,前一个循环一遍再判断,后一个判断以后再循环 。 2、二维数组中的元素AA [ 3 ][ 7 ]的另外一种...
  • 嵌入式软件工程师 C语言笔试题 软件笔试题 (A) 姓名 学校 专业 电话 如无特殊说明以下所有测试内容都是基于 32 位嵌入式系统 1) 程序的局部变量存在于 中全局 变量存在于 中动态申请数据 存在于 中 2) 如何用 if 来...
  • 嵌入式全年工程师他主要主要从事嵌入式软件开发工作。且涉及应用层以及底层软件开发和设计工作。
  • 随着嵌入式软件开发行业...由于目前嵌入式软件工程师水平良莠不齐,企业对嵌入式软件工程师定位差别也较大,主要是因为大家对嵌入式软件工程师职责还不太了解,本文接下来就分析嵌入式软件工程师的工作内容到底有哪些?
  • 文章总结了一些嵌入式软件工程师笔试题及答案,希望对您有所帮助。
  • 嵌入式软件工程师自学之路

    万次阅读 多人点赞 2018-11-20 17:13:14
    目标是成为嵌入式软件工程师。 当时误打误撞的选择了这个专业,在学校也没有充分认识到未来的方向,所以浪费了 大学宝贵的学习时间及其丰富的学习资源。毕业后接触到现实的社会,总感觉未来很茫然, 想着还是利用...

           我是今年(18年)毕业的大学生,专业是物联网。目标是成为嵌入式软件工程师。
    当时误打误撞的选择了这个专业,在学校也没有充分认识到未来的方向,所以浪费了
    大学宝贵的学习时间及其丰富的学习资源。毕业后接触到现实的社会,总感觉未来很茫然,
    想着还是利用大学的培养计划,工作之余实现一个自己的小目标!

        
    以下是我目前为自己定制的学习计划: 《嵌入式软件工程师》

    1、C语言基础方向和高级编程模块的统阔学习。

    2、linux基础知识、常用工具、高级编程。

    3、图形化界面QT/C++的学习。

    4、学习汇编语言,完成简单的C语言相通转换。

    5、ARM相关基础知识、开发板的熟练使用。

    6、嵌入式系统的构建、嵌入式系统软件的总体构成。

    7、linux驱动程序的学习开发。

    8、动手做一些综合性项目,整合学习的所有技能。

    以上是大体的计划,不断学习不断完善,希望自己能脚踏实地一步步学习掌握!
    欢迎大佬提供宝贵经验,助我更早更好的完成这个目标。
    邮箱:1432525341@qq.com

    展开全文
  • 嵌入式软件工程师面试遇到的经典题目

    千次阅读 多人点赞 2020-11-04 23:43:16
    嵌入式软件工程师面试遇到的经典题目1、找错误2、下面的代码输出是什么,为什么?3、C语言编译时动态链接和静态链接得区别是什么?4、C语言关键字static得作用是什么?5、分别说明一下三个变量声明得含义:6、简述...

    嵌入式软件工程师面试遇到的经典题目

    1、找错误

    char * s1="hello";
    char * s2="world";
    char * s3=strcat(s1,s2);
    

    这样做对吗,如果不对请说明原因。

    解答:
    不对,s1与s2都为常量指针,其内容不可修改,运行就会产生段错误。

    下面的代码有何问题?

    void test1()
    {
     char string[10];
     char* str1 = "0123456789";
     strcpy( string, str1 );
    } 
    
    

    字符串strl的末尾是以’ \0 ’结尾的,所以他的长度是11,而string的长度不够。。。。

    但是我自己写了这样的程序,他是可以拷贝的。。。。

    2、下面的代码输出是什么,为什么?

    void foo(void)
    {
    	unsigned int a=6;
    	int b=-20;
    	(a+b>6)?puts(">6"):puts("<6")
    }
    

    输出“>6”,应为无符号数和有符号相加,有符号的整形数会转化成一个无符号的整型数,而且负的有符号整型数转换后会变得非常大,所以相加会大于6。

    3、C语言编译时动态链接和静态链接得区别是什么?

    动态库:
    1、链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
    2、程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
    3、. 加载速度比静态库慢
    4、发布程序需要提供依赖的动态库

    静态库:
    1、静态库被打包到程序中加载速度快
    2 、发布程序无需提供静态库,应为已经在app中,移植方便
    3 、 链接时完整的拷贝至可执行文件中,被多次使用就会有多次冗余拷贝
    4、 更新,部署,发布麻烦

    4、C语言关键字static得作用是什么?

    ①隐藏作用, 可以在不同的文件中定义同名变量和同名函数。
    ②对于变量来说, 保持变量持久, 静态数据区的变量会在程序刚刚运行时就完成
    初始化, 也是唯一一次初始化; 储存在静态数据区, 静态存储区只有两种变量(全
    局变量和 static 静态变量) 。
    ③默认初始化为 0x00,和全局变量一样的属性, 减少程序员的工作量。

    5、分别说明一下三个变量声明得含义:

     int const *p;
    
    int * const p;
    
    int const *p const;
    

    int const*p=const int *p; const修饰的是指针 p,表示指针p的值不能改变,而p(即地址)是可以改变的;

    int * const p; const修饰的是p(即地址)是常量,不可改变,但是*p的值可以改变。

    int const *p const ; 上面两种情况兼得,表示只读,其地址以及地址中的值都不可改变

    6、简述TCP/IP镞包含哪些分段,每一层有哪些常用协议?

    应用层:http dns telnet ftp TFTP 。。。。
    传输层:tcp udp
    网络层:ip ICMP ARP rarp
    数据链路层:ethnet ethnet2 802.3 ppp fr x.25 hdlc
    物理层:比特流

    7、从在浏览器地址栏中输入www.baidu.com到看到百度首页,这个过程中间经历了什么?都涉及到哪些网络协议?

    按照时间顺序:
    1.客户端浏览器获取用户在地址栏输入的域名。
    2.客户端浏览器将域名发送给DNS域名系统,请求解析。
    3.DNS解析域名得到相应的IP,返回给客户端浏览器。
    4.客户端浏览器根据IP向服务器发起TCP三次握手,建立TCP连接。
    5.客户端浏览器向服务器发送HTTP请求,请求百度首页。
    6.服务器通过HTTP响应向客户端浏览器返回百度首页文件。
    7.释放TCP连接。
    8.客户端浏览器解析HTML文件,根据文件内容获取CSS、JS等资源文件,将页面渲染展示给用户。

    TCP/IP五层模型中网络层及以上用到的协议:
    1.应用层:HTTP、DNS、HTTPS
    2.传输层:TCP、UDP
    3.网络层:IP、ARP

    8、编写strcat函数

    2.strcat函数原型
    
    char *my_strcat(char *dest,const char *src) //将源字符串加const,表明其为输入参数
    {
      char *strDest=dest;
      assert(dest!=NULL && src!=NULL);      //对源地址和目的地址加非0断言
      //若使用while(*Dest++),则会出错,指向'\0'之后,会出现dest++,则指向了个'\0'的下一个位置,
      while(*dest !='\0')
      {
        dest++;                                            //循环体内的++可以使指向字符串结束标志'\0'
      }
      while((*dest++=*src++)!='\0');
      return strDest; 
    }
    

    之后会问为什么要char *的返回值:
    主要是为了实现链式表达式。
    如 strcpy(buf, strcat(dest, src) );

    9、使用C语言中的#define来定义一个常量来表示一年有多少秒?

    #define SECONDS_PER_YEAR (606024*365)UL

    一定要加括号,宏定义只是替换,不加括号会出错。。。。

    10、实现把字符串转化成整数

    int my_atoi(char *str)
    {
    	int sum=0,status=1;
    	if(str == NULL)
    	{
    		return 0;
    	}
    	if(*str == '-')
    	{
    		status = -1;
    		str++;
    	}
    	while((*str)!='\0')
    	{
    		sum=sum*10+ ((*str)-'0');
    		str++;
    	}
    	return sum*status;
    	
    }
    
    

    11、写一个程序验证系统的大小端存储格式

    /*方法1*/
    typedef union {
    	int i;
    	char c;
    }my_union;
     
    int checkSystem1(void)
    {
    	my_union u;
    	u.i = 1;
    	return (u.i == u.c);
    }
    /*方法2*/
    int checkSystem2(void)
    {
    	int i = 0x12345678;
    	char *c = &i;
    	return ((c[0] == 0x78) && (c[1] == 0x56) && (c[2] == 0x34) && (c[3] == 0x12));
    }
    
    

    12、如何判断一个byte数据中有多少bit为1?

    int select(unsigned char data)
    {
    	int count=0,i=1;
    	while(data!=0)
    	{
    		count +=  (data & i);
    		data >>= 1;
    	}
    	return count;	
    }
    
    

    13、 C语言中关键字volatile的含义

    volatile 的意思是“易失的,易改变的”。这个限定词的含义是向编译器指明变量的内容可能会由于其他程序的修改而变化。
    一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份

    一般说来,volatile用在如下的几个地方:

    1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

    2、多任务环境下各任务间共享的标志应该加volatile;

    3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

    一个参数既可以是const还可以是volatile吗?解释为什么。
    是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

    14、进程间通信的方式有哪些?

    1.无名管道( pipe ): 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

    2.有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

    3.消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

    4.信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

    5.信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

    6.共享内存( shared memory ) : 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

    7.套接字( socket ) : 套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

    15、堆和栈的区别

    ①、申请方式不同:栈由系统自动分配,堆是由人为自行开辟(malloc,new)
    ② 、申请的大小不同:栈是从高地址像低地址分配的,分配空间较小,堆是由地址向高地分配的,空间较大
    ③ 、申请效率不同:栈由系统分配,分配速度较快,堆一般较慢
    ④ 、栈是连续的地址空间,堆不是连续的地址空间,很容易产生内存碎片,浪费内存。

    16、分别给出bool,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)

    	Bool: if(!var)
    	Int : if(var==0)
    	Float:  const float val=0.00000001
    			If((var >= -val) && (var <= val))
    
    

    17、 进程和线程的区别

    进程和线程的根本区别是进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。另外区别还有资源开销、包含关系、内存分配、影响关系、执行过程等。

    • 资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

    • 包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

    • 内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的。

    • 影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

    • 执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行。

    进程和线程的根本区别是进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

    18.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。

    #define MIN(A, B) ((A) <= (B)? (A) : (B))
    这个测试是为下面的目的而设的:
    (1)标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符 变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为 了能达到要求的性能,嵌入代码经常是必须的方法。
    (2)三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if -then-else更优化的代码,了解这个用法是很重要的。
    (3)懂得在宏中小心地把参数用括号括起来。
    (4)我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?
    least = MIN(*p++, b);
    宏定义#define MIN(A, B) ((A) <= (B) ? (A) : (B))对MIN(*p++, b)的作用结果是:
    ((*p++) <= (b) ? (*p++) : (b))这个表达式会产生副作用,指针p会作两次++自增操作。

    19.预处理器标识#error的目的是什么?

    这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。
    编译程序时,只要遇到 #error 就会跳出一个编译错误当程序比较大时,往往有些宏定义是在外部指定的(如makefile),或是在系统头文件中指定的,当你不太确定当前是否定义了 XXX 时,就可以改成如下这样进行编译:
    #ifdef XXX
    #error “XXX has been defined”
    #else

    #endif
    这样,如果编译时出现错误,输出了XXX has been defined,表明宏XXX已经被定义了。

    20. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?

    这个问题用几个解决方案。我首选的方案是:

    while(1) 
    { 
    } 
    

    一些程序员更喜欢如下方案:

    for(;;) 
    { 
    } 
    

    这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:“我被教着这样做,但从没有想到过为什么。”这会给我留下一个坏印象。
    第三个方案是用 goto

    Loop: 
    ... 
    goto Loop; 
    

    应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。

    21. 用变量a给出下面的定义

    (1)一个整型数(An integer): int a;
    (2)一个指向整型数的指针(A pointer to an integer): int *a;
    (3)一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an
    integer): int **a;
    (4)一个有10个整型数的数组(An array of 10 integers) :int a[10];
    (5)一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to
    integers): int *a[10];
    (6)一个指向有10个整型数数组的指针(数组指针):int (*a)[10];int *p[n](指针数组)
    (7)指向函数的指针,该函数有一个整型参数并返回一个整型数(函数指针):int (*a)(int);
    (8)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整
    型数( An array of ten pointers to functions that take an integer argument and return an
    integer ): int (*a[10])(int)。
    人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。 但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么做准备呢?

    22. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码 ,第一个设置a的bit 3,第二个清除a的bit 3。在以上两个操作中,要保持其它位不变。

    对这个问题有三种基本的反应
    (1)不知道如何下手。该被面者从没做过任何嵌入式系统的工作。
    (2)用bit fields。bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间
    是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。从道德讲:永远不要让一个非嵌入式的家伙沾实际硬件的边。
    (3)用#define和bit masks操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:

    #define BIT3 (0x1 < <3) 
    static int a; 
    void set_bit3(void) 
    { 
    a |= BIT3; 
    } 
    void clear_bit3(void) 
    { 
    a &= ~BIT3; 
    } 
    

    一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的我希望看到几个要点:说明常数、|=和&=~操作。

    23. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa55。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。

    这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:

    int *ptr; 
    ptr = (int *)0x67a9; 
    *ptr = 0xaa55; 
    

    一个较晦涩的方法是:

    *(int * const)(0x67a9) = 0xaa55; 
    

    即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。

    24. C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?

    int a = 5, b = 7, c;
    c = a+++b;
    这个问题将做为这个测验的一个愉快的结尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:
    c = a++ + b;
    因此, 这段代码持行后a = 6, b = 7, c = 12。
    如果你知道答案,或猜出正确答案,做得好。如果你不知道答案,我也不把这个当作问题。我发现这个问题的最大好处是:这是一个关于代码编写风格,代码的可读性,代码的可修改性。

    25. 整型数组作为参数传递时,无法在子函数中获得其长度!只有字符串可以,因为它有一个尾巴标识(‘\0’)!所以,整型的数组长度,必须与数组名一同传递到子函数才可以!

    展开全文
  • ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标: (1)掌握主流嵌入式微处理器的结构... (3)必须熟悉嵌入式软件开发流程并至少做一个嵌入式软件项目。 从事嵌入式软件开发的缺点是: (1) ...

    ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标:
             (1)掌握主流嵌入式微处理器的结构与原理(初步定为arm9)
             (2)必须掌握一个嵌入式操作系统 (初步定 为uclinux或linux,版本待定)
             (3)必须熟悉嵌入式软件开发流程并至少做一个嵌入式软件项目。

    从事嵌入式软件开发的缺点是:

            (1) 入门起点较高,所用到的技术往往都有一定难度,若软硬件基础不好,特别是操作系统级软件功底不深,则可能不适于此行。
           (2)这方面的企业数量要远少于互联网类企业。同时薪资待遇也会低一些。
           (3)有少数公司经常要硕士以上的人搞嵌入式,主要是基于嵌入式的难度。但大多数公司也并无此要求,只要有经验即可。
          (4)平台依托强,换平台比较辛苦。

    方法步骤:

    1、基础知识:
                   目的:能看懂硬件工作原理,但重点在嵌入式软件,特别是操作系统级软件,那将是我们的优势。
                   科目:数字电路、计算机组成原理、嵌入式微处理器结构。汇编语言、C/C++、编译原理、离散数学。数据结构和算法、操作系统、软件工程、网络、数据库。
                   方法:虽科目众多,但都是较简单的基础。不一定全学,可根据需要选修。
                   主攻书籍:the c++ programming language、数据结构-C2。

    2、学习linux:
                  目的:深入掌握linux系统。
                  方法:使用linux—〉linxu系统编程开发—〉驱动开发和分析linux内核。先看《深》,那主讲原理。看几遍后,看《情景分析》,对照深看,两本交叉,深是纲,情是目。剖析则是0.11版,适合学习。最后深入代码。
                 主攻书籍:linux内核完全剖析、unix环境高级编程、深入理解linux内核、linux内核源代码情景分析。

    3、学习嵌入式linux:
                 目的:掌握嵌入式处理器其及系统。
                 方法:(1)嵌入式微处理器结构与应用:直接arm原理及汇编即可,不要重复x86。
                             (2)嵌入式操作系统类:ucOS/II简单,开源,可供入门。而后深入研究uClinux。
                             (3)必须有块开发板(arm9以上),有条件可参加培训(进步快,能认识些朋友)。
                主攻书籍:毛德操的《嵌入式系统》及其他arm9手册与arm汇编指令等。

    4、深入学习:
                 A、数字图像压缩技术:主要是应掌握MPEG、mp3等编解码算法和技术。
                 B、通信协议及编程技术:TCP/IP协议、802.11,Bluetooth,GPRS、GSM、CDMA等。
                 C、网络与信息安全技术:如加密技术,数字证书CA等。
                 D、DSP技术:Digital Signal Process,DSP处理器通过硬件实现数字信号处理算法。

              说明:太多细节未说明,可根据实际情况调整。重点在于1、3,不必完全按照顺序作。对于学习c++,理由是c++不只是一种语言,一种工具,她还是一种艺术,一种文化,一种哲学理念、但不是拿来炫耀得东西。对于linux内核,学习编程,读一些优秀代码也是有必要的。

             注意:要学会举一反多,有强大的基础,很多东西简单看看就能会。想成为合格的程序员,前提是必须熟练至少一种编程语言,并具有良好的逻辑思维。一定要理论结合实践。不要一味钻研技术,虽然挤出时间是很难做到的,但还是要留点余地去完善其他的爱好,比如宇宙,管理,心理学,音乐、游戏、科幻电影。还有一些不愿意做但必须要做的!技术是通过编程编程再编程编出来的。永远不要梦想一步登天,不要做浮躁的人,不要觉得路途漫长。而是要编程编程再编程,完了再编程,再编程!等机会来了在创业(不要相信有奇迹发生,盲目创业很难成功,即便成功了发展空间也不一定很大)。

    嵌入式书籍推荐:
    Linux基础
    1、《Linux与Unix Shell 编程指南》
    C语言基础
    1、《C Primer Plus,5th Edition》【美】Stephen Prata                    2、《The C Programming Language, 2ndEdition》【美】Brian W. Kernighan DavidM. Rithie(K & R)3、《Advanced Programming in the UNIX Environment,2nd Edition》
    4、《嵌入式Linux应用程序开发详解》
    Linux内核
    1、《深入理解Linux内核》(第三版)     2、《Linux内核源代码情景分析》毛德操 胡希明
    研发方向
    1、《UNIX Network Programming》2、《TCP/IP详解》3、《Linux内核编程》4、《Linux设备驱动开发》(LDD)
    硬件基础
    1、《ARM体系结构与编程》杜春雷    2、S3C2410 Datasheet
    系统教程
    1、《嵌入式系统――体系结构、编程与设计》                 2、《嵌入式系统――采用公开源代码和StrongARM/Xscale处理器》毛德操 胡希明        3、《Building Embedded Linux Systems》
    理论基础
    1、《算法导论》2、《数据结构(C语言版)》3、《计算机组织与体系结构?性能分析》4、《深入理解计算机系统》【美】Randal E.Bryant David O”Hallaron着5、《操作系统:精髓与设计原理》6、《编译原理》7、《数据通信与计算机网络》8、《数据压缩原理与应用》

    C语言书籍推荐
    1. The C programming language 《C程序设计语言》2. Pointers on C 《C和指针》3. C traps and pitfalls 《C陷阱与缺陷》4. Expert C Lanuage 《专家C编程》5. Writing Clean Code—–Microsoft Techiniques for DevelopingBug-free C Programs
    《编程精粹–Microsoft 编写优质无错C程序秘诀》6. Programming Embedded Systems in Cand C++《嵌入式系统编程》7.《C语言嵌入式系统编程修炼》8.《高质量C++/C编程指南》林锐

    尽可能多的编码,要学好C,不能只注重C本身。算法,架构方式等都很重要

    具体的实施路线:

    1、打好嵌入式软件编程的基础

    这一阶段重点打好嵌入式软件编程的基础,包括
                           * 学习Linux系统的基本应用
                           * Linux的常用命令
                           * C语言编程基础
                           * 常用的数据结构

    特别是C语言中对指针的理解和应用。这一阶段的主要目的是学习编程语言、开发环境、和培养自己的编程思维,为进一步学习嵌入式开发打下良好的基础。

    2、学习ARM体系结构编程

    这一阶段才是真正的嵌入式编程,首先我们要选择一款嵌入式CPU和一款嵌入式开发平台,目前ARM 嵌入式CPU应用最广泛,这一阶段重点是学习嵌入式CPU的裸机编程:

                        * 熟悉中断
                        * 定时器
                        * 串口
                        * NAND FLASH
                        * 网络控制器
                        * LCD屏、触摸屏
                        * I2C 设备
                        * SPI 设备

    等常用嵌入式外围设备的硬件工作原理,以及如何使用C语言来编程、控制这些硬件。这一阶段除了要学习对硬件编程之外,还需要学习嵌入式硬件的知识,但是对于嵌入式软件工程师来讲,重点是学习硬件的工作原理,在掌握硬件工作原理的基础上,对硬件进行编程控制。这和硬件工程师学习的侧重点有所不同。这一阶段对应的学校的课程主要包括模拟电路、数字电路、微机原理和单片机。这一阶段重点是要看CPU的芯片手册,大部分的参考书也是对芯片手册的翻译。

    3、学习嵌入式系统的构建

    这一阶段主要学习带有操作系统的嵌入式系统的构建,包括系统的启动流程
                        * Bootloader的工作流程
                        * UBOOT的编译
                        * 裁剪与移植,嵌入式Linux内核的裁剪、移植与编译
                        * 嵌入式根文件系统的定制
                        * BootLoader、内核和根文件系统的烧写
    这一阶段的主要目的是掌握带有操作系统的嵌入式系统的构建和烧写过程,以及对嵌入式系统软件的总体构成有个整体认识,为我们接下来学习嵌入式应用和驱动开发打下坚实的基础。

    4、学习嵌入式Linux应用程序开发

    这一阶段主要学习上层的嵌入式Linux应用程序开发,包括
                        * 基于Linux多进程
                        * 多线程网络
                        * 文件与目录
    掌握嵌入式Linux环境下应用程序开发技术。

    5、学习嵌入式Linux驱动程序开发


    这一阶段主要学习底层嵌入式Linux设备驱动程序开发设计,包括
                        * 常用的字符设备驱动
                        * 块设备驱动
                        * LCD设备驱动
                        * 触摸屏设备驱动
    以及驱动程序开发中的核心技术

    6、完成一个综合项目


    嵌入式技术关键在于理论和实践的结合,要能够学以致用,完成了以上的所有阶段的知识点学习后,到底有没有学会,会不会用,能不能应用所学知识来解决实际开发中的问题,我们需要来完成一个综合的嵌入式实训项目,例如: 基于嵌入式Linux平台实现的飞行器、 基于嵌入式Linux平台实现的智能机器人等,这些项目都综合应用了嵌入式开发当中的应用,驱动和QT开发技术。

     

     

    展开全文
  • 嵌入式软件工程师和嵌入式硬件工程师有什么区别

    万次阅读 多人点赞 2019-09-16 14:00:48
    什么是嵌入式硬件工程师  随着嵌入式技术的普及,硬件工程师的性质也有所改变。嵌入式硬件工程师与我们平常所说的硬件工程师不同。嵌入式硬件工程不但要求具备硬件工程师的... 嵌入式软件工程师与我们平常说的软...

    什么是嵌入式硬件工程师

      随着嵌入式技术的普及,硬件工程师的性质也有所改变。嵌入式硬件工程师与我们平常所说的硬件工程师不同。嵌入式硬件工程不但要求具备硬件工程师的基本技能,还必须完成部分软件工程师的工作,例如: 底层驱动的开发嵌入式操作系统的裁剪,移植; GUI、文件系统等软件的移植; 基于嵌入式操作系统的底层驱动程序的设计等。

    什么是嵌入式软件工程师

      嵌入式软件工程师与我们平常说的软件工程师不同。

      我们平常说的软件工程师大部分指的是windows 和linux 操作系统下应用软件的开发人员,硬件平台是基于PC 机的。而嵌入式软件工程师则是指在wince.linux 等嵌入式操作系统下进行用户应用软件开发的人员,硬件平台则是基于嵌入式产品的(例如: 手机、PDA 等)。软件开发工具也有所区别,嵌入式软件开发一般使用的是嵌入式系统专用的开发工具,例如wince 下的evc,和linux 下的qt 等。

      嵌入式软件工程师和嵌入式硬件工程师有什么区别

      嵌入式软件工程师和嵌入式硬件工程师有什么区别

      软、硬件工程师工作性质的区别

      嵌入式硬件工程师的工作是为软件工程师搭建好硬件平台和必要的开发环境。 嵌入式软件工程师则是根据用户的需要完善产品的软件功能。硬件工程师就像是设计师和建筑师,负责整个建筑的设计和建设。软件工程师则是负责房间的装修,锦上添花。

      总的来说, 硬件工程师的工作性质尤为重要,因为硬件工程师在设计产品 时不但要完成产品的基本功能,还必须考虑多方面因素: 功耗、干扰、后期维修、生产安装等。一旦某一个因素考虑不周全,会造成整个产品的设计失败。

      除此之外,产品在设计中可以没有软件工程师,绝不能没有硬件工程师。 因为在某些对实时性要求严格的嵌入式产品(例如: 工业产品)或者某些低性能的嵌入式产品(例如: CPU 使用单片机的产品) 中,往往是不能够使用操作系统的。 这时,整个产品的设计工作则全部由硬件工程师来完成了。

      嵌入式软件工程师和嵌入式硬件工程师有什么区别

      嵌入式软、硬件工程帅的就业形式

      软件工程师的工作性质使得软件工程师的起点较低,所以目前国内的软件工程师居多。并且目前国内的嵌入式培训都是以软件培训为主。所以从长远看,硬件工程师的就业压力要小。

      但是另一方面,企业中硬件开发人员需求量要比软件开发人员的需求量小。因为一旦产品定型,后期的产品升级都是由软件来完成的,硬件的更新和变动很少。

      嵌入式软、硬件工程师的工作稳定性

      一般来说软件工程师的人员流动性要比硬件流动性要大。

      首先,我们都知道,产品是企业生存的命脉,如果产品的设计资料泄露,那么该企业的生存优势就不存在了。所以,企业会千方百计的留住产品设计的核心人员,尤其是硬件设计人员。

      另外,培养一个硬件工程师比较难,而且时间也比较长。所以企业一般不会主动去培养一个硬件工程师,并且也不会轻易放弃一个硬件工程师。

      第E,由于目前软件工程师居多,企业可供选择的机会也多,所以软件工程师的流动性要高。

      嵌入式软、硬件工程师的工资待遇比较

      工资待遇的高低由企业所处的地域、行业、企业的性质和人员的工作岗位而定。由于每个企业的情况不同,所以工资待遇的差异很大。

      对于以硬件产品为主的企业来说,硬件开发的成本高,产品的成本也高。因为后期的加工生产,维修等等都需要很大的费用。所以企业的利润较低。不过由于硬件工程师掌握着企业的命脉,所以企业会提高硬件设计人员待遇。

      对于以软件产品为主的企业来说,开发的成本较低,一旦开发完成,后期的产品基本无成本。所以软件行业的利润较大。但是,由于软件工程师人员多,所以待遇也有所下降。

      嵌入式软件工程师和嵌入式硬件工程师有什么区别

      嵌入式的硬件工程师和软件工程师哪个更有前途

      1、先从企业的角度来讲讲。我个人认为造成这个差异的原因,第一个是基本上所有的公司,从初创公司到全球百强,都有对软件工程师的需求。现在哪个公司不需要几个码农来开发app,或者做个web。但是做硬件这种工作并不是所有公司会去做的。

      2、第二点要归功于现在的创业潮。不管在美国在中国互联网创业都是趋势,但是可以说绝大部分的初创互联网公司做的都是软件方向。有个点子,有点技术,找几个合伙人抱着电脑就能开干了。但是初创公司要专注做硬件开发就比较难了,因为成立设计硬件公司的门槛和起步开销比较大。所以这也导致大部分初创公司以互联网为主,能做的了硬件设计的公司基本上都是处于垄断地位的大企业。

      3、第三个很重要的原因就是硬件设计。在现在来看已经是相对成熟的技术,我甚至有ee的同学跟我说大部分硬件的东西已经步入夕阳产业的范畴,因为很多东西已经成了规范,也因为很多东西被自动化所取代。前一阵子全球大牌的硬件公司才裁了不少人,intel更是裁掉了接近20%的硬件工程师。但是互联网热从90年代开始到现在热头还没过,而且未来诸多产业如人工智能、机器学习、图像识别、大数据都才刚起步,所以还有一定的上升空间。

      4、再从个人的角度来讲。想成为一名软件工程师找到工作的门槛远比成为一名合格的硬件工程师低很多。要想以软件工程师的身份混到个饭碗,学两门语言学好,常用的数据结构,刷点题就基本上能找到薪水小几千的岗位,像学朱有鹏老师课程的学生学得好都是上万的。

      5、但是要想成为一名合格的硬件工程师,不是科班出身的不好好学几门模电数电信号逻辑设计的课,没有在学校实验室里自己焊点电路做实践,连简历都发不出去。而且现在要想学个什么语言框架,网上搜一搜“”xxx语言入门教程“”就有非常丰富的资源,但是要是在网上搜“如何学好超大规模集成电路设计”,要想找到可以受用的资源几乎是不可能的。而且就我所参加的招聘会来说,如果有招硬件工程师基本都要求有研究生的学位,但是对软件工程师的要求基本上就是熟悉算法数据结构,会web编程有相关经历就够了。

      6、软件工程师很多时候吃的是体力,硬件工程师大部分时候是吃经验,所以硬件工程师一般得有一定的经历积淀才能脱颖而出。尤其像模电这种上手程度很高的方向,没个十年八年的相关经验根本不算学成出师。所以说本身对从业者的资质要求更高,也是硬件工程师不好找工作的原因之一。

      嵌入式软件工程师和嵌入式硬件工程师有什么区别

    展开全文
  • 嵌入式软件工程师1.无论哪种语言,程序代码只是一个简单的工具,最后真正留下的只有原理、协议、框架、思维嵌入式驱动工程师嵌入式系统工程师嵌入式应用工程师 1.无论哪种语言,程序代码只是一个简单的工具,最后...
  • 嵌入式软件工程师学习路线

    千次阅读 多人点赞 2020-05-22 17:02:13
    大家选择学习嵌入式,最后是都要做嵌入式相关工作的,所以在学习的时候真的要用心,如果你三心二意的话,那么很可能就学不好嵌入式了,因为嵌入式的确很难,不过,下面可以先来了解下嵌入式软件工程师学习路线,对你...
  • 一些自己用过的嵌入式软件工程师笔试资料,包括操作系统、c/c++、数据结构等。
  • <1>...说直白一点,就是先设计硬件,然后根据需求编写能在该硬件上运行的软件,就成了所谓的“智能硬件”。 或者说得还不够明白,那行,我们说一说具体的嵌入式产品有哪些,嵌入式是做什么的
  • 嵌入式软件工程师面试试题加答案,绝对实用
  • 嵌入式软件工程师笔试题及答案 例如: 30:已知一个数组table,用一个宏定义,求出数据的元素个数。 参考答案:#define NTBL #define NTBL (sizeof(table)/sizeof(table[0]))
  • 文章目录嵌入式软件工程师面试题目整理(一)Arm有多少32位寄存器?Arm2440和6410有什么区别CPU,MPU,MCU,SOC,SOPC联系与差别上拉&下拉&高阻态串口协议讲一讲RS232和RS485通讯接口有什么区别IIC时序图画一下...
  • 嵌入式软件资格考试练习题,帮助想要从事嵌入式开发这个行业的专业人士。
  • 我的嵌入式软件工程师秋招之路(文末送福利)

    千次阅读 多人点赞 2020-12-18 21:08:22
    而自己对嵌入式底层的内容也比较感兴趣。所以,在研二的时候每天花一点时间来学习下驱动开发,以后找工作打算从事底层驱动开发相关的内容。 2. 秋招准备 2.1 Linux驱动   在2019年12月的时候,基本就把韦东山老师...
  • 最近有点空闲,总结下嵌入式工程师所需要掌握的技能,及成长方向。 主体知识:C语言、数据结构 + 算法、linux系统+ linux网络、数据库 、内核编译裁剪+驱动开发 一、常用数据结构: 平衡二叉树 链表 栈/队列 C...
  • 嵌入式软件工程师笔试面试指南-C/C++

    千次阅读 多人点赞 2021-04-15 17:43:11
    嵌入式软件笔试,嵌入式软件面试,程序员简历书写,Linux驱动工程师笔试,Linux驱动工程师面试,BSP工程师笔试,BSP工程师面试,应届生秋招,应届生春招,C/C++笔试题目,C/C++面试题目,C/C++程序员,BSP工程师
  • 有过系统的嵌入式培训经历,选择了C++软件开发已有一年,现在找工作,纠结要不要回到嵌入式软件,总感觉这两者使用的技术是同源的,但嵌入式又太过杂、过多、过零散,很难学到一定的深度,前景是看好的。C++软件开发...
  • 嵌入式软件工程师笔试题大全

    千次阅读 多人点赞 2020-03-23 15:08:11
    嵌入式软件工程师笔试题 1、将一个字符串逆序 2、将一个链表逆序 3、计算一个字节里(byte)里面有多少bit被置1 4、搜索给定的字节(byte) 5、在一个字符串中找到可能的最长的子字符串 6、字符串转换为整数 7、整数...
  • 今天分享的是小米的嵌入式软件开发工程师的笔试题目。这份题目很奇怪,操作系统,数据结构,网络基础,Java,C++,数据库,正则表达式,Linux都考到了。当时做题的时候,我都怀疑发错卷子了。。。还好最后两道大题都...
  • MTK深圳公司嵌入式软件工程师笔试题
  • oppo和海康嵌入式软件工程师面经总结

    千次阅读 多人点赞 2021-04-23 11:32:30
    八股文的内容,可以看下这篇文章嵌入式软件工程师笔试面试指南-C/C++。所有关于笔试面试的内容,我都会同步在github(https://github.com/ZhongYi-LinuxDriverDev/EmbeddedSoftwareEngineerInterview)上,大家可以...
  • 最近在找嵌入式软件开发岗位,由于第一次面临秋招,所以准备做个长文,将一些可能会问的、考的包括C语言问题记录下来。 二、经典面试题 预处理和宏 用预处理指令 #define 声明一个常数,用于表明1年中有多少秒(不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,593
精华内容 15,437
关键字:

嵌入式软件工程师