【粉丝问答13】11道嵌入式笔试题,看下你会几道?

一口Linux 2021-02-25 00:00

笔试题

笔试题

1. ARM指令和中B和BLX的区别?

B:

跳转执行 B 指令的格式为:

B{条件} 目标地址

B 指令是最简单的跳转指令。一旦遇到一个B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。

注意存储在跳转指令中的实际值是相对当前PC 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。

它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB 的地址空间)。

举例:

B Label ;   程序无条件跳转到标号 Label 处执行
CMP R1 ,# 0 ;  当 CPSR 寄存器中的 Z 条件码置位时,程序跳转到标号 Label 处执行
BEQ Label

BLX

带链接和状态切换的跳转。结合了BX与BL功能。BLX 指令的格式为:

BLX 目标地址

BLX 指令从ARM 指令集跳转到指令中所指定的目标地址,并将处理器的工作状态由ARM 状态切换到Thumb 状态,该指令同时将PC 的当前内容保存到寄存器R14 中。

因此,当子程序使用Thumb 指令集,而调用者使用ARM 指令集时,可以通过BLX 指令实现子程序的调用和处理器工作状态的切换。

总结

1、BL 和 BLX 指令可将下一个指令的地址复制到lr(r14,链接寄存器)中。2、BX 和 BLX 指令可将处理器的状态从 ARM 更改为 Thumb,或从 Thumb 更改为ARM。3、BLX label 无论何种情况,始终会更改处理器的状态。4、BX Rm 和 BLX Rm 可从 Rm 的位 [0]推算出目标状态。5、如果 Rm 的位 [0] 为 0,则处理器的状态会更改为(或保持在)ARM 状态。如果 Rm 的位 [0] 为 1,则处理器的状态会更改为(或保持在)Thumb 状态。

2. ARM处理器体系结构中IRQ发生时,处理器将执行哪些操作?

中断发生后,ARM核的操作步骤可以总结为4大步3小步。

1. 4大步3小步

  1. 保存执行状态:将CPSR复制到发生的异常模式下SPSR中;
  2. 模式切换:
  • CPSR模式位强制设置为与异常类型相对应的值,
  • 处理器进入到ARM执行模式,
  • 禁止所有IRQ中断,当进入FIQ快速中断模式时禁止FIQ中断;
  1. 保存返回地址:将下一条指令的地址(被打断程序)保存在LR(异常模式下LR_excep)中。
  2. 跳入异常向量表:强制设置PC的值为相应异常向量地址,跳转到异常处理程序中。

2. 步骤详解

  1. 保存执行状态

当前程序的执行状态是保存在CPSR里面的,异常发生时,要保存当前的CPSR里的执行状态到异常模式里的SPSR里,将来异常返回时,恢复回CPSR,恢复执行状态。

  1. 模式切换

硬件自动根据当前的异常类型,将异常码写入CPSR里的M[4:0]模式位,这样CPU就进入了对应异常模式下。不管是在ARM状态下还是在THUMB状态下发生异常,都会自动切换到ARM状态下进行异常的处理,这是由硬件自动完成的,将CPSR[5] 设置为 0。同时,CPU会关闭中断IRQ(设置CPSR 寄存器I位),防止中断进入,如果当前是快速中断FIQ异常,关闭快速中断(设置CPSR寄存器F位)。

  1. 保存返回地址

当前程序被异常打断,切换到异常处理程序里,异常处理完之后,返回当前被打断模式继续执行,因此必须要保存当前执行指令的下一条指令的地址到LR_excep(异常模式下LR,并不存在LR_excep寄存器,为方便读者理解加上_excep,以下道理相同),由于异常模式不同以及ARM内核采用流水线技术,异常处理程序里要根据异常模式计算返回地址。

  1. 跳入异常向量表

该操作是CPU硬件自动完成的,当异常发生时,CPU强制将PC的值修改为一个固定内存地址,这个固定地址叫做异常向量。

3. ARM状态与Thumb状态的切换指令是什么?举例说明

概念

  1. ARM状态 arm处理器工作于32位指令的状态,所有指令均为32位
  2. thumb状态 arm执行16位指令的状态,即16位状态

切换指令

  1. 由arm状态切换到thumb 状态将寄存器的最低位设置为1

BX指令:R0[0]=1,则执行BX R0指令将进入thumb状态

  1. 由thumb状态切换到ARM状态 寄存器最低位设置为0

BX指令:R0[0]=0,则执行BX R0指令将进入arm状态

举例

 AREA Arm_to_Thumb,CODE, READONLY
 ENTRY
 CODE32
start
 ldr r0,=aaa+1
 mov r3,#18
 bx r0
 CODE16
aaa 
 mov r1,#12
 mov r2,#10
 END

4. 请问ARM支持哪几种异常类型,请列出其中断向量地址。

异常源分类

要进入异常模式,一定要有异常源,ARM规定有7种异常源:

异常源 描述
Reset 上电时执行
Undef 当流水线中的某个非法指令到达执行状态时执行
SWI 当一个软中断指令被执行完的时候执行
Prefetch 当一个指令被从内存中预取时,由于某种原因而失败,如果它能到达执行状态这个异常才会产生
Data 如果一个预取指令试图存取一个非法的内存单元,这时异常产生
IRQ 通常的中断
FIQ 快速中断

异常向量表是一段特定内存地址空间,每种ARM异常对应一个字长空间(4Bytes),正好是一条32位指令长度,当异常发生时,CPU强制将PC的值设置为当前异常对应的固定内存地址。

异常向量表:

异常向量表

跳入异常向量表操作是异常发生时,硬件自动完成的,剩下的异常处理任务完全交给了程序员。由上表可知,异常向量是一个固定的内存地址,我们可以通过向该地址处写一条跳转指令,让它跳向我们自己定义的异常处理程序的入口,就可以完成异常处理了。

正是由于异常向量表的存在,才让硬件异常处理和程序员自定义处理程序有机联系起来。异常向量表里0x00000000地址处是reset复位异常,之所以它为0地址,是因为CPU在上电时自动从0地址处加载指令,由此可见将复位异常安装在此地址处也是前后结合起来设计的,不得不感叹CPU设计师的伟大,其后面分别是其余7种异常向量,每种异常向量都占有四个字节,正好是一条指令的大小,最后一个异常是快速中断异常,将其安装在此也有它的意义,在0x0000001C地址处可以直接存放快速中断的处理程序,不用设置跳转指令,这样可以节省一个时钟周期,加快快速中断处理时间。

存储器映射地址0x00000000是为向量表保留的。在有些处理器中,向量表可以选择定位在高地址0xFFFF0000处【可以通过协处理器指令配置】,当今操作系统为了控制内存访问权限,通常会开启虚拟内存,开启了虚拟内存之后,内存的开始空间通常为内核进程空间,和页表空间,异常向量表不能再安装在0地址处了。

比如Cortex-A8系统中支持通过设置CP15的C12寄存器将异常向量表的首地址放置在任意地址。

5. 在Linux中与外设的通信是层次化的,请画出外设寻址的分层模型。

本题有点没整明白在问什么,如果分析有误,欢迎给我留言。

Linux下一切皆文件,应用程序访问外设都需要通过驱动来操作外设。

Linux下设备类型分为:字符设备、块设备、网络设备。

架构图参考下图:

此外题目问画出外设寻址的分层模型,我想可能是想问如何访问SDRAM。

如下图所示,CPU要访问SDRAM或者flash需要先通过AHB总线,然后再通过外存接口控制器对外存寻址,然后进行数据的读写。

访问外存

6. 中断是嵌入式中重要的组成部分,中断服务程序通常需要满足哪些要求?

中断是嵌入式系统中重要的组成部分,很多外设和cpu的交互都是通过中断的方式进行。衡量一个OS的实时性很重要的一个特性就是中断的响应时间,长时间处于中断状态所以中断反应。一旦进入中断状态,cpu是在占用的,所以必须快速的出中断,否则会影响整体性能。

中断服务程序需要满足如下要求:

  1. 不能返回值;
  2. 不能向ISR传递参数;
  3. ISR应该尽可能的短小精悍;
  4. 要尽快出中断;
  5. 耗时的中断要放到中断的底半部;
  6. 中断不要调用会因其休眠的函数;
  7. 通常中断中不做浮点操作;
  8. 中断函数中不可调用不可重入的函数,会引起意想不到的问题。

7. 使用共享资源时,为了使之满足互斥条件,通常有哪些方法?

共享资源也叫临界资源,在进程和线程、内核下都有自己的同步互斥机制, 仅考虑互斥的话,分开来看:

进程:信号量(值设置为1) 线程:互斥体、信号量(也叫信号灯) 内核:原子操作,自旋锁,信号量,互斥锁

8. 嵌入式操作系统有哪些同步通信服务?

Linux进程间通信方式主要有

  1. 信号
  2. 信号量
  3. 管道
  4. 消息队列
  5. 共享内存
  6. 套接字(本地的还有域套接字)

9. 请举例说明什么是可重入函数与不可重入函数。

1. 不可重入函数

在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果有一个函数不幸被设计成为不可重入这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果。这样的函数是不安全的函数,也叫不可重入函数。

满足下列条件的函数多数是不可重入的

  1. 函数体内使用了静态的数据结构;
  2. 函数体内调用了malloc()或者free()函数(malloc和free为不可重入函数);
  3. 函数体内调用了标准I/O函数。

2. 可重入函数

可重入函数可以被一个以上的任务调用,而不必担心数据被破坏。可重入函数任何时候都可以被中断,一段时间以后又可以运行,而相应的数据不会丢失。可重入函数或者只使用局部变量,即保存在CPU寄存器中或堆栈中;或者使用全局变量,则要对全局变量予以保护

如何写出可重入函数在函数体内不访问那些全局变量,不使用静态局部变量,坚持只使用缺省态(auto)局部变量,写出的函数就将是可重入的。如果必须访问全局变量,记住利用互斥信号量来保护全局变量。或者调用该函数前关中断,调用后再开中断。Linux常见的可重入函数

3. 举例

A) 可重入函数

void strcpy(char * dest, char * src) {
 while(*dest++=*src++);
 *dest = 0;
}

B) 不可重入函数1

char temp;//全局变量
void swapchar(char * x, char * y) {
 temp = *x;
 *x=*y;
 *y=temp;//访问了全局变量
}

C) 不可重入函数2

void swapchar(char * x, char * y) {
 char temp;//局部变量
 temp = *x;
 *x=*y;
 *y=temp;//使用了全局变量
}

4. 不可重入函数的使用注意事项

int Exam = 0;  
unsigned int exampleint para )   
{   
    unsigned int temp;  
    Exam = para; // (**)  
    temp = Square_Exam( );  
    return temp;  

Exam 是 int 型全局变量,函数 Squre_Exam() 返回 Exam 平方值,所以函数example()不具有可重入性。 

此函数若被多个进程调用的话,其结果可能是未知的,因为当 Exam = para语句刚执行完后,另外一个使用本函数的进程可能正好被激活,那么当新激活的进程执行到此函数时,将使 Exam 赋与另一个不同的 para 值,所以当控制重新回到 “temp = Square_Exam( )” 后,计算出的temp很可能不是预想中的结果。

此函数应如下改进:

int Exam = 0;  
unsigned int exampleint para )   
{  
    unsigned int temp;  
    [申请信号量操作] //(1)  加锁  
    Exam = para;  
    temp = Square_Exam( );  
    [释放信号量操作] //     解锁   
    return temp;  

申请不到“信号量”,说明另外的进程正处于给 Exam 赋值并计算其平方过程中(即正在使用此信号),本进程必须等待其释放信号后,才可继续执行。

若申请到信号,则可继续执行,但其它进程必须等待本进程释放信号量后,才能再使用本信号。

5. 可重入函数

可重入函数

10. int *fun(void)与int (*fun)(void)区别?

int *fun(void) fun是一个函数名,该函数的参数是void型,返回值是 int *

int (*fun)(void) fun是一个函数指针,该指针用于指向一个函数,函数的参数是void型,返回值是 int 即类型如下:

int function(void)
{
 return 0;
}

11. 32位系统上有如下C程序:

struct person
{

 int a;
 unsigned short int m;
 char b;
 char *q;
 char c;
};
char str[]="yikoulinux";
char *p = str;
int n = 10;

则sizeof(str)、sizeof(p)、sizeof(n)、sizeof(int)、sizeof(struct person)的值分别是:

编写测试程序

  1 #include <stdio.h>
  2 
  3 int main(int argc, const char *argv[])
  4 
{
  5     struct person
  6     {

  7         int a;
  8         unsigned short int m;
  9         char b;
 10         char *q;
 11         char c;
 12     };
 13     char str[]="yikoulinux";
 14     char *p = str;
 15     int n = 10;
 16 
 17     struct person pe;
 18 
 19     printf("sizeof(str):%d sizeof(p):%d sizeof(n):%d sizeof(int):%d sizeof(struct person):%d\n",si
 20 
 21     printf("%p\n %p\n %p\n %p \n %p \n",
 22             &pe.a,&pe.m,&pe.b,&pe.q,&pe.c);
 23     return 0;
 24 }

编译执行:

sizeof(str):11 sizeof(p):4 sizeof(n):4 sizeof(int):4 sizeof(struct person):16
 0xbf917d18
 0xbf917d1c
 0xbf917d1e
 0xbf917d20 
 0xbf917d24 

解释:

类型 解释
sizeof(str) 11 这是计算数组str的大小,因为没有设置数组大小,以赋值字符串大小为准,而常量字符串在后一个位置会补一个空字符'\0',所以一共11个字节
sizeof(p) 4 p是一个指针,32位机的指针都是32位,4个字节
sizeof(n) 4 n是一个整型变量,所以是4个字节
sizeof(int) 4 计算int 类型占用的内存大小,是4个字节
sizeof(struct person) 16 默认情况下结构体成员会字节对齐,详细分布见下图
 
------------ END ------------


推荐阅读


【1】C语言实现MD5加密,竟如此简单!必读
【2】【粉丝问答11】如何在内网搭建TCP服务器并能被外网直接访问 必读
【3】手把手教Linux驱动10-platform总线详解必读
【4】基于Linux的tty架构及UART驱动详解必读
【5】 你好,李焕英 必读
【6】1万字30张图说清TCP协议 必读
【7】 一键获取linux内存、cpu、磁盘IO等信息脚本编写,及其原理详解 必读
【8】 自己DIY一个mp3播放器
【9】 从Linux源码看Socket(TCP)的bind
【10】 【粉丝问答12】如何计算函数的执行时间? 必读

 


 

进群,请加一口君个人微信,带你嵌入式入门进阶。


在公众号内回复「1024」,即可免费获取学习资料,期待你的关注~


一口Linux 写点代码,写点人生!
评论
  • 近期,智能家居领域Matter标准的制定者,全球最具影响力的科技联盟之一,连接标准联盟(Connectivity Standards Alliance,简称CSA)“利好”频出,不仅为智能家居领域的设备制造商们提供了更为快速便捷的Matter认证流程,而且苹果、三星与谷歌等智能家居平台厂商都表示会接纳CSA的Matter认证体系,并计划将其整合至各自的“Works with”项目中。那么,在本轮“利好”背景下,智能家居的设备制造商们该如何捉住机会,“掘金”万亿市场呢?重认证快通道计划,为家居设备
    华普微HOPERF 2025-01-16 10:22 133浏览
  • 晶台光耦KL817和KL3053在小家电产品(如微波炉等)辅助电源中的广泛应用。具备小功率、高性能、高度集成以及低待机功耗的特点,同时支持宽输入电压范围。▲光耦在实物应用中的产品图其一次侧集成了交流电压过零检测与信号输出功能,该功能产生的过零信号可用于精确控制继电器、可控硅等器件的过零开关动作,从而有效减小开关应力,显著提升器件的使用寿命。通过高度的集成化和先进的控制技术,该电源大幅减少了所需的外围器件数量,不仅降低了系统成本和体积,还进一步增强了整体的可靠性。▲电路示意图该电路的过零检测信号由
    晶台光耦 2025-01-16 10:12 84浏览
  •  光伏及击穿,都可视之为 复合的逆过程,但是,复合、光伏与击穿,不单是进程的方向相反,偏置状态也不一样,复合的工况,是正偏,光伏是零偏,击穿与漂移则是反偏,光伏的能源是外来的,而击穿消耗的是结区自身和电源的能量,漂移的载流子是 客席载流子,须借外延层才能引入,客席载流子 不受反偏PN结的空乏区阻碍,能漂不能漂,只取决于反偏PN结是否处于外延层的「射程」范围,而穿通的成因,则是因耗尽层的过度扩张,致使跟 端子、外延层或其他空乏区 碰触,当耗尽层融通,耐压 (反向阻断能力) 即告彻底丧失,
    MrCU204 2025-01-17 11:30 88浏览
  • 日前,商务部等部门办公厅印发《手机、平板、智能手表(手环)购新补贴实施方案》明确,个人消费者购买手机、平板、智能手表(手环)3类数码产品(单件销售价格不超过6000元),可享受购新补贴。每人每类可补贴1件,每件补贴比例为减去生产、流通环节及移动运营商所有优惠后最终销售价格的15%,每件最高不超过500元。目前,京东已经做好了承接手机、平板等数码产品国补优惠的落地准备工作,未来随着各省市关于手机、平板等品类的国补开启,京东将第一时间率先上线,满足消费者的换新升级需求。为保障国补的真实有效发放,基于
    华尔街科技眼 2025-01-17 10:44 71浏览
  • 百佳泰特为您整理2025年1月各大Logo的最新规格信息,本月有更新信息的logo有HDMI、Wi-Fi、Bluetooth、DisplayHDR、ClearMR、Intel EVO。HDMI®▶ 2025年1月6日,HDMI Forum, Inc. 宣布即将发布HDMI规范2.2版本。新规范将支持更高的分辨率和刷新率,并提供更多高质量选项。更快的96Gbps 带宽可满足数据密集型沉浸式和虚拟应用对传输的要求,如 AR/VR/MR、空间现实和光场显示,以及各种商业应用,如大型数字标牌、医疗成像和
    百佳泰测试实验室 2025-01-16 15:41 128浏览
  • 电竞鼠标应用环境与客户需求电竞行业近年来发展迅速,「鼠标延迟」已成为决定游戏体验与比赛结果的关键因素。从技术角度来看,传统鼠标的延迟大约为20毫秒,入门级电竞鼠标通常为5毫秒,而高阶电竞鼠标的延迟可降低至仅2毫秒。这些差异看似微小,但在竞技激烈的游戏中,尤其在对反应和速度要求极高的场景中,每一毫秒的优化都可能带来致胜的优势。电竞比赛的普及促使玩家更加渴望降低鼠标延迟以提升竞技表现。他们希望通过精确的测试,了解不同操作系统与设定对延迟的具体影响,并寻求最佳配置方案来获得竞技优势。这样的需求推动市场
    百佳泰测试实验室 2025-01-16 15:45 174浏览
  • 实用性高值得收藏!! (时源芯微)时源专注于EMC整改与服务,配备完整器件 TVS全称Transient Voltage Suppre,亦称TVS管、瞬态抑制二极管等,有单向和双向之分。单向TVS 一般应用于直流供电电路,双向TVS 应用于电压交变的电路。在直流电路的应用中,TVS被并联接入电路中。在电路处于正常运行状态时,TVS会保持截止状态,从而不对电路的正常工作产生任何影响。然而,一旦电路中出现异常的过电压,并且这个电压达到TVS的击穿阈值时,TVS的状态就会
    时源芯微 2025-01-16 14:23 128浏览
  • 全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,与汽车技术领先者法雷奥合作,采用创新的开放系统协议(OSP)技术,旨在改变汽车内饰照明方式,革新汽车行业座舱照明理念。结合艾迈斯欧司朗开创性的OSIRE® E3731i智能LED和法雷奥的动态环境照明系统,两家公司将为车辆内饰设计和功能设立一套全新标准。汽车内饰照明的作用日益凸显,座舱设计的主流趋势应满足终端用户的需求:即易于使用、个性化,并能提供符合用户生活方式的清晰信息。因此,动态环境照明带来了众多新机遇。智能LED的应用已
    艾迈斯欧司朗 2025-01-15 19:00 71浏览
  • 一个易用且轻量化的UI可以大大提高用户的使用效率和满意度——通过快速启动、直观操作和及时反馈,帮助用户快速上手并高效完成任务;轻量化设计则可以减少资源占用,提升启动和运行速度,增强产品竞争力。LVGL(Light and Versatile Graphics Library)是一个免费开源的图形库,专为嵌入式系统设计。它以轻量级、高效和易于使用而著称,支持多种屏幕分辨率和硬件配置,并提供了丰富的GUI组件,能够帮助开发者轻松构建出美观且功能强大的用户界面。近期,飞凌嵌入式为基于NXP i.MX9
    飞凌嵌入式 2025-01-16 13:15 122浏览
  • 随着消费者对汽车驾乘体验的要求不断攀升,汽车照明系统作为确保道路安全、提升驾驶体验以及实现车辆与环境交互的重要组成,日益受到业界的高度重视。近日,2024 DVN(上海)国际汽车照明研讨会圆满落幕。作为照明与传感创新的全球领导者,艾迈斯欧司朗受邀参与主题演讲,并现场展示了其多项前沿技术。本届研讨会汇聚来自全球各地400余名汽车、照明、光源及Tier 2供应商的专业人士及专家共聚一堂。在研讨会第一环节中,艾迈斯欧司朗系统解决方案工程副总裁 Joachim Reill以深厚的专业素养,主持该环节多位
    艾迈斯欧司朗 2025-01-16 20:51 65浏览
  • 随着智慧科技的快速发展,智能显示器的生态圈应用变得越来越丰富多元,智能显示器不仅仅是传统的显示设备,透过结合人工智能(AI)和语音助理,它还可以成为家庭、办公室和商业环境中的核心互动接口。提供多元且个性化的服务,如智能家居控制、影音串流拨放、实时信息显示等,极大提升了使用体验。此外,智能家居系统的整合能力也不容小觑,透过智能装置之间的无缝连接,形成了强大的多元应用生态圈。企业也利用智能显示器进行会议展示和多方远程合作,大大提高效率和互动性。Smart Display Ecosystem示意图,作
    百佳泰测试实验室 2025-01-16 15:37 132浏览
  • 80,000人到访的国际大展上,艾迈斯欧司朗有哪些亮点?感未来,光无限。近日,在慕尼黑electronica 2024现场,ams OSRAM通过多款创新DEMO展示,以及数场前瞻洞察分享,全面展示自身融合传感器、发射器及集成电路技术,精准捕捉并呈现环境信息的卓越能力。同时,ams OSRAM通过展会期间与客户、用户等行业人士,以及媒体朋友的深度交流,向业界传达其以光电技术为笔、以创新为墨,书写智能未来的深度思考。electronica 2024electronica 2024构建了一个高度国际
    艾迈斯欧司朗 2025-01-16 20:45 62浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦