第1章
1、什么是嵌入式系统?嵌入式系统的组成?
从技术的角度定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
从系统的角度定义:嵌入式系统是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。术语嵌入式反映了这些系统通常是更大系统中的一个完整的部分,称为嵌入的系统。嵌入的系统中可以共存多个嵌入式系统。
2、典型的嵌入式处理器有哪些?
3、典型的RTOS操作系统有哪些?
4、列举身边的嵌入式应用产品?
第2章Cortex-M体系结构
一题:填空题
1、ARM Cortex系统的处理器分为:____A_____、____R_____、_____M_____。
2、ARM Cortex-M3为32位微控制器,请问32位指的是CPU字长。
3、ARM Cortex-M3体系结构采用哈佛总线结构,拥有独立的指令总线和数据总线,可以让
取指与数据访问并行进行。
4、CM3寄存器分为通用寄存器,包括R0~R15。和特殊功能寄存器,包括程序状态寄存器、
异常屏蔽寄存器、控制寄存器。
5、寄存器R13是堆栈指针寄存器。
6、寄存器R14是程序连接寄存器。
7、寄存器R15是程序PC。
8、CM3的堆栈指针分为__MSP__、__PSP_。存储器堆栈堆栈分为:向上生长(即向高地
址方向生长)的递增堆栈;向下生长(即向低地址方向生长),称为递减堆栈。堆栈指针指向最后压入堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个数据项放入的空位置,称为空堆栈。试判断CM3属于递减堆栈堆栈和满堆栈堆栈。
9、在CM3中记录程序状态的寄存器是___xPSR____。都分别有些什么状态_应用状态、中
断状态、可执状态。
10、BASEPRI寄存器的作用是___屏蔽优先级低于某一个数值的异常____。
11、寄存器CONTROL的作用是控制处理器模式及堆栈切换。
MOV R0,#0x01
MSR CONTROL,R0
在8级优先中,请问上述程序的功能是处理器工作在用户模式主堆栈下。
12、CM3技持两个模式和两个特权级,它们分别是线程模式和处理器模式;特权级和
用户级。
13、处理器运行应用程序时,属于线程模式,即可以使用特权级,也可以使用用户级。
异常服务程序必在处理器模式下执行。复位后,处理器默认进入处理器模式,主堆栈。
14、在用户级下设置的PSP=0x20000100,R0=0x01,R1=0x02。当执行
PUSH {R0-R1}
后,PSP=0x200000F8。
15、CM3支持的4GB存储空间被划分成:CODE、片上RAM、片上外设、片外RAM、
片外外设、内核私有6个区域。
16、CM3中有一个位绑定区分别位于片上RAM和片上外设区,其大小为1M字节,由
32M字节空间的位绑定别名区来访问。
17、 要将0x20000000单元的的第0位执1,请用位绑定的方式操作:
ldr r0,=0x22000000
mov r1,#1 str r1,[r0] 18、 CM3支持16种系统异常,和240种外设中断。19、 CM3中的优先级理论是支持256级优先级,但芯片厂商是般只采用三位来设置,
比如像luminary 只支持___8____级优先级。
20、 在CM3中发生异常后,自动保存的寄存器是(按地址顺序填写):XPSR PC LR R12
R3 R2 R1 R0。
21、 异常向量表中,位于表头的是_____MSP______。
22、 SysTick 是一个___24_____位的系统定时器。通常的功能是_作为操作系统时钟__。
23、 异常返回有返回处理器模式、返回线程模式并使用主堆栈、返回线程模式,并使用
进程堆栈三种功能。
二题 简答题
24、 请用汇编程序触发一次PendSV 系统异常。
答:LDR R4,=0xE000ED04 ;中断控制及状态寄存器(地址:0xE000_ED04)第28
位置1表示挂起PendSV
LDR R5,=0x10000000
STR R5,[R4]
25、 请用汇编或C 代码启动SysTick 定时器,定时20ms 。
答:20ms 也即50Hz ,通常用于uC/OS-II 操作系统中的时钟。以下程序是说明了在
任何时系统时钟下,都能产生20ms 的定时,有关系式如下:
在系统时钟下周期 定时器要计cnts 次才计到20ms
1()
T SysCtlClockGet = *202020*()T cnts ms
ms cnts ms SysCtlClockGet T
=== #include
#define OS_TICKS_PER_SEC 50
#define NVIC_ST_RELOAD 0xE000E014 //重装值寄存器
#define NVIC_ST_CTRL 0xE000E010 //控制与状态寄存器
unsigned int cnts;
void SystickInit()
{
SysCtlLDOSet(SYSCTL_LDO_2_75V);
SysCtlClockSet(SYSCTL_XTAL_8MHZ|SYSCTL_SYSDIV_10| SYSCTL_USE_PLL |
SYSCTL_OSC_MAIN ); // The crystal is 20MHz
cnts=SysCtlClockGet()/OS_TICKS_PER_SEC;
HWREG(NVIC_ST_RELOAD)=cnts-1;
HWREG(NVIC_ST_CTRL)=(1<<1)|1; // bit2:0-> 外部时钟,1-> 内部时钟
// bit1: 0->计满产生中断, 1->不产生中断