ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:124.02KB ,
资源ID:30702335      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30702335.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Arm复习资料new.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Arm复习资料new.docx

1、Arm复习资料new各位同学,我已经再次删减了 复习资料,补充代码画横线的部分是要求的内容。最后一道题目 大家不允许空白,你起码也要按照前面的题目,把头文件引入,宏定义任务堆栈,写出mai函数,初始化操作系统,创建任务,启动多任务环境。这些步骤所有的工程都是相差不大的,你至少要做到这一步。我已经尽我最大努力了,考试的时候,应该怎么做,你懂的第一部分 嵌入式c语言(25分)预处理器(Preprocessor)1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)ULUL(

2、表示无符号长整型),4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?while(1)for(;) 数据声明(Data declarations)5. 用变量a给出下面的定义a) 一个整型数(An integer)b)一个指向整型数的指针( A pointer to an integer)c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)rd)一个有10个整型数的数组( An array of 10 integers)e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 1

3、0 pointers to integers)f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer

4、 argument and return an integer )答案是:a) int a; / An integerb) int *a; / A pointer to an integerc) int *a; / A pointer to a pointer to an integerd) int a10; / An array of 10 integerse) int *a10; / An array of 10 pointers to integersf) int (*a)10; / A pointer to an array of 10 integersg) int (*a)(int)

5、; / A pointer to a function a that takes an integer argument and returns an integerh) int (*a10)(int); / An array of 10 pointers to functions that take an integer argument and return an integer Static7关键字const有什么含意? const意味着只读就可以了 不要理解为是个常数 下面的声明都是什么意思?const int a;int const a;const int *a;int * cons

6、t a;int const * a const;/*/ 前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。1) 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。2) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。3) 合

7、理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:#define BIT3 (0x1 6) ? puts( 6) : puts(6。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-2

8、0变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。13. 评价下面的代码片断:unsigned int zero = 0;unsigned int compzero = 0xFFFF;/*1s complement of zero */对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:unsigned int compzero = 0; 这一问题考察是否懂得处理器字长的重要性。 动态内存分配(Dynamic memory allocation)Typedef15 Typedef 在C语言中频繁用

9、以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:#define dPS struct s *typedef struct s * tPS; 以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?答案是:typedef更好。思考下面的例子:dPS p1,p2;tPS p3,p4;第一个扩展为struct s * p1, p2;上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。晦涩的语法第二部分 Arm体系基本知识(15分)

10、5.填空题1)ARM微处理器共有_个_位寄存器,其中_个为通用寄存器,_个为状态寄存器。2)ARM体系结构可用两种方法存储字数据,具体为_、_。答案-填空题1)37、32、31、62)大端格式和小端格式1ARM嵌入式系统主要由_、_和_构成。2常用的嵌入式外围设备有_、_和_三类。3总线通常包括_、_和_。4目前流行的嵌入式操作系统主要有:_、_、_和_。答案1嵌入式处理器、相关支撑硬件、嵌入式软件系统2存储设备、通信设备、显示设备3数据总线、地址总线、控制总线4Vxwork、WinCE、Linux、pSOS 第三部分补全代码 (35分)第一个工程:外部中断控制led的亮灭/*File: Ma

11、in.c*功能: 使能外部中断0和外部中断1,当外部中断0有效时,控制LED1取反;* 当外部中断1有效时,控制LED2取反*/#include config.h#define LED1CON 0x00000400 /*P0.10引脚控制LED1,低电平点亮*/#define LED2CON 0x00000800 /*P0.11引脚控制LED2,低电平点亮*/*名称:IRQ_Eint0() *功能:外部中断EINT0服务函数,取反LED1*/void _irq IRQ_Eint0(void) uint32 i; i=VICIRQStatus; /读出VICIRQStatus的值 i=IO0SE

12、T; /读取当前LED1控制值 if(i&LED1CON)=0) /控制LED1输出 IO0SET=LED1CON; else IO0CLR=LED1CON; while(EXTINT&0x01)!=0) /等待外部中断信号恢复为高电平 EXTINT=0x01; /清除EINT0中断标志 VICVectAddr=0x00;/*名称: IRQ_Eint1()*功能: 外部中断EINT1服务函数,取反LED2*/void _irq IRQ_Eint1(void) uint32 i; i=VICIRQStatus; /读出VICIRQStatus的值 i=IO0SET; /读出当前LED2控制值 i

13、f(i&LED2CON)=0) /控制LED2控制值 IO0SET=LED2CON; else IO0CLR=LED2CON; while(EXTINT&0x02)!=0) /等待外部中断信号恢复为高电平 EXTINT=0x02; /清除EINT1中断标志 VICVectAddr=0x00;/*名称:main()*功能:初始化外部中断0,外部中断1及I/O连接等*/int main(void) PINSEL0=0x20000000; /设置I/O口工作模式,P0.14设置为EINT1 PINSEL1=0x00000001; /P0.16设置为EINT0 IO0DIR=LED1CON|LED2C

14、ON; /设置LED1,LED2控制口为输出,其它I/O为输入 IO0CLR=LED1CON|LED2CON; IO0SET=LED1CON|LED2CON; VICIntSelect=0x00000000; /设置所有通道为IRQ中断 VICVectCntl0=0x2E; /EINT0通道分配到IRQ Slot0,即优先级最高 VICVectAddr0=(int)IRQ_Eint0; /设置EINT0向量地址 VICVectCntl1=0x2F; VICVectAddr1=(int)IRQ_Eint1; VICIntEnable=0x0001C000; /使能EINT0,EINT1中断 EX

15、TINT=0x07; /清除外部中断 while(1); /等待中断 / return(0);第二个工程:从串口读到内容,紧接着从串口发送出去已知uart0.h文件的内容如下#ifndef IN_UART0extern uint8 UART0_Init (void);/初始化串口0.设置为8位数据位,1位停止位,无奇偶校验,波特率为9600extern void UART0_SendByte(uint8 data); /向串口发送字节数据,并等待发送完毕extern void UART0_SendStr(uint8 const *str); /向串口发送一字符串extern char UART

16、0_RecvByte(void); /从串口接收字节数据,并等待发送完毕#endif下面main.c文件的内容,功能是:从串口接收内容,紧接着发送出去#include config.h#include stdlib.h#include uart0.h#define TaskStkLengh 64 /Define the Task0 stack length 定义用户任务0的堆栈长度OS_STK TaskStk TaskStkLengh; /Define the Task0 stack 定义用户任务0的堆栈OS_STK TaskStk1 TaskStkLengh; OS_EVENT *Mbox;

17、void Uartpost(void *pdata); /Task0 任务0void Uartrec(void *pdata);uint8 aa=This is an example; int main (void) UART0_Init (); OSInit (); OSTaskCreate (Uartpost,(void *)0, &TaskStkTaskStkLengh - 1, 2); OSStart (); return 0; /* Task0 任务0*/ void Uartpost (void *pdata) uint8 err; uint8 *msg; pdata = pdata

18、; TargetInit (); OSTaskCreate (Uartrec,(void *)0, &TaskStk1TaskStkLengh - 1, 5); Mbox=OSMboxCreate(void *)0); UART0_SendStr(aa); while (1) msg=(uint8 *)OSMboxPend(Mbox, 0, &err); if (err = OS_NO_ERR) UART0_SendByte(*msg); /* Task1任务1*/void Uartrec (void *pdata) char msg2; pdata=pdata; while(1) msg2=

19、UART0_RecvByte(); OSMboxPost(Mbox, (void *)&msg2); 第三个工程:读按键 ,在lcd1602显示相应内容Main.c 内容如下:#include config.h#include stdlib.h#define TaskStkLengh 64 /Define the Task0 stack length 定义用户任务0的堆栈长度OS_STK TaskStk1 TaskStkLengh; /Define the Task0 stack 定义用户任务0的堆栈OS_STK TaskStk2 TaskStkLengh;void Keyscan(void

20、*pdata); /Task0 任务0void Lcdshow(void *pdata);extern void DisText(uint8 addr,uint8 *p); /显示文本函数,已经在lcd.c文件里描述extern void lcd_init(void);/lcd初始化函数,已经在lcd.c文件里描述OS_EVENT *CommMbox;uint8 front=Front Door Open ;uint8 rear= Rear Door Open ;uint8 doubl=Double Door Open ;uint8 close=Double Door Close; int m

21、ain (void) OSInit (); OSTaskCreate (Keyscan,(void *)0, &TaskStk1TaskStkLengh - 1, 2); OSTaskCreate (Lcdshow,(void *)0, &TaskStk2TaskStkLengh - 1, 3); CommMbox = OSMboxCreate(void *)0); OSStart (); return 0; /* Task0 任务0*/ void Keyscan(void *pdata) uint8 err; pdata = pdata; TargetInit (); PINSEL1 &=

22、0xfffc3fff; IO0DIR &= 0xfe7e07ff; while (1) if( (IO0PIN&(124)|(123) = 0) /两个按键都按下 err = OSMboxPost(CommMbox, (void *)&close0); else if( (IO0PIN&(124) = 0) /24管脚按下 err = OSMboxPost(CommMbox, (void *)&front0); else if( (IO0PIN&(123) = 0) /23管脚按下 err = OSMboxPost(CommMbox, (void *)&rear0); else /两个按键都没

23、按下 err = OSMboxPost(CommMbox, (void *)&doubl0); OSTimeDly(10); /* Task1任务1*/ void Lcdshow(void *pdata) uint8 err; void *msg; pdata = pdata; PINSEL0 &= 0xffc00000; lcd_init(); for (;) msg = OSMboxPend(CommMbox, 10, &err); if (err = OS_NO_ERR) DisText(0x80,msg); /* 消息正确的接受 */ 最后一题25分 为设计题,参考给的代码完成一个工程。该工程基于uc/osii与周立功的gui 使用12864作为显示器。我会给大家几段完成特定功能的代码做参考,然后大家完成要求的功能。电路图会给出。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1