嵌入式Linux工程师笔试记录 -- 2020.7.28 (一)

广州飞哥嵌入式软件工程师笔试题

做题时间:2020.7.17 21:28
总结时间:2020.7.28

1.ARM7系列微处理器是三级流水线结构:

参考链接:ARM流水线解析

知识点

1)ARM流水线技术:arm每条指令可以分为多个阶段,如arm7的三级流水线每条指令分为取指、译码、执行三个阶段。arm9五级流水线则为取指、译码、执行、访存、回写五个阶段。每个阶段都在独立的功能部件上运行,使得多个指令并行运行(同一时刻同一阶段只有一条指令),缩短程序执行时间,提高处理器的效率和吞吐率。

2)不同Arm芯片采用的流水线结构:ARM7为冯诺依曼结构,采用典型的三级流水线,而ARM9是哈佛结构,采用五级流水线技术;而ARM11则用了七级流水线。

3)ARM7与ARM9在这方面上的区别
ARM7的三级流水线执行包括操作数相关寄存器和存储器的读写操作、ALU操作以及相关器件之间的数据传输。执行单元的工作往往占用多个时钟周期,从而称为系统性能的瓶颈。ARM9采用五级流水线设计,增加了访问存储器并写回结果,将读寄存器的操作转移到译部件上,同时哈佛结构避免了数据访问和去指的总线冲突。

2.ARM采用定长指令格式,所有指令是32位,bit[31:28]为?

参考链接arm指令一般编码格式和一般语法格式

知识点
1)arm指令编码格式

31 ---- 2827 ---- 2524 ---- 212019 ---- 1615 ---- 1211 — 8— 7 — 0
cond001opcodeSRnRdShifter_operand

2)arm指令语法格式

opcode{cond}{S}Rd.Rn{,operand2}

解释
1)opcode:指令助记符(MOV ADD…) ; cond:执行条件(EQ NE 等) ; S:是否影响CPSR寄存器的值;Rd:目标寄存器;Rn:第一个操作数的寄存器operand2:第二个操作数
2){}内的项是可选的。

3.嵌入式软件开发构建阶段的前三步:编译-》链接-》定址

4.系统正常执行程序状态是在用户模式 系统复位进入的工作模式是:管理模式

参考链接ARM 处理器工作模式

知识点:处理器工作模式
Linux下常用的有如下:
User( 用户模式 usr ):系统正常执行状态;
Supervisor(管理模式 svc) : 嵌入式系统复位后进入该模式。

5.在嵌入式系统中按实时性需求分类,其中(硬实时系统)实时性最好。

参考链接什么是真正的实时操作系统

知识点RTOS/软实时/硬实时概念
1)RTOS与非RTOS的主要区别:程序执行具有确定性。
2)硬实时:也叫强实时,在系统指定时间内未完成某个确定任务,系统崩溃。其实现依赖于硬件的时间和优先级管理。其响应时间在毫秒或微秒级。典型的有ucos和vxworks。
3)软实时:也叫弱实时,容许超时不发生致命错误,主要依靠软件编程实现管理。系统响应时间在毫秒或秒级。常见的有WindowsCE、uCLinux这样的多任务分时系统。实时性的要求比强实时系统差一些。

6.嵌入式芯片的内核电源与io模块电源相比,io模块电源的电压要高。

S3C2440芯片手册:
在这里插入图片描述

7.请问下面三种变量声明有何区别?

	1int const *m;
	2int *const m;
	3int *const *m;

知识点const的用法

  1. 用于修饰变量,通知编译器该变量不能被放在等号左边。
1)	const int value = 10; 
	value = 11 ;			// 编译器报错
2const int *p或int const *p = &a。
	*p = 2 ; 				// 编译器报错
3int *const p = &a;
	p = &b ;				// 编译器报错
4)	const int *const p = &a;
	p = &b;*p = b;		// 编译器都报错 	
  1. 用于保证变量作为传参时,在该函数内不被修改。
void func(const int *p);
  1. 修饰函数返回值,防止函数被放在等号左边。
const int fun()
  1. 修饰类的成员变量,也是修饰为常量,只能在构造函数进行初始化。
  2. 类中使用const修饰函数,只能被const对象调用,进而在函数内禁止修改非static类成员变量( 即const对象的成员不能被修改 )
	class A{
	int a ;
	static int b;
	public:
	 	void func() const {
			a = 10 ; // 出错,不可修改非static变量
			b = 10 ; // 可以修改
		}
	}

解释:const成员函数供const对象使用,const对象表示初始化后它的内容不再改变,那么显然,对于非static成员变量再const成员函数中改变,那么就不符合要求。而对于static成员变量则是属于类的变量,并非属于对象,所以可以进行修改也是符合需求

8.全局变量和局部变量在内存中的区别

知识点考察内存分布
程序内存分布为

	栈区(stack)-----  局部变量
	堆区(heap)、
	全局区/静态区(.data--已初始化 , .bss存储未初始化),
	只读区(.rodata) , 
	代码区(.text)

9.进程与线程的区别?

参考链接进程与线程的区别

1)资源:进程有自己独立的地址空间,而线程使用相同的地址空间
2)效率:创建一个线程比进程开销小,CPU切换线程更快。
3)资源利用率:线程占用资源更少。
4)通信:线程之间通信比较方便,用共享的全局变量、静态变量等就行,不过需要处理好同步互斥。而进程通信则需要借助内核,用IPC方式通信。
5)安全性、健壮性:多进程互相独立,一个进程异常退出不会对另一个进程产生影响,而多线程不易维护,当一个线程异常退出,相当于该进程内所有线程都退出。
6)多线程其他缺点:多线程受限制于共享地址空间的大小,同时线程过多,同步互斥本身消耗就很大。

10.Static的作用:

1)静态局部变量,只初始化一次。相比局部变量,它作用域不变,但是生存周期延长到程序结束。
2)修饰全局变量/函数,限制作用域在本文件中,不会被其他文件访问到。
3)修饰类的成员变量/成员函数,将该变量定义为属于该类所有对象的共享资源。静态成员函数则是单纯属于类的函数,该函数不能访问类中除了静态成员变量以外的成员变量。

11.malloc分配的是物理地址还是虚拟地址

虚拟地址;malloc在进程的4g虚拟地址空间中的heap段(堆段)分配一段空间。

12.交换两个数m=2和n=3,不用第三块内存。(异或)

	void myswap( int *m , int *n ){
 		/* 位运算实现swap */
 		*m ^= *n;
 		*n ^= *m;
 		*m ^= *n;
	}

13.要求设置一绝对地址为0x1234的整型变量的值为0x5566

	unsigned int  *p = (unsigned int *) 0x1234;
	*p = 0x5566;

14.写一个函数完成内存拷贝。

参考:内存拷贝函数的深入思考

	void * MyMemMove(void *dst , const void * src, int count ){
		assert(dst);
		assert(src);
		void * ret = dst ;
		if(dst <= src || (char*)dst >= ((char *)src+count)){
			while(count --){
				*(char *)dst = *(char *)src;
				dst = (char *)dst + 1;
				src = (char *)src + 1; 
			}
	 	}
	 	else{
			dst = (char *)dst + count - 1;
			src = (char *)src + count - 1;
			while(count --){
				*(char *)dst = *(char *)src;
				dst = (char *)dst - 1;
				src = (char *)src - 1;
			}
		}
		return ret;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值