嵌入式系统设计实验四
嵌入式实验报告总结
嵌入式实验报告总结嵌入式实验报告总结近年来,嵌入式系统在各个领域中得到了广泛的应用。
嵌入式系统是指将计算机系统嵌入到其他设备或系统中,以实现特定功能的一种计算机系统。
在本次嵌入式实验中,我深入学习了嵌入式系统的原理和应用,并通过实际操作,加深了对嵌入式系统的理解。
实验一:嵌入式系统的基本概念和发展历程在本实验中,我们首先了解了嵌入式系统的基本概念和发展历程。
嵌入式系统的特点是紧凑、高效、实时性强,并且适用于各种各样的应用场景。
通过学习嵌入式系统的发展历程,我们了解到嵌入式系统在不同领域的应用,如智能家居、医疗设备、汽车电子等。
这些应用领域的嵌入式系统都有着各自的特点和需求,因此在设计嵌入式系统时需要根据具体应用场景进行优化。
实验二:嵌入式系统的硬件平台与软件开发环境在本实验中,我们学习了嵌入式系统的硬件平台和软件开发环境。
硬件平台是嵌入式系统的基础,包括处理器、内存、外设等。
而软件开发环境则提供了开发嵌入式系统所需的工具和库函数。
我们通过实际操作,搭建了嵌入式系统的硬件平台,并使用软件开发环境进行程序的编写和调试。
通过这个实验,我深刻理解了硬件平台和软件开发环境对嵌入式系统的影响,以及它们之间的协同工作。
实验三:嵌入式系统的实时操作系统在本实验中,我们学习了嵌入式系统的实时操作系统。
实时操作系统是嵌入式系统中非常重要的一部分,它能够保证系统对外界事件的响应速度和可靠性。
我们通过实际操作,学习了实时任务的创建和调度,以及实时操作系统的中断处理机制。
实时操作系统的学习让我更加深入地了解了嵌入式系统的实时性要求和相关的调度算法。
实验四:嵌入式系统的通信与网络在本实验中,我们学习了嵌入式系统的通信与网络。
嵌入式系统通常需要与其他设备或系统进行通信,以实现数据的传输和共享。
我们学习了嵌入式系统的通信协议和网络协议,如UART、SPI、I2C、TCP/IP等。
通过实际操作,我掌握了这些通信和网络协议的使用方法,以及在嵌入式系统中如何进行数据的传输和处理。
嵌入式系统看门狗实验报告
竭诚为您提供优质文档/双击可除嵌入式系统看门狗实验报告篇一:《嵌入式系统原理与应用》实验报告04-看门狗实验《嵌入式系统原理与接口技术》实验报告实验序号:4实验项目名称:看门狗实验1234篇二:嵌入式实验报告目录实验一跑马灯实验................................................. (1)实验二按键输入实验................................................. .. (3)实验三串口实验................................................. . (5)实验四外部中断实验................................................. .. (8)实验五独立看门狗实验................................................. (11)实验七定时器中断实验................................................. (13)实验十三ADc实验................................................. .. (15)实验十五DmA实验................................................. .. (17)实验十六I2c实验................................................. (21)实验十七spI实验................................................. .. (24)实验二十一红外遥控实验................................................. .. (27)实验二十二Ds18b20实验................................................. (30)实验一跑马灯实验一.实验简介我的第一个实验,跑马灯实验。
嵌入式μcosii内核实验四哲学家就餐问题的实现
操作系统配置
#define OS_LOWEST_PRIO
7
/*任务优先级不能够不小于7*/
#define OS_SEM_EN
1
/*是否允许使用信号量功能*/
#define OS_MAX_EVENTS
5
/*最多能够有5个事件*/
#define OS_TICKS_PER_SEC 200 /*设置每秒之内旳时钟节拍数目*/
本试验中所用到旳µC/OS-II有关函数
□ OSTaskCreateExt () : 创建一种任务 □ OSSemCreate() :建立并初始化一种信号量 □ OSSemPend() :申请信号量 □ OSSemPost() :释放信号量 □ OSTimeDly():将一种任务延时若干个时钟节拍
操作系统配置
#define OS_TASK_CREATE_EN
1
/*允许使用OSTaskCreate()*/
#define OS_TASK_STAT_EN
0
/* 禁止统计任务*/
#define OS_MAX_TASKS
6
/*最多能够创建6个任务*/
ห้องสมุดไป่ตู้
#define OS_TASK_CREATE_EXT_EN 1 /*是否允许使用OSTaskCreateExt()*/
源程序阐明
TaskStart负责:
□安装时钟中断服务例程
–ucos_x86_idt_set_handler(0x20,(void *)OSTickISR,0x8e00);
□初始化操作系统时钟
–ucos_timer_init();
□创建信号量
–fork[i] = OSSemCreate(1);
嵌入式μCOS-II内核实验四(哲学家就餐问题的实现)
目录
• 引言 • 哲学家就餐问题概述 • μcos-ii内核任务管理 • 哲学家就餐问题的μcos-ii实现 • 实验结果与分析 • 总结与展望
01
引言
嵌入式系统与μcos-ii内核简介
嵌入式系统
是一种专用的计算机系统,主要用于控制、监视或帮助操作 机器设备。它通常具有实时性、可靠性和低功耗等特点,广 泛应用于工业控制、智能家居、医疗设备等领域。
任务优先级与调度
任务优先级
在μcos-ii内核中,每个任务都有自己 的优先级。优先级高的任务会优先获 得CPU的使用权。
任务调度
μcos-ii内核使用基于优先级的抢占式任务 调度算法。当一个高优先级的任务就绪时, 内核会立即抢占当前正在运行的任务,并切 换到高优先级的任务上运行。
任务同步与通信
任务同步
解决方案的分类与比较
解决方案分类
解决哲学家就餐问题的方案可以分为两类:静态方案和动态方案。静态方案在 系统启动时分配固定的资源,而动态方案则在运行时动态地分配资源。
解决方案比较
静态方案实现简单,但可能导致死锁或饥饿问题。动态方案可以更好地解决这 些问题,但实现起来较为复杂,需要更多的系统资源和时间。在实际应用中, 需要根据具体需求和系统限制选择合适的解决方案。
05
实验结果与分析
实验环境与配置
01
硬件平台
ARM Cortex-M4微控制器 (具体型号为
STM32F407ZGT6)
02
开发环境
Keil uVision5
03
04
实验任务
实现基于μcos-ii内核的多任务 切换
配置参数
任务优先级、任务堆栈大小、 任务状态等
嵌入式系统 实验报告
使能 IRQ 中断。
4 装载并使能外中断;
5 选用 DebugInExram 生成目标,然后编译连接工程。
6 选择【Project】->【Debug】,启动 AXD 进行 JTAG 仿真调试。
7 全速运行程序,LED 闪烁;
8 每一次按键 Key,蜂鸣器就会转换静音或鸣响状态。
四.测试数据及运行结果
1
五.总结
1.实验过程中遇到的问题及解决办法;
由于本次实验较简单,且我们之前学习的微机原理课程也进行了流水灯的设
计实验,所以对于本次实验,我完成地很顺利,在实验中没有遇到问题。
2.对设计及调试过程的心得体会。
本次实验是本学期该课程我们进行的第一次实验,总的来说,实验不是很难,
设计过程也相对简单,其主要目的是让我们熟悉一下实验环境,并且能在实验环
6
五.总结 1.实验过程中遇到的问题及解决办法;
实验第一次运行时,蜂鸣器一直处于鸣响状态,及时按了按键,蜂鸣器还是 一直鸣叫,不产生外中断。后来仔细检查了程序,发现原来是忘记使能 EINT0 中 断了,加上 VICIntEnable = 1<<0x0e 代码,程序就能正常运行了。 2. 对设计及调试过程的心得体会。
境下进行简单的实验操作,为之后的实验打下坚实的基础。
六.附录:源代码(电子版)
#include "config.h"
const uint32 LEDS8 = 0xFF << 18;//P1[25:18]控制 LED1~LED8,低电平点亮
const uint32 KEY = 1 << 16;
//P0.16 连接 KEY1
三.方案设计
① 启动 ADS1.2IDE 集成开发环境,选择 ARM Executable Image for lpc2131
嵌入式系统实验内容(全)
实验一熟悉Linux开发环境一、实验目的1.熟悉Linux开发环境,学习Linux开发环境的配置和使用,掌握Minicom串口终端的使用。
2.学习使用Vi编辑器设计C程序,学习Makefile文件的编写和armv4l-unkonown-linux-gcc编译器的使用,以及NFS方式的下载调试方法。
3.了解UP-NETARM2410-S嵌入式实验平台的资源布局与使用方法。
4.初步掌握嵌入式Linux开发的基本过程。
二、实验内容本次实验使用Redhat Linux 9.0操作系统环境,安装ARM-Linux的开发库及编译器。
创建一个新目录,并在其中编写hello.c和Makefile文件。
学习在Linux 下的编程和编译过程,以及ARM开发板的使用和开发环境的设置。
下载已经编译好的文件到目标开发板上运行。
三、预备知识C语言的基础知识、程序调试的基础知识和方法,Linux的基本操作。
四、实验设备及工具(包括软件调试工具)硬件:UP-NETARM2410-S嵌入式实验平台、PC机Pentium 500以上, 硬盘10G以上。
软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX开发环境五、实验步骤1、建立工作目录[root@zxt smile]# mkdir hello[root@zxt smile]# cd hello2、编写程序源代码在Linux下的文本编辑器有许多,常用的是vim和Xwindow界面下的gedit等,我们在开发过程中推荐使用vim,用户需要学习vim的操作方法,请参考相关书籍中的关于vim的操作指南。
Kdevelope、anjuta软件的界面与vc6.0 类似,使用它们对于熟悉windows环境下开发的用户更容易上手。
实际的hello.c源代码较简单,如下:#include <stdio.h>main(){printf(“hello world \n”);}我们可以是用下面的命令来编写hello.c的源代码,进入hello目录使用vi命令来编辑代码:[root@zxt hello]# vi hello.c按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按Esc键进入命令状态,再用命令“:wq”保存并退出。
嵌入式系统实验IO接口
可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。 模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。
它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在
用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实 现一种文件系统、一个驱动程序或其他内核上层的功能。
static int led_release(struct inode *inode,struct file *file) {
3
之类的函数来读写 IO 端口;后一种 MMIO 是先把 IO 端口映射到 IO 内存(“内 存空间”),再使用访问 IO 内存的函数来访问 IO 端口。
对于 RISC 处理器(如 ARM、PowerPC 等),通常只实现一个物理地址空间, 外设 I/O 端口成为内存的一部分。此时,CPU 可以像访问一个内存单元那样访问 外设 I/O 端口, 而不需要设立专门的外设 I/O 指令。这两者在硬件实现上的差 异对于软件来说是完全透明的, 驱动程序开发人员可以将存储器映射方式的 I/O 端口和外设内存统一看作是“I/O 内存” 资源。
0100 = CF_DMARQ
2
0101 = TS_DATA
0110~1110 = Reserved
1111 = GPJ0_INT[3] 本次实验中,主要用到了 Output 功能,而对其他功能没有涉及,所以在端 口功能设置的时候,主要考虑这一点。GPJ0DAT 寄存器用于 GPJ0 口的数据操 作,一共有 8 位,端口配置为输入时, 从寄存器读入值对应位反映引脚电平状 态; 端口配置为输出时, 写出位产生对应引脚电平;端口配置为功能引脚时, 寄 存 器值不确 定,实 验中, 主要使用 其输出 功能。 GPJ0PUD、 GPJ0DRV 、 GPJ0CONPDN、GPJ0PUDPDN 功能不涉及,这里不做过多的介绍。 3) IO 端口地址映射 在介绍 IO 端口地址映射时,有必要介绍一下地址空间的概念。 物理地址:CPU 地址总线传来的地址,由硬件电路控制其具体含义。物理 地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上 (如显存、BIOS 等)。在程序指令中的虚拟地址经过段映射和页面映射后,就 生成了物理地址,这个物理地址被放到 CPU 的地址线上。 物理地址空间,一部分给物理 RAM(内存)用,一部分给总线用,这是 由硬件设计来决定的,因此在 32 bits 地址线的 x86 处理器中,物理地址空间是 2 的 32 次方,即 4GB,但物理 RAM 一般不能上到 4GB,因为还有一部分要给 总线用(总线上还挂着别的许多设备)。在 PC 机中,一般是把低端物理地址给 RAM 用,高端物理地址给总线用。 总线地址:总线的地址线或在地址周期上产生的信号。外设使用的是总线 地址,CPU 使用的是物理地址。物理地址与总线地址之间的关系由系统的设计 决定的。在 x86 平台上,物理地址就是总线地址,这是因为它们共享相同的地 址空间。因为物理地址和总线地址相同,所以凭眼睛看是不能确定这个地址是 用在哪儿的,它或者在内存中,或者是某个卡上的存储单元, 甚至可能这个 地址上没有对应的存储器。 虚 拟 地 址 : 现 代 操 作 系 统 普 遍 采 用 虚 拟 内 存 管 理 ( Virtual Memory Management)机制,这需要 MMU(Memory Management Unit)的支持。MMU 通常是 CPU 的一部分,如果处理器没有 MMU,或者有 MMU 但没有启用,CPU 执行单元发出的内存地址将直接传到芯片引脚上,被 内存芯片(物理内存) 接收,这称为物理地址(Physical Address),如果处理器启用了 MMU,CPU 执 行单元发出的内存地址将被 MMU 截获,从 CPU 到 MMU 的地址称为虚拟地 址(Virtual Address),而 MMU 将这个地址翻译成另一个地址发到 CPU 芯片的 外部地址引脚上,也就是将虚拟地址映射成物理地址。 Linux 中,进程的 4GB(虚拟)内存分为用户空间、内核空间。用户空间 分布为 0~3GB(即 PAGE_OFFSET,在 0X86 中它等于 0xC0000000),剩下的 1G 为内核空间。程序员只能使用虚拟地址。系统中每个进程有各自的私有用 户空间(0~3G),这个空间对系统中的其他进程是不可见的。 CPU 发出取指令请求时的地址是当前上下文的虚拟地址,MMU 再从页表 中找到这个虚拟地址的物理地址,完成取指。同样读取数据的也是虚拟地址, 比如 mov ax, var. 编译时 var 就是一个虚拟地址,也是通过 MMU 从也表中来 找到物理地址,再产生总线时序,完成取数据的。 访问 IO 端口有 2 种途径:I/O 映射方式(I/O-mapped)、内存映射方式 (Memory-mapped)。前一种途径不映射到内存空间,直接使用 intb()/outb()
嵌入式系统实验报告书
嵌入式系统实验报告书20 13– 20 14第1学期院系:电子通信工程系姓名:蒋瑾专业:通信工程学号:101307313指导老师:赵成实验一 认识嵌入式开发平台一、实验目的认识UP-NETARM2410-S 嵌入式开发平台,了解使用的ARM9 S3C2410嵌入式微处理器芯片,了解相应外围电路及接口的硬件电路设计,从而了解嵌入式系统的作用及其实现的功能。
二、实验内容观察嵌入式开发平台,认识板载的核心微处理器、存储芯片、电源电路部分、显示屏、键盘、网络接口、RS232接口、RS485接口、ADC 部分、DAC 部分、IrDA 部分、SD 卡接口、PCMCIA 卡接口、笔记本电脑硬盘接口部分、CF 卡接口、IC 卡接口、PS/2键盘鼠标接口、音频接口、USB 接口以及JTAG 调试接口等内容,了解相应电路及接口的电路原理。
三、预备知识了解常用的接口芯片及计算机外围设备;熟悉模拟及数字电路设计。
四、实验设备 1. 硬件环境配置计算机:Intel(R) Pentium(R) 及以上 内存:1GB 及以上实验设备:UP-NETARM2410-S 嵌入式开发平台 2. 软件环境配置操作系统:Microsoft Windows XP Professional Service Pack 2 虚拟机:VMware WorkStation 7Linux 系统:Red Hat Enterprise Linux AS 4 (2.6.9-5.EL)五、实验步骤六、遇到的问题及解决方法S3C2410核心资源LCD 驱动音频电路PS/2鼠标键盘接口小键盘IC 卡插口CF 卡插口IDE 硬盘接口PCMCIA 、SD 卡插口168Pin 扩展槽电源部分RS232/485接口USBJTAG 网络接口ADC/DAC IrDA 红外实验二安装VMWARE7.0虚拟机环境一、实验目的熟悉嵌入式系统开发环境的建立,学会Windows系统环境与Linux系统环境共享资源的基本方法。
嵌入式系统串口通信实验
实验四串口通信实验一.实验目的:1.掌握ARM的串行口工作原理。
2.学习并编程实现AR,的UART通信。
3.掌握S3C2410X寄存器配置方法。
二、实验设备:PC机一台 ADT IDE集成开发环境 JXARM9-2410教学实验箱三、实验内容:实现查询方式串口的收发功能。
接受来自串口(通过超级终端)的字符,并将接收到的字符发送到超级终端。
四、基础知识:1.异步串行通讯(1)异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。
(2)数据的各不同位可以分时使用同一传输通道,因此串行I/O 可以减少信号连线,最少用一对线即可进行。
接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。
为了恢复发送的信息,双方必须协调工作。
(3)在微型计算机中大量使用异步串行I/O 方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。
但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。
2.异步串行通信中的字符传送格式❑开始前,线路处于空闲状态,送出连续“1”。
传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。
❑每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。
后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。
也可以约定不要奇偶校验,这样就取消奇偶校验位。
最后是表示停止位的“1”信号,这个停止位可以约定持续1 位、1.5 位或2 位的时间宽度。
❑至此一个字符传送完毕,线路又进入空闲,持续为“1”。
经过一段随机的时间后,下一个字符开始传送才又发出起始位。
3.DB-25 DB-9引脚定义DB-25 DB-9引脚说明:RS-232C接口通信的两种基本连接方式:五、实验步骤:1.新建一个工程UART,将对应的文件添加到工程中去。
北邮嵌入式系统设计实验-实验报告
北邮嵌入式系统设计实验-实验报告嵌入式试验报告学院:xxx班级:xxx学号:xxx姓名:xxx成员:xxx一、基础学问部分1.多线程试验本章主要讲解线程的概念和线程间的同步方式。
试验一主要介绍线程的概念和线程的创建,试验二、试验三、试验四分离介绍了信号量、互斥锁、条件变量的作用和使用。
1.1 线程的介绍线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。
线程是程序中一个单一的挨次控制流程。
进程内一个相对自立的、可调度的执行单元,是系统自立调度和分派CPU 的基本单位指运行中的程序的调度单位。
在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程是允许应用程序并发执行多个任务的一种机制,是程序运行后的任务处理单元,也是SylixOS操作系统任务调度的最小单元。
在多核CPU中,同时可以有多个线程在执行,实现真正意义上的并行处理。
线程入口函数是一个能够完成特定任务的函数,因此线程入口函数的编写上与一般函数没有太多区分。
线程的创建函数如下:●创建线程失败,函数返回非0的错误代码,胜利返回0;●*thread pthread_t类型的缓冲区,保存一个线程的线程ID;●*attr 设置线程属性,设置为NULL标识创建的新线程使用默认属性;●*(*start_routine) 线程入口函数函数名●*arg 向所创建线程传入的参数1.2 信号量的概念信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。
在进入一个关键代码段之前,线程必需猎取一个信号量;一旦该关键代码段完成了,那么该线程必需释放信号量。
其它想进入该关键代码段的线程必需等待直到第一个线程释放信号量。
信号量是一个在进程和线程中都可以使用的同步机制。
信号量类似于一个通知,某个线程发出一个通知,等待此通知的线程收到通知后,会执行预先设置的工作。
嵌入式系统开发实验报告
4. 操作Android模拟器
5. 使用运行(Run)模式运行
三、实验设备:
1. PC计算机
2. JDK安装包
3. Eclipse安装包
4. Android SDK安装包
5. ADT插件
四、实验内容
初步了解android project建立过程以及如何运行模拟器,对android的运行原理进行简单了解;
实验时间:2015.10.8指导教师:时振涛
实验二:Activity生命周期程序设计
一、实验目的和要求
使学生深入了解Android组件的生命周期中各状态的变化关系。通过程序设计,掌握Activity的三种生命周期:全生命周期、可视生命周期和活动生命周期;每种生命周期中包含的不同的事件回调函数,以及它们的作用和调用顺序,深入理解Activity的生命周期过程。
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("TAG", "Main-onRestart");
}
}
2.SecondActivity.java
package com.sunwei.study;
public class SecondActivity extends AppCompatActivity {
android:theme="@style/AppTheme">
<activity
android:name="com.example.activity_demo.MainActivity"
android:label="@string/app_name">
嵌入式系统实验报告
嵌入式系统实验报告学号:姓名:班级:13电子信息工程指导老师:苏州大学电子信息学院2016年12月实验一:一个灯的闪烁1、实验要求实现PF6-10端口所连接的任意一个LED灯点亮2、电路原理图图1 LED灯硬件连接图3、软件分析RCC_Configuration();/*配置系统时钟*/GPIO_Configuration(); /* 配置GPIO IO口初始化*/for(;;){GPIOF-〉ODR = 0xfcff;/* PF8=0 —-〉点亮D3 */Delay(1000000);GPIOF-〉ODR = 0xffff; /* PF8=1 -—> 熄灭D3 */Delay(1000000);4、实验现象通过对GPIOF8的操作,可以使LED3闪烁5、实验总结这是第一次使用STM32开发板,主要内容是对IO端口进行配置,点亮与IO端口相连接的LED灯,闪烁周期为2S。
通过本实验对STM32开发板的硬件原理有了初步了解。
实验二:流水灯1、实验要求实现PF6-10端口所连接的5个LED灯顺次亮灭2、电路原理图图1 流水灯硬件连接图3、软件分析int main(void){RCC_Configuration();/* 配置系统时钟*/GPIO_Configuration();/* 配置GPIO IO 口初始化*/for(;;){GPIOF—>ODR = 0xffbf;/*PF6=0 —-> 点亮LED1 */ Delay(5000000);GPIOF—〉ODR = 0xff7f;/*PF7=0 --〉点亮LED2 */Delay(5000000);GPIOF—>ODR = 0xfeff;/* PF8=0 -—> 点亮LED3 */Delay(5000000);GPIOF—>ODR = 0xfdff;/*PF9=0 ——> 点亮LED4 */Delay(5000000);GPIOF-〉ODR = 0xfbff;/* PF10=0 --> 点亮LED5 */ }}4、实验现象LED1~LED5依次点亮,亮灭的时间间隔都为1S。
嵌入式系统实验
嵌入式系统实验指导书计算机科学与技术学院实验教学中心2007-9-1目录实验一JediView调试环境及软件编程 (3)实验二系统初始化和存储器实验 (8)实验三键盘和中断实验 (12)实验四S3C44B0X定时器实验 (19)实验五LCD显示实验 (22)实验六、uclinux文件系统实验 (26)实验一JediView调试环境及软件编程一、实验目的1. 了解调试软件JediView,掌握在JediView环境中新建工程,及其编译,调试工程的方法。
2. 掌握在JediView环境下arm系统中C语言编程及调试方法3. 掌握arm汇编语言编程及调试方法。
二、实验内容1.学习使用JediView集成开发环境:新建一个工程arm1_1,设置并编译该工程,通过JEDI仿真器下载已经编译好的文件到实验仪中运行。
观察实验仪上的执行结果。
掌握调试程序方法,为下面调试应用程序打下基础。
2. 建立工程arm1_2,编写C语言程序arm1_2.c实现1+2+3+…+N(arm1_2.c写在预习报告上)。
3. 建立工程arm1_3,用arm汇编语言编写程序arm1_3.s,实现带参数的子程序调用(用程序跳转表实现),调用参数r0=0,做r1+r2=>r0;r0=1,做r1-r2=>r0(arm1_3.s写在预习报告上)。
三、预备知识1.关于JediView调试环境基本使用方法。
JediView具备一个标准调试软件的绝大部分功能,主要由以下模块组成:源程序编辑器(Editor):用来完成源程序的编辑、修改等任务。
编译器(Build System):把源程序(包括C,C++,汇编)编译生成机器码和可调试代码。
调试器(Debugger):对编译成功的源程序进行调试,如走单步,设断点,全速运行等。
项目管理器(Project Manager):管理项目设置,包括运程序路径,编译选项等。
2.ARM指令系统,汇编语言编程知识。
实验四 多任务编程实验
嵌入式实时操作系统实验报告2实验名称:多任务编程实验姓名:王文班级:信科10-4班学号: 08103567多任务编程实验一、实验目的本实验的目的是让学生了解uC/OS-II中怎样创建一个任务以及了解uC/OS-II的多任务调度机制二、实验内容1、在Eg1的基础上新建一个任务;2、在该任务函数中打印提示信息。
三、基础知识添加任务ID1、在eg1.c文件中声明任务堆栈,任务栈以全局变量的方式静态分配,然后在创建任务时使用。
下面代码中黑体字表示的为新添加的代码/* task stack */OS_STK StackLED[STACKSIZE]= {0, };OS_STK StackSEG[STACKSIZE]= {0, };OS_STK StackTEST[STACKSIZE]= {0, };任务函数声明/* task entry function */void TaskLED(void *Id);void TaskSEG(void *Id);void TaskTEST(void *Id);四、实验步骤1、打开实验四模板工程3、按照“基础知识”部分内容编辑Eg1.c文件3、编译工程Eg1,如果出错,进行修改后再编译4、将Eg1下载并运行,正确结果将看到数码管和跑马灯闪烁,同时在超级终端上看到三个任务的提示信息,如下所示:a)Task1() turnedb)Task2() turnedc)Task3() turned五、程序代码/** eg1.c uC/OS移植及应用编程** 内容:* uC/OS移植及应用编程,建立一个工程,应用程序含两个任务,一个任务不断显示跑马灯,另外一个任务不断显示数码管* 目的:* uC/OS移植及应用编程,对多任务及应用编程有直观的了解。
**/#include "Includes.h" /* uC/OS interface */#include "option.h"#include "2410lib.h"#include "uhal.h"/* 任务栈*/OS_STK StackLED[STACKSIZE]= {0, }; // 任务LED任务栈OS_STK StackSEG[STACKSIZE]= {0, }; // 任务SEG任务栈OS_STK StackTEST[STACKSIZE]= {0, };/* 任务ID */char IdLED = '1'; // 任务LED IDchar IdSEG = '2'; // 任务SEG IDchar IdTEST = '3';/* 任务处理函数*/void TaskLED(void *Id); // 任务LED任务处理函数void TaskSEG(void *Id); // 任务SEG任务处理函数void TaskTEST(void *Id);/** 跑马灯闪烁函数,调用一次,四个跑马灯由亮变灭或者由灭变亮*/void User_LED_Blink(void){static int led_status = 0;led_status += 1;if(led_status % 2 == 0)Led_Display(0x0f);elseLed_Display(0x00);}/** 数码管显示实验,由0到F依次显示*/void User_SEG_Blink(void){static unsigned char seg_value[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e };static int seg_status = 0;*((unsigned char *)0x10000006) = 0x3e;*((unsigned char *)0x10000004) = seg_value[seg_status];seg_status += 1;if(seg_status > 15)seg_status = 0;}/** 任务LED任务处理函数* 1、OSStart调用之前创建的最高优先级任务,在该函数重启动时钟节拍定时器* 2、每隔100 ticks即1000ms,闪烁跑马灯*/void TaskLED(void *Id){uHALr_printf("Task1() called\n");/* 启动时钟节拍定时器,开始多任务调度*/ARMTargetStart();for (;;){/* 锁定任务调度*/OSSchedLock();/* 向串口打印提示字符*/sprintf(print_buf, "Task%c() turned\n", *(char *)Id);uHALr_printf(print_buf);/* 调用User_LED_Blink函数闪烁跑马灯*/User_LED_Blink();/* 解锁任务调度*/OSSchedUnlock();/* 延迟1000ms */OSTimeDly(100);}}/** 任务SEG任务处理函数* 1、每隔100 ticks即1000ms,闪烁数码管*/void TaskSEG(void *Id){uHALr_printf("Task2() called\n");for (;;){/* 锁定任务调度*/OSSchedLock();/* 向串口打印提示字符*/sprintf(print_buf, "Task%c() turned\n", *(char *)Id);uHALr_printf(print_buf);// User_SEG_Blink();/* 调用User_SEG_Blink函数闪烁数码管*/User_SEG_Blink();/* 解锁任务调度*/OSSchedUnlock();/* 延迟1000ms */OSTimeDly(100);}}void TaskTEST(void *Id){uHALr_printf("Task3() called\n");for (;;){OSSchedLock();sprintf(print_buf, "Task%c() turned\n", *(char *)Id);uHALr_printf(print_buf);User_SEG_Blink();OSSchedUnlock();OSTimeDly(100);}}/** Main函数.* 1、初始化目标系统,初始化硬件定时器等,与操作系统无关* 2、调用OSInit初始化uC/OS-II软件数据结构等,必须在打开时钟节拍中断之前调用* 3、创建两个任务,TaskLED和TaskSEG,TaskLED的优先级为5,TaskSEG的优先级为13,TaskLED的优先级高于TaskSEG* 4、调用OSStart启动uC/OS-II*/void Main(void){/** 目标系统初始化*/ARMTargetInit();/** uC/OS-II软件初始化*/OSInit();/** 创建两个任务,TaskLED和TaskSEG,TaskLED的优先级为5,TaskSEG的优先级为13,TaskLED的优先级高于TaskSEG*/OSTaskCreate(TaskLED, (void *)&IdLED, (OS_STK *)&StackLED[STACKSIZE - 1], 5);OSTaskCreate(TaskSEG, (void *)&IdSEG, (OS_STK *)&StackSEG[STACKSIZE - 1], 13);/** 启动多任务调度*/OSStart();/** 正常情况下,永远不会执行到这里*/return;}六、实验结果。
合工大嵌入式系统实验报告
计算机与信息学院《嵌入式系统》实验报告学生姓名:学号:专业班级:2014 年 6 月20 日实验一(1):熟悉Linux 开发环境一、实验目的熟悉Linux 开发环境,学会基于Mini6410 的Linux 开发环境的配置和使用。
使用Linux 的arm-linux-gcc 编译,minicom串口方式下载调试二、实验内容本次实验使用Fedora 9.0 操作系统环境,安装ARM-Linux 的开发库及编译器。
创建一个新目录,并在其中编写hello.c 和Makefile 文件。
学习在Linux 下的编程和编译过程,以及ARM 开发板的使用和开发环境的设置。
下载已经编译好的文件到目标开发板上运行。
三、实验设备及工具(包括软件调试工具)硬件:Mini6410嵌入式实验平台、PC机Pentium 500以上, 硬盘10G以上。
软件:PC机操作系统Fedora9+MINICOM+ARM-LINUX 开发环境四、实验步骤1 、建立工作目录[root@zxt smile]# mkdir hello[root@zxt smile]# cd hello2 、编写程序源代码在 Linux 下的文本编辑器有许多,常用的是 vi 和 Xwindow 界面下的 gedit 等,开发过程中推荐使用 vi。
Kdevelope、anjuta 软件的界面与 vc6.0 类似,使用它们对于熟悉 windows 环境下开发的用户更容易上手。
实际的 hello.c 源代码较简单,如下:#include <stdio.h>main() {printf(“hello world \n”);}我们可以是用下面的命令来编写 hello.c 的源代码,进入 hello 目录使用 vi 命令来编辑代码:[root@zxt hello]# vi hello.c按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按 Esc 键进入命令状态,再用命令“:wq”保存并退出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf("Serial Loop Output \r\n"); RPI_WaitMicroSeconds(50000); //延时等中断 } }
2.流水灯代码 void __attribute__((interrupt("IRQ"))) interrupt_vector(void) //定时器中断处理函数中实现流水灯
3.编译烧录
将 kernel7.img 拷贝至 sd 卡,然后上电树莓派运行观察结果 4.硬件接线
六、实验结果与分析
实验完成
七、讨论、心得 本次实验重点在于对代码的理解和融会贯通,实验中遇到一个问题,我们组的下载线按照 TXD 对应 RXD 接时串口无反应,后改成下载线 TXD 接 TXD,RXD 接 RXD 打印输出了结果,但其他组却是 TXD 对应 RXD,怀疑可能下载线错误。
RPI_GetArmTimer()->IRQClear = 1;
ticks++; if( ticks > 1 ) {
ticks = 0;
seconds++; if( seconds > 59 ) {
seconds = 0; calculate_frame_count = 1; } }
/* Flip the LED */ if( lit 睿 学号:3130103850 日期:2018.3.28 地点:创客空间
课程名称: 嵌入式系统设计 实验名称:实验四 C 语言裸机编程 一、实验目的和要求(必填) 三、主要仪器设备(必填) 五、实验数据记录和处理 七、讨论、心得
指导老师:马永昌
成绩:________________
/* Enable interrupts! */ _enable_interrupts(); // 使能中断
/* Initialise the UART */ RPI_AuxMiniUartInit( 115200, 8 ); // 初始化串口,波特率 115200,数据以 8 位传送
/* Print to the UART using the standard libc functions */ // 打印串口 printf( "Embeded system experiment\r\n" ); printf( "Initialise UART console with standard libc\r\n\n" );
{ static int lit = 0; static int ticks = 0; static int seconds = 0; static int flag = 0; // 用作流水灯标志位,每进入一次中断改变一次值
static int light_0; //定义三个灯 static int light_1; static int light_2;
{ /* Init Led */ LED_INIT(); //初始化 LED,将 LED 的 GPIO 设置为输出
//设置流水灯 GPIO5,6,13 为输出 RPI_SetGpioOutput(RPI_GPIO5); RPI_SetGpioOutput(RPI_GPIO6); RPI_SetGpioOutput(RPI_GPIO13);
LED_OFF(); lit = 0; } else { LED_ON(); lit = 1; }
if(flag == 0) //flag 为 0,亮灯 5,灭 6,13 {
light_0 = RPI_GPIO5; light_1 = RPI_GPIO6; light_2 = RPI_GPIO13; flag++; } else if(flag == 1) //flag 为 1,亮灯 6,灭 5,13
三、主要仪器设备 树莓派、PC 机
四、操作方法和实验步骤 1 通过定时器产生中断,控制 gpio,实现跑马灯 2 控制 uart 控制器,产生调试打印。
五、实验数据记录和处理
1.主程序 arm.c 注释 //包含头文件 #include <string.h> #include <stdio.h> #include <stdlib.h>
RPI_SetGpioValue(light_0,RPI_IO_HI); //light_0 设置高电平,点亮灯 RPI_SetGpioValue(light_1,RPI_IO_LO); //light_1 设置低电平,熄灭灯 RPI_SetGpioValue(light_2,RPI_IO_LO); //light_2 设置低电平,熄灭灯 }
{ light_0 = RPI_GPIO6; light_1 = RPI_GPIO5; light_2 = RPI_GPIO13; flag++;
} else //flag 为 2,亮灯 13,灭 5,6 {
light_0 = RPI_GPIO13; light_1 = RPI_GPIO5; light_2 = RPI_GPIO6; flag = 0; }
/* Setup the ARM Timer */ //配置计时器的控制寄存器 RPI_GetArmTimer()->Control =
RPI_ARMTIMER_CTRL_23BIT | //设置计时器为 1:23-bit counter RPI_ARMTIMER_CTRL_ENABLE | // 使能定时器 RPI_ARMTIMER_CTRL_INT_ENABLE | // 使能定时器中断 RPI_ARMTIMER_CTRL_PRESCALE_256; // 定时器分频
#include "rpi-aux.h" #include "rpi-armtimer.h" #include "rpi-gpio.h" #include "rpi-interrupts.h" #include "rpi-systimer.h" #include "rpi-led.h"
/** Main function - we'll never return from here */ void kernel_main( unsigned int r0, unsigned int r1, unsigned int atags )
实验类型:验证型
同组学生姓名:__孙凡原_______
二、实验内容和原理(必填)
四、操作方法和实验步骤
六、实验结果与分析(必填)
一、实验目的和要求 初步了解 C 运行库 初步了解 gcc arm 常用编译选项 了解 ARM 中断处理过程
二、实验内容和原理 编写 C 裸机代码实现跑马灯,通过控制 Timer 中断实现 通过控制 uart 串口进行调试打印
/* Enable the timer interrupt IRQ */ //使能定时器中断 RPI_GetIrqController()->Enable_Basic_IRQs = RPI_BASIC_ARM_TIMER_IRQ;
/* Setup the system timer interrupt */ /* Timer frequency = Clk/256 * 0x400 */ RPI_GetArmTimer()->Load = 0x400; //设置计时器的装载值