嵌入式复习题

更新时间:2023-10-02 02:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1.6 习题

一、填空题

1.目前,嵌入式处理器种类繁多。按照类型大致可以分为嵌入式微处理器 EMPU 、嵌入式微控制器 MCU 、嵌入式数字信号处理器 EDSP 和片上可编程系统 SOPC 。

2.BootLoader就是在 操作系统内核 运行前执行的一小段程序,用于 引导加载程序 以及 系统内核 。

3.BootLoader是依赖于硬件平台的,不同的 嵌入式处理器 和 嵌入式系统 需要不同的BootLoader来引导。

4.嵌入式系统主要由 嵌入式处理器 、 相关外围硬件 、 嵌入式操作系统 及 应用软件系统 等组成,它是可独立工作的系统。

5.要想成为一个比较优秀的嵌入式开发人员,应该牢记 “博、专、实践” 的原则。

二、简答题

1.简述嵌入式系统的开发过程。

答:嵌入式系统的开发过程主要包括6个方面:芯片选择、配置硬件平台、Bootloader移植、操作系统裁减、操作系统移植和应用程序开发。

2.简述各类嵌入式处理器及其特点。

答:嵌入式处理器,常用的主要包括如下几类: 嵌入式微处理器EMPU:,嵌入式微处理器EMPU在使用时,将微处理器装配在专门设计的电路板上,只保留和嵌入式应用有关的母板功能,这样可以大幅度减小系统体积和功耗。另外,为了满足嵌入式应用的特殊要求,在温度范围、抗电磁干扰、可靠性等方面一般都做了相应的增强。

嵌入式微控制器MCU:嵌入式微控制器一般以某一种微处理器内核为核心,芯片内部集成ROM/EPROM、RAM、总线、总线逻辑、定时/计数器、WatchDog、I/O、串行口、脉宽调制输出、A/D、D/A、Flash RAM、EEPROM等各种必要功能和外设。

嵌入式数字信号处理器EDSP:典型的DSP处理器主要是对系统结构和指令进行了特殊设计,使其适合于执行DSP算法,编译效率较高,指令执行速度也较高。在数字滤波、FFT、谱分析等方面DSP算法正在大量进入嵌入式领域,DSP应用正从在通用单片机中以普通指令实现DSP功能,过渡到采用嵌入式DSP处理器。

片上可编程系统SOPC:片上可编程系统SOPC是一种新的软硬件协同设计的系统设计技术,其将处理器、RAM存储器、ROM存储器、总线、总线控制器、I/O接口、DSP、锁相环等集成到一片FPGA芯片中。SOPC具有灵活的设计方式、可裁减、可扩充、可升级、并具备软硬件在系统可编程能力。

第14章 Swing桌面程序开发

3.简述如何成为嵌入式开发人员。

答:嵌入式开发人员提应该牢记“博、专、实践”的原则。

? 博:要求设计者不但需要掌握嵌入式处理器的使用,还需要通晓各种外围电路的

实现。软件上还需要掌握Bootloader的移植、嵌入式操作系统的移植和裁减、驱动程序的开发以及应用程序的开发。

? 专:一个优秀的嵌入式开发人员,不可能嵌入式开发过程中的每一个领域都精通。

但需要嵌入式开发人员对其中的某些方面具有很深的造诣,这样可以提高竞争力。 ? 实践:嵌入式开发人员应该多练习、多交流、多实践。这样,一方面可以在实践

中排查错误、完善系统的稳定性,另一方面也可以巩固所学的知识、不断深化技术造诣。

2.4 习题

一、填空题

1.按照系统对相应时间的敏感程度,嵌入式操作系统可以分为三类, 硬实时 系统、 软实时 系统和 非实时 系统。

2.VxWorks操作系统是美国 WindRiver 公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。

3.Windows CE是微软旗下的一个 32 位嵌入式操作系统。在Windows CE中,C代表 袖珍(Compact)、消费(Consumer)、通信能力(Connectivity)和伴侣(Companion) ,E代表 电子产品(Electronics) 。目前最新的Windows CE为 Windows CE 6.0 。

4.μC/OS-II是一种 开源但不免费 的实时操作系统,具有 可剥夺实时 内核。

5.Palm OS是 3Corn 公司的产品,其是一种 32 位的嵌入式操作系统。Palm OS一套专门为 掌上电脑 开发的操作系统。

二、选择题

1.下面那个不是嵌入式操作系统的特点( B )。 A.高了系统的可靠性 B.体积庞大 C.系统配置灵活 D.充分发挥了32位CPU的多任务潜力 2.下面那个不是μC/OS-II嵌入式操作系统的特点( D )。 A.提供任务调度与管理 B.占用空间小 C.执行效率高 D.完全免费

3.下面那个不是Windows CE嵌入式操作系统的特点( D )。 A.继承了传统Windows图形界面 B.灵活的电源管理功能 C.优秀的线程响应能力 D.极小的系统内核 4.下面那个不是嵌入式Linux操作系统的特点( D )。

249

21天学通Java

A.源代码公开 C.高性能、可裁剪的内核 三、简答题

1.简述嵌入式操作系统与通用操作系统的区别。

答:通用操作系统是一种通用的操作系统,可运行在不同的硬件平台。而嵌入式操作系统与一般的Windows操作系统不同,其是一种专用、可定制的特点。

2.简述各个主流嵌入式操作系统的特点。

答:由于内容很多,这里省略,读者可以直接参阅书中第2节的介绍。

B.遵循GPL协议

D.具有Windows风格的图形界面

3.7 习题

一、填空题

1.RISC以 CISC 为基础,重点优化 计算机结构 ,使其更加简单合理地提高运算速度。

2.Cortex-M3是一款低功耗处理器,具有 门数码 少, 中断延时 短,调试成本低的特点,是为要求有快速中断响应能力的深度嵌入式应用而设计的。

3.ARM7内核为低功耗的 32位RISC 处理器,其采用 冯?诺依曼 体系结构,数据和指令使用同一条总线。ARM7内核有一条 3级 流水线,执行 ARMv4 指令集,最适合用于对价位和功耗要求较高的消费类应用。

4.ARM10E内核为 32位RISC 处理器,具有高性能、低功耗的特点。ARM10E采用了新的体系结构,与同等的ARM9器件相比较,在同样的时钟频率下,性能提高了 近50% 。

5.ARM Cortex-M3内核主系统由四个驱动单元: 内核ICode 总线(I-bus)、 DCode 总线(D-bus)、 系统 总线(S-bus)和 GP-DMA (通用DMA)构成。

二、选择题

1.Cortex-M3采用( A )流水线结构。 A.3级 B.4级 C.6级 D.6级 2.Cortex-M3 处理器采用( A )架构。 A.ARM v7-M 架构 B.ARM v4-M 架构 C.ARM v6-M 架构 D.以上都不是 3.Cortex-M3的指令集包括( AB )。(多选) A.16 位thumb 指令集 B.32位thumb-2 指令集 C.ARM指令集 D.以上都包括 4.Cortex-M3处理器支持以下哪些数据类型( ABCD )。(多选)

250

第14章 Swing桌面程序开发

A.32 位字 B.16 位半字 C.8 位字节 D.64位双字 5.以下哪个表述不正确( D )。 A.ARM是一个公司的名称 B.ARM是对一类微处理器的通称 C.ARM是一种技术的名字 D.ARM是一款芯片的名称 三、简答题

1.简述ARM处理器系列及其特点。

答:由于内容很多,这里省略,读者可以直接参阅书中第2节的介绍。

2.简述ARM Cortex-M3的结构。

答:ARM Cortex-M3内核主系统由四个驱动单元:内核ICode总线(I-bus)、DCode总线(D-bus)、系统总线(S-bus)和GP-DMA(通用DMA)构成。

? ICode总线:该总线将Cortex-M3内核的指令总线与Flash指令接口相连接。指令

预取在此总线上完成。

? DCode总线:该总线将Cortex-M3内核的DCode总线与闪存存储器的数据接口相

连接(常量加载和调试访问)。 ? 系统总线:此总线连接Cortex-M3内核的系统总线(外设总线)到总线矩阵,总线矩

阵协调着内核和DMA间的访问。

? DMA总线:此总线将DMA的AHB主控接口与总线矩阵相联,总线矩阵协调着

CPU的DCode和DMA到SRAM、闪存和外设的访问。

3.简述ARM Cortex-M3的编程模型。

答:Cortex-M3 处理器采用ARM v7-M 架构。它包括所有的16 位thumb 指令集和基本的32位thumb-2 指令集架构。Cortex-M3 处理器不能执行ARM 指令。Cortex-M3处理器支持两种工作模式,线程模式和处理模式。Cortex-M3处理器有两种工作状态:Thumb 状态和调试状态。Cortex-M3处理器代码可以是特权执行或非特权执行。非特权执行时对有些资源的访问受到限制或不允许访问。特权执行可以访问所有资源。处理模式始终是特权访问,线程模式可以是特权或非特权访问。

4.6 习题

一、填空题

1. ARM RealView MDK 是ARM公司和深圳英倍特公司合作开了本土化的ARM开发平台。

2.ST公司的STM32系列芯片采用了 Cortex-M3内核,其分为两个系列。 STM32F101 系列为标准型,运行频率为 36MHz ; STM32F103 系列为标准型,运行频率为 72MHz 。

251

21天学通Java

3.STM32全系列芯片都具有引脚到引脚 一一对应 的特点,并且相同封装的内部资源均相同,这就给用户升级带来很大方便。

4.STM32提供了一种最简单的程序下载方法,即 在应用编程 ,只需要串口连接到PC机上,便可以进行程序下载。

二、选择题

1.下列哪个不是RealView MDK开发环境的特点( D )。 A.Windows风格 B.兼容的Keil μVision界面 C.全面的ARM处理器支持 D.体积庞大 2.STM32F103VBT6资源不包括( D )。 A.128k的Flash B.100个引脚 C.USB接口 D.USB OTG接口 3.仿真执行程序,直到遇到一个断点的快捷键为( A )。 A.F5 B.F11 C.F12 D.F6

4.下列哪种方法可以对STM32进行程序下载( ABCD )。(多选) A.Keil ULink B.J-Link C.在应用编程 D.以上都可以 三、简答题

1.简述ARM RealView开发环境的特点。

答:ARM RealView MDK开发平台具有如下主要特点:

? 采用Keil μVision3的开发环境和界面,给单片机用户的升级带来极大的方便。 ? 具有Windows风格的可视化操作界面,界面友好,使用极为方便; ? 支持汇编语言、C51语言以及混合编程等多种方式的单片机设计;

? 集成了非常全面的ARM处理器支持,能够完成ARM7、ARM9以及ARM

Cortex-M3等处理器的程序设计和仿真;

? 集成了丰富的库函数,以及完善的编译连接工具;

? 提供了并口、串口、A/D、D/A、定时器/计数器以及中断等资源的硬件仿真能力,

能够帮助用户模拟实际硬件的执行效果;

? 可以与多款外部仿真器联合使用,提供了强大的在线仿真调试能力;

? 内嵌RTX-51 Tiny和RTX-51 FULL内核,提供了简单而强大的实时多任务操作系

统支持;

? 在一个开发界面中支持多个项目的程序设计;

? 支持多级代码优化,最大限度地帮助用户精简代码体积;

? 由于Keil μVision具有最为广泛的用户群,因此相应的代码资源非常丰富,读者

可以轻松地找到各类编程资源以加速学习和开发过程。

2.简述基于ARM Cortex-M3的STM32芯片特点。

252

第14章 Swing桌面程序开发

答:ST公司的STM32系列芯片采用了ARM Cortex-M3内核,其分为两个系列。STM32F101系列为标准型,运行频率为36MHz;STM32F103系列为标准型,运行频率为72MHz。STM32全系列芯片都具有引脚到引脚一一对应的特点,并且相同封装的内部资源均相同,这就给用户升级带来很大方便。

3.简述STM32最小硬件开发系统的组成及其各部分的作用。 答:读者可以参阅正文中的第3节,其中包括如下几个部分:

? 主芯片:采用STM32系列,为整个开发系统的核心,本书所有的程序都运行在其

中。

? 晶体振荡部分:提供了硬件时序以及实时时钟使用。 ? 供电部分:采用AM1117为芯片提供稳定的3.3V电压。 ? 复位部分:采用一个按键开关来实现。

5.7 习题

一、填空题

1.Cortex-M3不支持 ARM 指令。另外,Cortex-M3支持绝大部分的 ARMv6 Thumb 指令和 ARMv7 Thumb 指令。

2.索引数据传送指令包括 预索引 和 后索引 两类。带 预索引 的数据传送可以用在多种数据类型上,并且既可用于 加载 ,又可用于 存储 。

3.除了支持“预索引”,还支持 “后索引”(Post‐indexing) 。 后索引 也要使用一个立即数offset,但与预索引不同的是,后索引是 忠实使用基址

寄存器Rd 的值作为数据传送的地址的 。待到数据传送后,再执行 Rd←Rd+offset 。

4.用于 在寄存器间传送数据 的指令是MOV。与MOV指令相关的另一个指令是 MVN ,它把寄存器的内容取反后再传送。

二、选择题

1.ARM Cortex-M3支持的指令集不包括( A )。 A.ARM B.ARMv6 Thumb C.ARMv7 Thumb D.以上全不包括 2.下列哪个是ARM Cortex-M3支持的指令( A )。 A.SETEND B.MOV C.ADD D.MVN

3.Cortex-M3片载了硬件乘法器,支持如下哪些64位乘法指令( ABCD )。(多选)

A.SMULL B.SMLAL

253

21天学通Java

C.UMULL D.SMLAL 4.Cortex-M3中的数据序转移指令包括( ABC )。(多选) A.REV.W B.REV16.W C.REVSH.W D.LDRB

5.如果需要保存返回地址,则可以使用如下哪些转移指令( CD )。(多选) A.B B.BX C.BL D.BLX 三、简答题

1.简述ARM Cortex-M3不支持的指令及其原因。

答:Cortex-M3不支持ARM指令。另外,Cortex-M3支持绝大部分的ARMv6 Thumb指令,但以下两个指令不支持

? BLX #im:在使用立即数做操作数时,BLX 总是要切入ARM 状态。因为

Cortex-M3 只在Thumb 态下运行,故以此指令为代表的,凡是试图切入ARM 态的操作,都将引发一个用法错误。

? SETEND:由 v6 引入的,在运行时改变处理器端设置的指令(大端或小端)。

因为Cortex-M3不支持动态端的功能,所以此指令也将引发错误。

Cortex-M3支持部分的ARMv7 Thumb指令,但有少量在ARMv7 Thumb中列出的指令不被支持,如表5-13所示。

表5-13 不支持的ARMv7 Thumb指令

指令格式 MCR MCR2 MCRR MRC MRC2 MRRC LDC STC CPS.W A CPS.W #mode DBG PLD PLI YIELD 原功能或不支持的原因 把通用寄存器的值传送到协处理器的寄存器中 把通用寄存器的值传送到协处理器的寄存器中 把通用寄存器的值传送到协处理器的寄存器中,一次操作两个 把协处理器寄存器的值传送到通用寄存器中 把协处理器寄存器的值传送到通用寄存器中 把协处理器寄存器的值传送到通用寄存器中,一次操作两个 把某个连续地址空间中的一串数值传送至协处理器中 从协处理器中传送一串数值到地址连续的一段地址空间中 Cortex-M3没有“A”位 Cortex-M3的PSR 中没有“mode”位 服务于跟踪系统的一条 hint 指令 预取数据。这是服务于cache 系统的一条hint 指令。因为在CM3 中没有cache,该指令就相当于NOP 预取指令。这是服务于cache 系统的一条hint 指令。因为在CM3 中没有cache,该指令就相当于NOP 用于多线程处理。线程使用该指令通知给硬件:我正在做的任务可以被交换出去(swapped out),从而提高系统的整体性能。

2.查找ARM Cortex-M3所支持的全部16位和32位指令集。 答:这里省略。

254

第14章 Swing桌面程序开发

3.简述预索引和后索引和区别。

答:带预索引的数据传送可以用在多种数据类型上,并且既可用于加载,又可用于存储。后索引也要使用一个立即数offset,但与预索引不同的是,后索引是忠实使用基址寄存器Rd 的值作为数据传送的地址的。待到数据传送后,再执行Rd←Rd+offset。其中,offset 可以是负数。

6.5 习题

一、填空题

1.对于大部分基于闪存的系统来说,一项重要的需求就是当这些系统安装在终端产品上后,具有更新固件的能力,这个能力称为 在应用编程 。

2.STM32在每个芯片出厂之前,保存了一段 BootLoader 程序供用户快速实现在应用编程。BootLoader程序的主要任务是通过 USART1 端口下载固件程序到内置的 Flash 存储器中。

3.在STM32中提供了 3 种不同的启动模式,一般由 BOOT[1:0] 引脚电平来选择。

4.STM32的三种启动模式对应的三种存储介质都是芯片 内置的 。

5.在ST32的三种启动模式中,从 用户闪存 启动,这是正常的工作模式。

从 系统存储器 启动,这种模式启动的程序功能由厂家设置。从 内置SRAM 启动,这种模式可以用于调试。

6.在系统上电的时候,CPU首先根据 BOOT[1:0] 引脚电平 来确定是哪种

模式的启动,然后就是把相应模式的起始地址映射到 0 地址处,并从 0 地址处开始执行。

7.BOOT[1:0]引脚电平的值是在复位后 SYSCLK 的第 4 个上升沿时被锁定的。当退出 standby 模式时,BOOT[1:0]引脚被重新采样。因此,BOOT[1:0]引脚必须在 standby 模式下也保持需要的启动模式配置。

二、选择题

1.下列哪个是STM32的BootLoader的特点( ABCD )。(多选) A.BootLoader程序在每个芯片出厂的时候已经内置,无需用户干预 B.支持任意波特率

C.BootLoader程序通过USART1端口下载固件程序到内置的Flash存储器中 D.占用引脚少,与计算机的串口只需RX和TX两根引脚即可完成固件升级工作 2.STM32启动BootLoader需要置如下那些引脚( C )。 A.BOOT1=0,BOOT0=0 B.BOOT1=1,BOOT0=0 C.BOOT1=0,BOOT0=1 D.BOOT1=1,BOOT0=1 3.通过意法半导体的BootLoader程序可以完成( ABCD )。(多选) A.固件下载 B.读Flash

255

21天学通Java

C.擦除Flash 三、简答题

1.简述什么是在应用编程及其优点。

答:对于大部分基于闪存的系统来说,一项重要的需求就是当这些系统安装在终端产品上后,具有更新固件的能力,这个能力称为在应用编程(In-Application Programming IAP)。很显然,在应用编程的好处是可以摆脱昂贵、复杂的编程器和仿真器,为用户的最终产品提供方便的固件程序的更新能力。另外,对于资源有限的开发者来说,也提供了一种极低成本的固件下载方法。

2.简述STM32的在应用编程及其BootLoader。 答:基于ARM Cortex-M3的STM32具备了在应用编程能力。STM32在每个芯片出厂之前,保存了一段BootLoader程序供用户快速实现在应用编程。BootLoader程序的主要任务是通过USART1端口下载固件程序到内置的Flash存储器中。

3.简述STM32的启动模式及启动配置。

答:在STM32中提供了三种不同的启动模式,一般由BOOT[1:0]引脚电平来选择。 ? BOOT1=x,BOOT0=0:用户闪存被选作启动区,x表示任意电平。 ? BOOT1=0,BOOT0=1:系统内存被选作启动区。

? BOOT1=1,BOOT0=1:嵌入式SRAM被选作启动区。

D.编辑选项字节

7.5 习题

一、填空题

1.FreeRTOS是一个 可移植 、 开源的 小型实时内核。FreeRTOS 作为开源的轻量级实时性操作系统,不仅实现了基本的实时调度、信号量、队列和存储管理,而且在商业应用上不需要 授权费 。

2. 调度器 是内核中负责决定在某个特殊时间哪个任务应该执行的部分。内核可以在任务的 生命期 挂起、恢复一个任务许多次。

3.跟任何其他程序一样,一个任务执行时,它使用处理器/微控制器的寄存器,访问RAM ROM。这些资源一起组成 任务的执行上下文 。

4.FreeRTOS允许一定数量的参数存在,使得FreeRTOS内核可以剪裁来更加适合具体的应用程序。这些参数,位于 FreeRTOSConfig.h 文件中。

二、选择题

1.下列哪个是FreeRTOS支持的处理器构架( ABCD )。(多选) A.ARM7 B.ARM9 C.Cortex-M3 D.AVR32 2.FreeRTOS的主要功能特点包括( ABCD )。(多选)

256

第14章 Swing桌面程序开发

A.时间管理 C.消息队列 三、简答题

1.简述FreeRTOS的系统定制功能。

答:FreeRTOS是一种开源的嵌入式操作系统。FreeRTOS提供了系统定制功能,同时也提供了多种API函数用来实现任务控制和内核控制。FreeRTOS允许一定数量的参数存在,使得FreeRTOS内核可以剪裁来更加适合具体的应用程序。这些参数,位于FreeRTOSConfig.h.文件中。每一个包含FreeRTOS源代码演示程序,都有它自己的FreeRTOSConfig.h文件。

2.简述FreeRTOS的任务控制API及功能。

答:FreeRTOS操作系统的任务控制通过一系列的API函数来实现,每个API函数及其功能可以参阅本章正文。

3.简述FreeRTOS的内核控制API及功能。

答:FreeRTOS操作系统的内核控制也是通过一系列的API函数来实现,每个API函数及其功能可以参阅本章正文。

B.内存管理 D.优先级调度

8.5 习题

一、填空题

1.嵌入式实时操作系统UC/OS首先在1992年发布,目前 UC/OS-Ⅱ 是最新版

本。 嵌入式实时操作系统 UC/OS-Ⅱ 是一种 开源 但 不免费 的实时操作系统,具有 可剥夺实时 内核。

2.在UC/OS-Ⅱ中, 任务 可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。这里要注意的是,任务代码并不是被真正的删除了,而只是 操作系统不再理会该任务代码 ,所以该任务代码不会再运行。

3.UC/OS-II也可以通过事件来实现数据共享和任务通讯,这里讲到的事件,可以是 信号量 、 邮箱 或者 消息队列 等。

4.UC/OS-II中的信号量由两部分组成:一个是 信号量的计数值 ,它是一个16位的无符号整数(0 到65535之间);另一个是 由等待该信号量的任务组成的等待任务表 。

5. 邮箱 是UC/OS-II系统中的另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量。

6. 消息队列 是UC/OS-II系统中的另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。

257

21天学通Java

二、选择题

1.UC/OS-II中的信号量计数值的范围为( A )。 A.0~65535 B.0~511 C.0~65536 D.0~512 2.UC/OS-II的主要功能特点包括( ABCD )。(多选) A.时间管理 B.任务调度 C.任务间同步与通信列 D.支持邮箱消息 3.下列哪项是UC/OS-II系统本身不支持的( A )。 A.文件系统 B.信号量 C.消息邮箱 D.内存管理

4. UC/OS-II系统中,用户应用程序最多可以使用多少个任务( B )。 A.64 B.56 C.无限多 D.8 三、简答题

1.简述UC/OS-II的任务管理。

答:在UC/OS-Ⅱ中,任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。这里要注意的是,任务代码并不是被真正的删除了,而只是操作系统不再理会该任务代码,所以该任务代码不会再运行。任务看起来与函数是一样的,具有一个返回类型和一个参数,只是它从不返回。因此,任务的返回类型必须被定义成void型。

UC/OS-Ⅱ可以管理多达64个任务,并从中保留了四个最高优先级和四个最低优先级的任务供自己使用,所以用户可以使用的只有56个任务。任务的优先级越高,反映优先级的值则越低。在最新的UC/OS-Ⅱ版本中,任务的优先级数也可作为任务的标识符使用。

2.简述UC/OS-II任务之间的通信与同步方式。

答:在UC/OS-II中,有多种方法可以保护任务之间的共享数据和提供任务之间的通讯。比较简单的两种方法如下:

? 利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中

断。当两个任务或者一个任务和一个中断服务子程序共享某些数据时,可以采用这种方法。

? 利用函数OSSchedLock()和OSSchekUnlock()对μC/OS-II中的任务调度函数上锁和

开锁。用这种方法也可以实现数据的共享。

另外,UC/OS-II也可以通过事件来实现数据共享和任务通讯。这里讲到的事件,可以是信号量、邮箱或者消息队列等。

258

第14章 Swing桌面程序开发

9.5 习题

一、填空题

1.当STM32的I/O端口配置为输入时, 输出缓冲器 被禁止, 施密特触发输入 被激活。根据输入配置(上拉,下拉或浮动)的不同,该引脚的 弱上拉和下拉电阻 被连接。出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器,对 输入数据寄存器 的读访问可得到I/O状态。

2.STM32的所有端口都有外部中断能力。当使用 外部中断线 时,相应的引脚必须配置成 输入模式 。

3.STM32具有单独的位设置或位清除能力。这是通过GPIOx_BSRR 和 GPIOx_BRR 寄存器来实现的。

4.ST公司还提供了完善的通用IO接口库函数,其位于 stm32f10x_gpio.c ,对应的头文件为 stm32f10x_gpio.h 。

5.为了优化不同引脚封装的外设数目,可以把一些 复用功能 重新映射到其他引脚上。这时,复用功能不再映射到 它们原始分配的引脚 上。在程序上,是通过设置 复用重映射和调试I/O配置寄存器(AFIO_MAPR) 来实现引脚的重新映射。

二、选择题

1.在APB2上的I/O脚的翻转速度为( A )。 A.18MHz B.50MHz C.36MHz D.72MHz

2.定时器2的TIM2_REMAP[1:0]为“10”和“11”的重映射,适用于( AB )封装的芯片。

A.64引脚 B.100引脚 C.36引脚 D.144引脚

3.USART2的USART2_REMAP = 1的重映射只适用于( B )引脚的封装。 A.64引脚 B.100引脚 C.36引脚 D.144引脚

4.当输出模式位MODE[1:0]=“10”时,最大输出速度为( B )。 A.10MHz B.2MHz C.50MHz D.72MHz

三、简答题

1.简述不同复用功能的重映射。 答:为了优化不同引脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。这时,复用功能不再映射到它们原始分配的引脚上。在程序上,是通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)来实现引脚的重新映射。各个复用功能的重映射可以参阅正文的介绍,由于内容比较多,正文介绍非常详细,这里省略。

259

21天学通Java

2.简述STM32的GPIO的一些主要特点(至少5个)。 答:主要特点如下:

? 通用I/O,可以作为输出、输入等功能。 ? 单独的位设置或位清除。 ? 外部中断/唤醒线。

? 复用功能(AF)和重映射。 ? GPIO锁定机制。

四、编程题

编写一个初始化定时器的程序。

答:由于还没有讲到定时器相关的知识,所以这里旨在让读者给出定时器对GPIO端口的设置要求,程序示例如下:

GPIO_InitTypeDef GPIO_InitStructure;

/* GPIOC Configuration: Pin6, 7, 8 and 9 in Output */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

10.6 习题

一、填空题

1.在STM32中,闪存存储器有 主存储块 和 信息块 组成。 2.STM32的Flash闪存的指令和数据访问是通过 AHB 总线完成的。预取模

块是用于通过 ICode 总线读取指令的。仲裁是作用在闪存接口,并且 DCode 总线上的数据访问优先。

3.STM32的Flash闪存编程一次可以写入 16 位。STM32的Flash闪存擦除操作可以按 页面 擦除或 完全 擦除, 完全擦除 不影响信息块。写操作(编程或擦除)结束时可以触发中断。仅当闪存控制器接口时钟开启时,此中断可以用来从 WFI 模式退出。

4.ST公司还提供了完善的Flash闪存接口库函数,其位于 stm32f10x_flash.c ,对应的头文件为 stm32f10x_flash.h 。

5.选项字节寄存器结构中,RDP为 读出选项字节 ,USER为 用户选项字节 ,Data0为 数据0 选项字节,Data1为 数据1 选项字节,WRP0为 写保护0 的选项字节,WRP1为 写保护1 的选项字节,WRP2为 写保护2 的选项字节,WRP3为 写保护3 的选项字节。

二、选择题

1.STM32的Flash闪存编程一次可以写入( A )位。

260

第14章 Swing桌面程序开发

A.16 B.8 C.32 D.4 2.STM32主存储块的页大小为( A ) 字节。 A.1K B.3K C.2K D.4K 3.用户选择字节的大小为( A )。 A.512字节 B.2K C.1K D.128K 4.下列哪些不是STM32闪存存储器的特点( C )。 A.大容量 B.高速 C.掉电不保存 D.具有选择字节加载器 三、简答题

1.简述STM32闪存存储器的特点。

答:STM32的Flash闪存具有多个优秀的性能,例如带预取缓冲器的读接口(每字为2x64 位),具有选择字节加载器,支持闪存编程/擦除操作以及访问/写保护等。

STM32的Flash闪存的指令和数据访问是通过AHB总线完成的。预取模块是用于通过ICode总线读取指令的。仲裁是作用在闪存接口,并且DCode总线上的数据访问优先。

STM32的Flash闪存编程一次可以写入16 位(半字)。STM32的Flash闪存擦除操作可以按页面擦除或完全擦除(全擦除),全擦除不影响信息块。写操作(编程或擦除)结束时可以触发中断。

2.简述STM32闪存存储器的结构。

答: STM32高性能的闪存模块提供了高达512K字节的容量,同时提供了10万次以上的擦写次数。STM32可以选择多种Flash闪存容量,包括512K、384K、256K、128K、64K等等。这里以128K闪存的芯片为例介绍其Flash闪存的结构。

在128K的STM32中,闪存存储器有主存储块和信息块组成:

? 主存储块为16Kx64 位,每个主存储块又划分为128 个1K 字节的页。

? 信息块为320x64 位,每个信息块又划分为一个2K 字节和一个0.5K 字节的页。

四、编程题

采用128K容量的Flash,划分前64K为程序存储器,后64K为自定义存储器,用于保存PC通过串口传送的数据,并提供操作成功的验证方法。

答:这里的程序比较小,占用Flash远不会超过64K,因此,后64K可以由用户自由读写。由于还没有讲到串口通信相关的内容,为了方便读者理解,这里代码中省略了串口传送数据部分。程序中,重点的部分是如何划分自定义存储器的位置以及Flash的读写操作。代码示例如下:

01 02 03 04

#include \#include

typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus; #define StartAddr ((u32)0x08010000) //自定义存储器的起始位置

261

21天学通Java

05 #define EndAddr ((u32)0x08020000) //自定义存储器的终止位置 06 #define PageSize ((u16)0x400) 07 u32 *p=(u32 *)0x08002000;

08 u32 EraseCounter = 0x0, Address = 0x0; 09 u32 Data;

10 vu32 NbrOfPage = 0;

11 volatile FLASH_Status FLASHStatus;

12 volatile TestStatus MemoryProgramStatus; 13 ErrorStatus HSEStartUpStatus; 14 void NVIC_Configuration(void); 15 void RCC_Configuration(void); 16 int main(void) 17 { 18 int i=0; 19 FLASHStatus = FLASH_COMPLETE; 20 MemoryProgramStatus = PASSED; 21 Data = 0xAAAA5555; 22 RCC_Configuration(); //RCC配置 23 NVIC_Configuration(); //NVIC配置 24 FLASH_Unlock(); //解锁Flash 25 NbrOfPage = (EndAddr - StartAddr) >> 8;//定义要擦除的页数 26 FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); //清除挂起的标志

27 for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)

28 { //擦除Flash 29 FLASHStatus = FLASH_ErasePage(StartAddr + (PageSize * EraseCounter)); 30 } 31 Address = StartAddr; 32 while((Address < EndAddr) && (FLASHStatus == FLASH_COMPLETE)) 33 { //写Flash 34 FLASHStatus = FLASH_ProgramWord(Address, Data); 35 Address = Address + 4; 36 } 37 //检查读写是否一致 38 Address = StartAddr; 39 while((Address < EndAddr) && (MemoryProgramStatus != FAILED)) 40 { 41 if((*(vu32*) Address) != Data) 42 { 43 MemoryProgramStatus = FAILED; 44 } 45 Address += 4; 46 } 47 printf (\Bellow is the data from memory*************************************\\n\\r\\n\

48 while( p<( u32 *)EndAddr) 49 { 50 printf(\51 p ++; 52 for (i=0;i<30;i++); 53 } 54 printf (\55 while(1) 56 { 57 } 58 }

59 void NVIC_Configuration(void) //配置向量表. 60 {

61 #ifdef VECT_TAB_RAM

262

第14章 Swing桌面程序开发

62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif }

void RCC_Configuration(void) //配置不同的系统时钟 { RCC_DeInit(); //RCC系统复位 RCC_HSEConfig(RCC_HSE_ON); //使能HSE HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待 if(HSEStartUpStatus == SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2 FLASH_SetLatency(FLASH_Latency_2); FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能预取 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLLCLK RCC_PLLCmd(ENABLE); /* Enable PLL */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL准备好 { } RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08) { } } }

11.6 习题

一、填空题

1.STM32芯片内部集成的 12 位ADC是一种逐次逼近型模拟数字转换器,具有 18 个通道,可测量 16 个外部和 2 个内部信号源。

2.在STM32中,只有在 规则通道 的转换结束时才产生DMA请求,并将转换的数据从 ADC_DR 寄存器传输到用户指定的目的地址。

3.在有两个ADC的STM32器件中,可以使用 双ADC 模式。在 双ADC 模式里,根据 ADC_CR1 寄存器中 DUALMOD[2:0] 位所选的模式,转换的启动可以是ADC1主和ADC2从的交替触发或同时触发。

4.ADC的校准模式通过设置 ADC_CR2 寄存器的 CAL 位来启动。 5.在STM32中, ADC_CR2 寄存器的 ALIGN 位选择转换后数据储存的对齐方式。

6.在STM32内部还提供了 温度传感器 ,可以用来测量器件周围的温度。温度传感器在内部和 ADC_IN16 输入通道相连接,此通道把传感器输出的电压转换成数字值。内部参考电压 VREFINT 和 ADC_IN17 相连接。

二、选择题

1.哪些是STM32的ADC系统的特点(多选)( ABCD )。

263

21天学通Java

A.12-位分辨率 B.自校准 C.可编程数据对齐 D.单次和连续转换模式

2.在ADC的扫描模式中,如果设置了DMA位,在每次EOC后,DMA控制器把规则组通道的转换数据传输到( A )中。

A.SRAM B.Flash C.ADC_JDRx寄存器 D.ADC_CR1 3.STM32规则组由多达( A )个转换组成。 A.16 B.18 C.4 D.20 4.在STM32中,( A )寄存器的ALIGN位选择转换后数据储存的对齐方式。 A.ADC_CR2 B.ADC_JDRx C.ADC_CR1 D.ADC_JSQR

三、简答题

1.简述STM32的ADC系统的功能特性。

答:STM32的ADC系统的主要功能特性包括如下几个方面:ADC开关控制、ADC时钟、ADC通道选择、ADC的转换模式、中断、模拟看门狗、ADC的扫描模式、ADC的注入通道管理、间断模式、ADC的校准模式、ADC的数据对齐、可编程的通道采样时间、外部触发转换、DMA请求、双ADC模式和温度传感器。

2.简述STM32的双ADC工作模式。

答:在有两个ADC的STM32器件中,可以使用双ADC模式。在双ADC模式里,根据ADC_CR1寄存器中DUALMOD[2:0]位所选的模式,转换的启动可以是ADC1主和ADC2从的交替触发或同时触发。双ADC工作模式主要包括如下几种:同时注入模式、同时规则模式、快速交替模式、慢速交替模式、交替触发模式和独立模式。

四、编程题

通过温度传感器来采集温度值,并通过串口输出结果。 答:

#include \#include

ErrorStatus HSEStartUpStatus;

void RCC_Configuration(void); void NVIC_Configuration(void); void GPIO_Configuration(void); void USART_Configuration(void); extern void I2C_LM75_Init(void); extern u32 TempCelsius_Value ;

extern u16 I2C_LM75_Temp_Read(void);

extern ErrorStatus I2C_LM75_Status(void); extern void Thermometer_Temperature(void) ;

int main(void)

264

第14章 Swing桌面程序开发

{ u16 i=0;

#ifdef DEBUG debug(); #endif

/* Configure the system clocks */ RCC_Configuration();

/* NVIC Configuration */ NVIC_Configuration();

/* Configure the GPIOs */ GPIO_Configuration();

/* Configure the USART1 */ USART_Configuration();

I2C_LM75_Init();

Thermometer_Temperature();

while(1 ) { if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET) { i = USART_ReceiveData(USART1); printf(\ %c\ /* print the input char */ } } }

#ifdef DEBUG

void assert_failed(u8* file, u32 line) {

/* User can add his own implementation to report the file name and line number */

printf(\ printf(\ file %s\\r\\n\ printf(\ line %d\\r\\n\

/* Infinite loop */ /* while (1) { } */ }

#endif

void RCC_Configuration(void) {

/* RCC system reset(for debug purpose) */ RCC_DeInit();

/* Enable HSE */

RCC_HSEConfig(RCC_HSE_ON);

265

21天学通Java

/* Wait till HSE is ready */

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS) {

/* HCLK = SYSCLK */

RCC_HCLKConfig(RCC_SYSCLK_Div1);

/* PCLK2 = HCLK */

RCC_PCLK2Config(RCC_HCLK_Div1);

/* PCLK1 = HCLK/2 */

RCC_PCLK1Config(RCC_HCLK_Div2);

/* Flash 2 wait state */

FLASH_SetLatency(FLASH_Latency_2); /* Enable Prefetch Buffer */

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

/* PLLCLK = 8MHz * 9 = 72 MHz */

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

/* Enable PLL */ RCC_PLLCmd(ENABLE);

/* Wait till PLL is ready */

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { }

/* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) { } }

/* Enable USART1 and GPIOA clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); }

void NVIC_Configuration(void) {

#ifdef VECT_TAB_RAM

/* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */

/* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif }

void GPIO_Configuration(void) {

GPIO_InitTypeDef GPIO_InitStructure;

/* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

266

第14章 Swing桌面程序开发

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART1 Rx (PA.10) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); }

void USART_Configuration(void) {

USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStructure.USART_Clock = USART_Clock_Disable; USART_InitStructure.USART_CPOL = USART_CPOL_Low; USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;

USART_InitStructure.USART_LastBit = USART_LastBit_Disable;

USART_Init(USART1, &USART_InitStructure);

/* Enable USART1 */

USART_Cmd(USART1, ENABLE); }

int fputc(int ch, FILE *f) {

/* Place your implementation of fputc here */ /* e.g. write a character to the USART */ USART_SendData(USART1, (u8) ch);

/* Loop until the end of transmission */

while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { }

return ch; }

=

12.7 习题

一、填空题

1.STM32的 嵌套向量中断控制器(NVIC) 管理着包括Cortex-M3核异常等中断,其和ARM处理器核的接口紧密相连,可以实现 低延迟 的中断处理,并有效地处理 晚到 中断。

2.STM32的外部中断/事件控制器(EXTI)由 19 个产生事件/中断要求的

267

本文来源:https://www.bwwdw.com/article/q3td.html

Top