南工大期末考试嵌入式复习题 - 副本
更新时间:2023-09-04 05:54:01 阅读量: 教育文库 文档下载
- 南工大嵌入式培养推荐度:
- 相关推荐
一.选择或者填空
1.嵌入式操作系统有:
UCOSII UCLINUX .Rt-thread Linux、
Windows CE、VxWorks、Symbian、Palm OS、QNX 安卓
10. (Embedded Operating System)的专用软、硬件系统 2. STM32 是基于ARM公司核的位
3. GPIO口输入的上拉电阻和下拉电阻对输入的不同在于:有内部上拉时,输入悬空时为,无内部上拉时,输入悬空时为0.
4. 输入输出数据寄存器的作用是定时将数据采样到 输出到 5. STM32的工作电压(VDD)为。 6. STM32的复位电路为
7. STM32的内部晶振(精度较差,误差约为2%),外部晶振(普通晶振误差小于1000ppm,高精度晶振可达10ppm以下)
8.ContexM3的堆栈是
9. STM的库文件中,stm32f10x_it.c的用途是 10. 默认情况下,外部中断0和外部中断1哪个优先级高? 0 中断的默认排序是 11. 对异常向量表中默认排序可通过设置进行修改。
12.具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
13.抢占式优先级相同时,如同时产生中断,先得到处理。 如两种优先级都相同时,默认优先级高的中断先得到处理。 二.简答
1.请解释广义和狭义的嵌入式系统。
2.请画出简图说明ContexM3内核的组成,并说明哪些是由开发商设计,哪些是ARM设计。 答:
3.根据下图说明STM32F10X系列芯片的GPIO引脚的功能。并说明对应功能时,哪部分开关起作用(在图上标注)。
答:
模拟输入:TTL被强置为0,弱上拉下拉断开,CMOS断开。 浮空输入:CMOS断开,TTL被激活,弱上拉下拉断开。
上拉输入:CMOS断开,TTL被激活,弱上拉接通,下拉断开。 下拉输入:CMOS断开,TTL被激活,弱上拉断开,下拉接通。
开漏输出:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(P-MOS从不被
激活)、TTL被激活、弱上拉下拉被禁止。
推挽输出:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS、TTL被激活、弱上拉下拉被禁止。
复用开漏输出:开漏输出时,输出缓冲器被打开。 复用推挽输出:推挽输出时,输出缓冲器被打开。
4. GPIO口输入的上拉电阻和下拉电阻对输入有什么不同?
答: 有内部上拉时,输入悬空时为1,无内部上拉时,输入悬空时为0.
5.将GPIO的PD2配置成通用开漏输出,最大速度2MHz应如何配置以下寄存器。
答: GPIOD 0110左移8位
配置:GPIOD->CRL =(0x06 << 8);
/*即:6左移8位(D口) [2]P113 01:通用开漏输出模式 10:输出模式,最大速度2MHz*/
6.STM32F107的内部FLASH和RAM和片上外设的地址范围是多少?
答:SRAM(64K) 0x2000 0000 ~ 0x2000 FFFF FLASH ROM(256K) 0x0800 0000 ~ 0x0803 FFFF 片上外设(散布) 0x4000 0000 ~ 0x5003 FFFF 7. STM32系列的抢占式优先级的设置方法
8. 当抢占式优先级设为8个时,每个级别的响应式优先级可设多少个? 2个 9. STM32F10X的每个IO口都可以设为外部中断,最多可设几个.16+3=19 10.堆栈指令:PUSH {R0}后,请画出堆栈会如何变化? 指令执行前:
答 :
11. 堆栈指令:POP {R0}后,请画出堆栈会如何变化?
答:
12 根据程序说明时钟设置流程,并标明寄存器设置流向 /* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
#ifdef STM32F10X_CL
/* Configure PLLs ------------------------------------------------------*/ /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
/* Enable PLL2 */
RCC->CR |= RCC_CR_PLL2ON; /* Wait till PLL2 is ready */
while((RCC->CR & RCC_CR_PLL2RDY) == 0) { }
/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9);
答:
后,当
13.如果系统时钟SystemCoreClock为72MHz,则执行以下语句SysTick_Config(SystemCoreClock / 100)
系统打开滴答时钟中断后,系统经过多长时间进入系统滴答时钟中断?答:10ms。
14.写出系统时基定时器的原理。
答:STM32F10X内核中有一个24位的系统时基定时器。设定初值并使能后,该定时器每经过1个系统时钟周期减1,当减到0时,自动重装初值,并触发中断。
15.RTThread 内核的特点是什么?
答:小型,实时,可剪裁,代码格式规范。
结合了VxWorks和ucos两个操作系统的优点,综合性能优于ucos,是Cortex M3内核的最理想的嵌入式操作
系统。
源代码完全公开,免费商业使用。 内核特点:精巧、高效、稳定和实时。(29.RT-Thread编程指南-对象设计及线程设计.pdf)
17. 什么是动态线程?什么是静态线程?两者有什么区别?
答:
RT-Thread中支持静态和动态两种定义方式。用线程来举例的话,rt_thread_init对应静态定义方式, rt _thread_create 对应动态定义方式。 使用静态定义方式时,必须先定义静态的线程控制块,并且定义好堆栈空间,然后调用rt_thread_init来完成线程的初始化工作。采用这种方式,线程控制块和堆栈占用的内存会放在RW段,这段内存空间在编译时就已经确定,它不是可以动态分配的,所以不能被释放,而只能使用 rt_thread_detach 函数将该线程控制块从对象管理器中脱离。 使用动态定义方式 rt_thread_create 时, RT-Thread 会动态申请线程控制块和堆栈空间。当不需要使用该线程时,调用rt_thread_delete函数就会将这段申请的内存空间重新释放到内存堆中(如果线程执行完毕,退出时,系统也会自动回收线程控制块和堆栈空间)这两种方式各有利弊,静态定义方式会占用 RW/ZI 空间,但是不需要动态分配内存,运行时效率较高,实时性较好。 动态方式不会占用额外的RW/ZI 空间,占用空间小,但是运行时需要动态分配内存,效率没有静态方式高。 总的来说,这两种方式就是空间和时间效率的平衡,可以根据实际环境需求选择采用具体的分配方式。
18. 什么是定时器?指出硬件定时器和软件定时器的区别?并说明软件定时器的两种定时机制。
答:定时器,是指在指定的时刻开始,经过一指定的时间后出发一个事件。定时器有硬件定时器和软件定时器之分: 硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。
软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务。软件定时器的精度取决于它使用的硬件定时器精度,例如硬件定时器精度是1秒,那么它能够提供1秒,5秒,8秒等以1秒整数倍的定时器,而不能够提供1.5秒的定时器。在RT-Thread实时操作系统中,软件定时器模块以tick为时间单位,tick的时间长度为两次硬件定时器中断的时间间隔,这个时间可以根据不同的系统MIPS和实时性需求设置不同的值,tick值设置越小,实时精度越高,但是系统开销也越大。
RT-Threa的软定时器提供两类定时器机制:第一类是单次触发定时器,这类定时器只会触发一次定时器事件,然后定时器自动停止。第二类则是周期触发定时器,这类定时器会周期性的触发定时器事件。 三.读程序题
1.给出下面LED灯闪烁程序代码实现功能。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能APB2总线外设时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_7;//定义引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//设置最高输出频率2MHZ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式 GPIO_Init(GPIOD, &GPIO_InitStructure); //送入初始默认值 答:
2.给出下面启动代码实现功能。
SECTION CSTACK:DATA:NOROOT(3) SECTION .intvec:CODE:NOROOT(2) EXTERN __iar_program_start 当前符号在其它源文件中定义,是一个系统定义的标号,在自带的C库启动代码当中,
EXTERN SystemInit PUBLIC __vector_table DATA //定义数据段
__vector_table 标号 异常向量表入口地址
DCD sfe(CSTACK) 3. 说明以下按键程序实现功能,及获取键值的流程。
****************************************************************************** Function Name : Get_Key,内部函数
Description : 获取输入按键是否按下,按下返回1 Input : -key:某个按键 Output : None
Return : 1:输入的按键按下 0:输入的按键没有按下
* *****************************************************************************
uint8_t Get_Key(Key_Def key)
if ((KEY_PORT[key]->IDR&KEY_PIN[key])==0)return 1; else return 0;
****************************************************************************** Function Name : KEY_Scan Description : 获取按键值 Input : None Output : None
Return : 返回按下的键值
******************************************************************************/ Key_Def KEY_Scan(void)
static uint8_t key_up=1;
if(key_up&&(Get_Key(KEY2)||Get_Key(KEY3)||Get_Key(KEY4))) {
Delay(0xFFFFF); key_up=0;
if(Get_Key(KEY2))return KEY2; else if(Get_Key(KEY3))return KEY3; else if(Get_Key(KEY4))return KEY4; }
else if(!Get_Key(KEY2)&&!Get_Key(KEY3)&&!Get_Key(KEY4))key_up=1; return KEYNULL;
答:判断是否按下键KEY2 KEY3 KEY4若有则返回按下的键 若没有测返回空值, 4.写出以下GPIO、中断、NVIC配置的过程。并指出哪个中断优先级最高。 void Key_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;定义初始化类型
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIOC引脚时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; 定义管脚13 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;设置管脚最高输出速率为2MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;管脚设置为上拉输入模式
GPIO_Init(GPIOC, &GPIO_InitStructure); 把GPIO_InitStruct 中的每一个参数按缺省值填入 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); GPIOE引脚时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; 定义管脚1
GPIO_Init(GPIOE, &GPIO_InitStructure); 把GPIO_InitStruct 中的每一个参数按缺省值填入 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); GPIOE引脚时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 定义管脚0
GPIO_Init(GPIOE, &GPIO_InitStructure); 把GPIO_InitStruct 中的每一个参数按缺省值填入 }
void Set_Keyint(void) {
EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); 使能APB2外设时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);选择GPIOC管脚13作为外部中断线路 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1); 选择GPIOE管脚1作为外部中断线路 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0); 选择GPIOE管脚0作为外部中断线路 EXTI_InitStructure.EXTI_Line = EXTI_Line13;选择外部中断线13使能
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;设置中断线路为中断请求模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;设置输入线路下降沿为中断请求 EXTI_InitStructure.EXTI_LineCmd = ENABLE;选中线路使能
EXTI_Init(&EXTI_InitStructure); 把EXTI_InitStruct 中的每一个参数按缺省值填入
EXTI_InitStructure.EXTI_Line = EXTI_Line1; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 设置优先级分组先占优先级2位从优先级2位
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;外部中断线15-10中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;先占优先级1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;从优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;定义IRQ通道使能
NVIC_Init(&NVIC_InitStructure);把NVIC_InitStruct中的每一个参数按缺省值填入
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;外部中断线1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; 先占优先级2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 从优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; 外部中断线0中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; 先占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 从优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
5.写出在RTThread中运行以下程序后,串口打印的结果。并写出程序运行的流程。
建立2个线程
:
2个线程的入口程序为: 下面的代码是两个线程的入口程序,在入口程序中 thread2 将会去删除 thread1,也就是调用了线程删除的 API。/*线程1 运行一直在打印计数,由于线程 1 和2 优先级相同均为THREAD_PRIORITY , 所以将会采用时间片轮转的方式轮换执行
*/
在线程 1 时间片用尽后得到执行,在打印完成后线程 2 delay,于是回到线程 1 执行,在 delay 结束后回到线程 2 执行,线程 2 将删除线程 1,并且在执行结束后也将自行删除
运行后串口输出可看到
请写出后续的打印结果:
thread1 dynamicly created ok thread1 count: 0
thread2 dynamicly created ok thread1 count: 1 thread1 count: 2 thread1 count: 3 thread1 count: 4 thread1 deleted ok 程序运行的流程:
从打印信息可以看到首先看到 thread1 和 thread2 先后建立成功,然后 thread2 rt_thread_delay(RT_TICK_PER_SECOND * 4); 系统调度到 thread1 执行可以看到继续执行计数,因为 thread1 的
延时为 1 个 tick,所以可以看到它打印了四次计数,当它第四次延时时,thread2 的延时也到了,系统调度到 thread2 继续运行,它调用了 rt_thread_delete(tid1); 将 thread1 删除,删除成功后打印信息 thread1 deleted ok 此时可以看到 thread1 也不再出现计数信息,可以确定 thread1 被成功删除了。
6. 写出下段程序运行后,经过编译调试运行后在串口输出什么结果?并写出程序执行的流程。
答:运行结果为
-RT- ThreadOperatingSystem /|\ 1.1.0 build Aug14 2012
2006-2012 Copyright by rt-threadteam Periodic timer is timeout Periodic timer is timeout Periodic timer is timeout Periodic timer is timeout Periodic timer is timeout Periodic timer is timeout Periodic timer is timeout Periodic timer is timeout
运行流程:(描述自己组织的仅供参考)
定义了定时时间为10个tick的定时器timer1,随着硬件定时器的触发超过10个tick后,这时会触发Timer1定时器相关连的超时函数,执行语句rt_kprintf("periodic timer is timeout\n");打印出一句Periodic timer is timeout然后count++;定时器自身停止,继续如此按10个tick的周期循环,每循环一次打印出一句Periodic timer is timeout 直到count>=8 执行rt_timer_stop(timer1);停止了定时器,于是就看到串口输出重复8句Periodic timer is timeout的结果。
正在阅读:
南工大期末考试嵌入式复习题 - 副本09-04
公司资本结构优化分析06-05
交运歌诀12-13
2016部编新教材七年级上册语文课下注释06-08
教育技术与语文课堂的整合07-09
《税收违法违纪行为处分规定》讲义03-08
教育心理学 陈琦主编《教育心理学》05-11
四年级提高班教材10-20
我的跆拳道经历作文400字06-24
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 复习题
- 工大
- 副本
- 嵌入式
- 期末
- 考试
- 常见车型灯光对照表
- 自考00162《会计制度设计》授课笔记
- 4 基坑验槽及地基加固处理(建筑施工讲义第4讲)
- 2010年温州六中科学中考模拟中考
- 幼儿园小班科学小故事《小猪照镜子》优质课公开课教案比赛讲课获奖教案
- 体育与健康主题班会教案
- 以PSD器件为传感器的光电位置遥测系统
- 实验五存储管理实验报告
- 07-08德育计划
- 文化下乡活动开幕式致辞
- 本科毕业设计--xy数控工作台及其控制系统设计
- 会计科目和会计核算形式的设计0
- 国家2007年以来发布的建设工程标准招标文件和示范文本综述24p
- 苏杭时代保洁服务合同书1
- 2015年吉林省注册会计师《公司战略》考点:纵向分工结构组织内部最新考试试题库(完整版)
- 微机接口技术试题与答案
- 2017年南京航空航天大学航空宇航学院916材料力学考研导师圈点必考题汇编
- A成都理工大学2010-2011学年线性代数期末考试试题(含答案)
- 现代企业培训发展趋势与培训管理实务
- 教师校本培训教案