嵌入式实验二

合集下载

嵌入式实验报告总结

嵌入式实验报告总结

嵌入式实验报告总结嵌入式实验报告总结近年来,嵌入式系统在各个领域中得到了广泛的应用。

嵌入式系统是指将计算机系统嵌入到其他设备或系统中,以实现特定功能的一种计算机系统。

在本次嵌入式实验中,我深入学习了嵌入式系统的原理和应用,并通过实际操作,加深了对嵌入式系统的理解。

实验一:嵌入式系统的基本概念和发展历程在本实验中,我们首先了解了嵌入式系统的基本概念和发展历程。

嵌入式系统的特点是紧凑、高效、实时性强,并且适用于各种各样的应用场景。

通过学习嵌入式系统的发展历程,我们了解到嵌入式系统在不同领域的应用,如智能家居、医疗设备、汽车电子等。

这些应用领域的嵌入式系统都有着各自的特点和需求,因此在设计嵌入式系统时需要根据具体应用场景进行优化。

实验二:嵌入式系统的硬件平台与软件开发环境在本实验中,我们学习了嵌入式系统的硬件平台和软件开发环境。

硬件平台是嵌入式系统的基础,包括处理器、内存、外设等。

而软件开发环境则提供了开发嵌入式系统所需的工具和库函数。

我们通过实际操作,搭建了嵌入式系统的硬件平台,并使用软件开发环境进行程序的编写和调试。

通过这个实验,我深刻理解了硬件平台和软件开发环境对嵌入式系统的影响,以及它们之间的协同工作。

实验三:嵌入式系统的实时操作系统在本实验中,我们学习了嵌入式系统的实时操作系统。

实时操作系统是嵌入式系统中非常重要的一部分,它能够保证系统对外界事件的响应速度和可靠性。

我们通过实际操作,学习了实时任务的创建和调度,以及实时操作系统的中断处理机制。

实时操作系统的学习让我更加深入地了解了嵌入式系统的实时性要求和相关的调度算法。

实验四:嵌入式系统的通信与网络在本实验中,我们学习了嵌入式系统的通信与网络。

嵌入式系统通常需要与其他设备或系统进行通信,以实现数据的传输和共享。

我们学习了嵌入式系统的通信协议和网络协议,如UART、SPI、I2C、TCP/IP等。

通过实际操作,我掌握了这些通信和网络协议的使用方法,以及在嵌入式系统中如何进行数据的传输和处理。

嵌入式- 蜂鸣器控制实验

嵌入式- 蜂鸣器控制实验

实验二蜂鸣器控制实验实验目的:1 了解ARM处理器PWM接口的处理机制2 掌握在S3C2440A平台下进行PWM接口应用编程实验器材:Sinosys-EA2440实验箱PC机实验原理:脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。

通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。

即通过改变方波的占空比表示不同的模拟信号的电平。

在ARM嵌入式实验中,其实是通过微处理器中的计数器,对经过频率变换的输出频率周期进行计数,在PWM中,是通过两个寄存器(TCNTBn和TCMPBn)对输出信号的占空比进行调制,TCNTBn可以设置为TCMPBn+X,当TCNTBn在TCMPBn和TCMPBn+X 之间计数时,TOUTn(即输出信号)输出低电平,当TCNTBn计数下降到TCMPBn时,TOUTn电平反转,变为高电平,直到TCNTBn计数减到0,如果此时开启了重载,则又把预定的值重新装入TCNTBn和TCMPBn中,重复以上过程。

在ARM嵌入式PWM中,会提供一个基准时钟作为输入时钟,PWM调制会对输入的时钟进行分频等操作进入计时器逻辑,其电路图2.1如下:图2.1 PWM计时器框图如图2.1,输入的时钟PCLK经过一个8bit预置器和一个分频器,将得到的时钟进入计数器逻辑板块作为驱动时钟,而输出的TOUT则作为蜂鸣器(蜂鸣器控制电路如图2.2)的驱动信号。

图2.2 蜂鸣器控制电路实验总结:实验的主函数首先设置时钟,端口初始化,并捕捉进入测试函数的指令,与实验一大致相同,在此不在赘述,重点分析测试函数。

测试函数如下:void Beep(int freq,int ms){int div,irGPBCON&=~0x3; //将GPB0作为输入口rGPBCON|=0X2; // 接入TIMER0rTCFG0&=~0XFF; // 设置prescaler为32rTCFG0|=0XF;rTCFG1&=~0XF; //选择mux=1/16rTCFG1|=0X3;div=plck/32/16/freq 计算TCNTB0的值rTCNTB0=div;rTCMPB0=rTCNTB0>>2; 占空比为4:1rTCON&=~0X1F; 设置死区自动重载反转人工载入开始rTCON|=0XB; 关闭死区开启重载关反转开人工载入开始rTCON&=~2; 关闭人工载入for(i=1,i<ms,i++);}void beep_test(void){U8 key;freq=1000;beep(freq,0);while(1){Uart_Printf("\nWant to quit Alarm I/O test,OK? (Y/N)\n");key=Uart_Getch();if(key=='y'||key=='Y')break;else if(key=='+'){freq+=100; beep(freq,0) ; //加号增加频率Uart_Printf( "Press +to increase/reduce the frequency of beep !\n" ) ;}else if( key == '-' ) //减号降低频率{freq-=100; beep(freq,0) ;Uart_Printf( "Press - to increase/reduce the frequency of beep !\n" ) ; }实验中,通过DNW将bin文件下载到实验箱中,发现蜂鸣器开始想起,通过“+”“-”的控制,使得频率改变,明显感到蜂鸣器的响声变尖或者变低沉,说明程序有效。

嵌入式系统 实验报告

嵌入式系统 实验报告

使能 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”保存并退出。

嵌入式02STM32实验04跑马灯

嵌入式02STM32实验04跑马灯

嵌⼊式02STM32实验04跑马灯开学STM32跑马灯的实验主要就是了解GPIO⼝的配置及使⽤,我这⾥是使⽤库函数进⾏编程,主要需要设置以下两⽅⾯: 1、使能需要使⽤的IO⼝的时钟,⼀共有A、B、C、D、E、F、G七组IO⼝ 2、初始化IO⼝(设置IO⼝的端⼝号(有GPIO_Pin_0 ~ GPIO_Pin_15,共16个IO端⼝)、设置IO⼝的输出速度、设置IO⼝的⼯作模式)代码如下1//端⼝初始化2 #include "led.h"3 #include "stm32f10x.h"45void LED_Init(void)6 {7 GPIO_InitTypeDef GPIO_KST;8910 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能端⼝B和E1112 GPIO_KST.GPIO_Mode = GPIO_Mode_Out_PP; //设置端⼝模式为推挽输出13 GPIO_KST.GPIO_Pin = GPIO_Pin_5; //选择端⼝514 GPIO_KST.GPIO_Speed = GPIO_Speed_2MHz; //IO⼝的速度设置为2MHz15 GPIO_Init(GPIOB, &GPIO_KST); //初始化GPIOB.5161718 GPIO_KST.GPIO_Mode = GPIO_Mode_Out_PP; //设置端⼝模式为推挽输出19 GPIO_KST.GPIO_Pin = GPIO_Pin_5; //选择端⼝520 GPIO_KST.GPIO_Speed = GPIO_Speed_2MHz; //IO⼝的速度设置为2MHz21 GPIO_Init(GPIOE, &GPIO_KST); //初始化GPIOE.522 }主程序1//主程序2 #include "sys.h"3 #include "delay.h"4 #include "led.h"56int main(void)7 {8 delay_init(); //延时初始化9 LED_Init(); //LED初始化10while(1)11 {12 GPIO_ResetBits(GPIOE, GPIO_Pin_5); //关闭PE5端⼝的LED13 GPIO_SetBits(GPIOB, GPIO_Pin_5); //关闭PB5端⼝的LED14 delay_ms(500); //延时100ms15 GPIO_SetBits(GPIOE, GPIO_Pin_5);16 GPIO_ResetBits(GPIOB, GPIO_Pin_5); //打开PB5端⼝的LED17 delay_ms(500); //延时100ms18 }1920 }。

嵌入式系统实验报告

嵌入式系统实验报告

嵌入式系统实验报告学号:姓名:班级: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。

嵌入式实验报告

嵌入式实验报告

实验一 ARM汇编语言程序设计一、实验目的1.了解IAR Embedded Workbench 集成开发环境2.掌握ARM汇编指令程序的设计及调试二、实验设备1.PC操作系统WIN98或WIN2000或WINXP,ADSI.2集成开发环境,仿真驱动程序三、实验内容1.熟悉IAR Embedded Workbench 集成开发环境2.理解下列程序,新建工程,加入下面的程序,并观察实验结果,解释程序实现的功能分析:该程序实现的功能是程序功能:Y = A*B+C*D+E*F程序代码:AREA Examl, CODE,READONLY ;定义一个代码段ENTRY ;程序入口MOV R0,#0;设置R0寄存器的值为0MOV R8,#0;设置R8寄存器的值为0ADR R2,N;将R2寄存器的值设为数据域N的地址LDR R1,[R2];将以R2的值为地址的数据读入R1MOV R2,#0;设置R2的值为0ADR R3,C; 将R3寄存器的值设为数据域C的地址ADR R5,X; 将R5寄存器的值设为数据域X的地址LOOPLDR R4,[R3,R8];将R3+R8的数据读入R4LDR R6,[R5,R8];将R5+R8的数据读入R6MUL R9,R4,R6;R9 = R4*R6ADD R2,R2,R9;R2 = R2+R9ADD R8,R8,#4;R8 = R8+4ADD R0,R0,#1;R0 = R0+1CMP R0,R1;比较R0和R1的值BLT LOOP;R0<R1的话执行循环N DCD 0X03;C DCD 0X01,0X02,0X03,0X04,0X05,0X06;X DCD 0X01,0X02,0X03,0X04,0X05,0X06;END程序结果:各个寄存器的结果执行结果如下:3.实现1+2+3+4+····+100,求的值,并保存在地址0x90018的地址里面程序代码:MOV R0,#100;设置R0寄存器的值为100LDR R2,=0X90018;设置R2寄存器指向地址0x90018MOV R1,#0;设置R1的值为0MOV R3,#0;设置R3的值为0LOOPADD R3,R3,R0;R3 = R3+R0SUB R0,R0,#1;R0 = R0-1CMP R0,R1;将R0和R1的值比较BNE LOOP;不相等的话继续执行循环STR R3,[R2];将R3的值装入到R2指向的地址块中。

嵌入式实验报告

嵌入式实验报告

《嵌入式系统导论》实验报告学院:学号:姓名:上海工程技术大学电子电气工程学院实验一GPIO(按键和LED)实验一、实验要求1 、掌握基于STM32F103微控制器的嵌入式系统、仿真器和开发用PC机之间的连接方法,能够搭建基于STM32F103微控制器的嵌入式系统交叉开发环境。

2 、熟悉常用的嵌入式开发工具KEIL MDK或IAR EWARM的操作环境和基本功能(包括编辑、编译、链接、调试和下载等),学会创建、配置和管理STM32工程,掌握嵌入式程序的基本调试方法,学会使用逻辑分析仪窗口和外设窗口等信息窗口调试嵌入式程序。

3 、理解LED和按键的构件原理,学会设计它们与微控制器间的接口电路4 、掌握STM32F103微控制器GPIO的工作原理,熟悉STM32的GPIO库函数5 、学会使用STM32的GPIO库函数在KEIL MDK或IAR EWARM下开发基于LED和按键的简单嵌入式应用程序二、实验环境1 、硬件:ALIENTEK STM32F103嵌入式开发板2 、软件:KEIL MDK或IAR EW ARM三、实验内容1 、流水灯实验一:在KEIL MDK或IAR EW ARM 中建立STM32工程,并使用GPIO库函数和延时循环设计基于无限循环架构的嵌入式应用程序,使开发板上的红色LED以一定周期闪烁。

采用软件仿真的方式调试程序,通过“Logic Analyzer”,观察程序模拟运行时连接红色LED的引脚PA8上的输出波形。

采用硬件下载的方式调试程序,观察程序下载硬件运行时红色LED的闪烁情况。

2 、按键控制LED实验:在KEIL MDK或IAR EW ARM 中建立STM32工程,并使用GPIO库函数设计基于无限循环架构的嵌入式应用程序,实现以下功能:当按键KEY0按下时,目标板上红色LED 点亮;当按键KEY0释放时,目标板上红色LED熄灭。

采用软件仿真的方式调试程序,通过“Logic Analyzer”和“Peripherals→GPIOC”,观察程序模拟运行时连接红色LED的引脚PA8和连接按键KEY0的PC5上的输出波形。

《嵌入式系统原理与应用》实验报告07-汇编指令实验2

《嵌入式系统原理与应用》实验报告07-汇编指令实验2

《嵌入式系统原理与应用》实验报告实验序号:07 实验项目名称:汇编指令实验2学号X 姓名XXX 专业、班11计算机科学与技术实验地点实验楼1#416 指导教师XXX 实验时间2013-5-31 一、实验目的1.了解ADS 1.2 集成开发环境及ARMulator 软件仿真;2.掌握ARM7TDMI 汇编指令的用法,并能编写简单的汇编程序;3. 通过实验了解如何使用 ARM 汇编指令实现结构化程序编程。

二、实验设备(环境)及要求硬件:PC机;软件:PC机操作系统windows XP,ADS1.2集成开发环境。

三、实验内容与步骤实验内容:使用 ARM 汇编指令实现 if条件执行;使用 ARM 汇编指令实现 for循环结构;使用 ARM 汇编指令实现 while 循环结构;使用 ARM 汇编指令实现 do…while 循环结构;使用 ARM 汇编指令实现 switch 开关结构。

实验步骤:1. 思考如何使用 ARM 汇编指令实现结构化编程,具体的条件自己设定。

比如if条件执行,if(x>y) z=0,设 x 为 R0,y为 R1,z 为 R2,汇编代码如何编写。

2. 启动 ADS 1.2,使用 ARM Executable Image 工程模板建立一个工程Instruction5。

3. 建立汇编源文件 TEST2.S,编写实验程序,然后添加到工程中。

4. 编译连接工程,选择【Project】->【Debug】,启动 AXD进行软件仿真调试。

5. 打开寄存器窗口(Processor Registers),选择 Current 项监视各寄存器的值。

6. 单步运行程序,判断程序是否按设计的程序逻辑执行。

四、实验结果与数据处理(1)if(x>y) z=100;else z=50;设X为R0,Y为 R1,Z为 R2。

;文件名:for.sAREA EXP1,CODE,READONLY ;声明代码段EXP1ENTRY ;标识程序入口CODE32 ;声明32位ARM指令START MOV R0,#20MOV R1,#10MOV R2,#0CMP R0,R1MOVHI R2,#100MOVLS R2,#50END(2)for(i=0; i<10; i++){x++;}设x为R0,i为R2 (i、x均为无符号整数);文件名:for1.sAREA EXP1,CODE,READONLY ;声明代码段EXP1 ENTRY ;标识程序入口CODE32 ;声明32位ARM指令START MOV R0,#0MOV R2,#0LOOP CMP R2,#10ADDLS R0,R0,#1ADDLS R2,R2,#1BLS LOOPEND(3)while(x<=y){x *= 2;}设x为R0,y 为R1 (x、y 均为无符号整数);文件名:while.sAREA EXP1,CODE,READONLY ;声明代码段EXP1 ENTRY ;标识程序入口CODE32 ;声明32位ARM指令START MOV R0,#5MOV R1,#10LOOP CMP R0,R1MOVLS R0,R0,LSL #1BLS LOOPEND(4)do{x--;} while(x>0);设x为R0 (x为无符号整数);文件名:ADD.sAREA EXP1,CODE,READONLY ;声明代码段EXP1ENTRY ;标识程序入口CODE32 ;声明32位ARM指令START MOV R0,#5LOOP SUB R0,R0,#1CMP R0,#0SUBHI R0,R0,#1BNE LOOPEND(5); switch(key&0x0F); { case 0:; case 2:; case 3: x = key + y;; break;; case 5: x = key - y;; break;; case 7: x = key * y;; break;; default: x = 168;; break;; }; 设x为R0,y 为R1,key 为R2 (x、y、key 均为无符号整数) ;文件名:switch.sAREA EXP1,CODE,READONLY ;声明代码段EXP1ENTRY ;标识程序入口CODE32 ;声明32位ARM指令START MOV R1,#3 ; 初始化y的值MOV R2,#2 ; 初始化key的值MOV R0,#0 ; 初始化x的值SWITCH AND R2,R2,#0x0F ; switch(key&0x0F)CASE_0 CMP R2,#0 ;case 0:CASE_2 CMPNE R2,#2 ; case 2:CASE_3 CMPNE R2,#3 ; case 3:BNE CASE_5ADD R0,R2,R1 ; x = key + yB SWITCH_END ; breakCASE_5 CMP R2,#5 ; case 5:BNE CASE_7SUB R0,R2,R1 ; x = key - yB SWITCH_END ; breakCASE_7 CMP R2,#7 ; case 7:BNE DEFAULTMUL R0,R2,R1 ;x = key * yB SWITCH_END ; breakDEFAULT MOV R0,#168 ; default: x = 168SWITCH_END NOPHALT B HALTEND五、分析与讨论没截图~switch这里研究了好久,一位运行结果出错了,结果它是从CASE_3这里执行完x = key + y再由B SWITCH_END ; break这个直接跳转出去~~六、教师评语成绩签名:日期:。

嵌入式linux实验报告

嵌入式linux实验报告

嵌入式操作系统Linux实验报告专业:计算机科学与技术班级:13419011学号:1341901124姓名:武易组员:朱清宇实验一Linux下进程的创建一实验目的1.掌握Linux下进程的创建及退出操作2.了解fork、execl、wait、waitpid及之间的关系二实验内容创建进程,利用fork函数创建子进程,使其调用execl函数,退出进程后调用wait或waitpid清理进程。

三实验过程1.进程的创建许多进程可以并发的运行同一程序,这些进程共享内存中程序正文的单一副本,但每个进程有自己的单独的数据和堆栈区。

一个进程可以在任何时刻可以执行新的程序,并且在它的生命周期中可以运行几个程序;又如,只要用户输入一条命令,shell进程就创建一个新进程。

fork函数用于在进程中创建一个新进程,新进程是子进程。

原型如下:#include<sys/types.h> /* 提供类型pid_t的定义 */#include<unistd.h> /* 提供函数的定义 */pid_t fork(void);使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间fork系统调用为父子进程返回不同的值,fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:在父进程中,fork返回新创建子进程的进程ID;✓在子进程中,fork返回0;✓如果出现错误,fork返回一个负值;用fork创建子进程后执行的是和父进程相同的程序,子进程可以通过调用exec函数以执行另一个程序。

当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程(例如其m a i n函数)开始执行。

调用e x e c并不创建新进程,进程I D并未改变,只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。

e x e c函数原型execl,execlp,execle,execv,execve和execvp2.进程的退出一个进程正常终止有三种方式:由main()函数返回;调用exit()函数;调用_exit()或_Exit()函数。

浙江工业大学 嵌入式系统原理实验(1-8)

浙江工业大学 嵌入式系统原理实验(1-8)

嵌入式实验(1-8)第一次实验1. 用汇编语言编程实现:若R0=0,则转移到标号L0处;若R0=1,则转移到标号L1处;若R0=2,则转移到标号L2处。

否则不转移。

2. 用汇编语言编程实现128位整数减法。

3. 用汇编语言编程实现:有4个数分别存放在R0~R3中,编程实现:4数相乘,其积存放在R4中。

4. 用汇编语言编程实现:R0中的高24位[31:8]保持不变,低8位[7:0]设置为0xB。

5. 用汇编语言编程实现:快速中断的使能和禁止。

第二次实验1. 用汇编语言编程实现:将存储器中起始地址M1处的4个字数据复制到地址M2处。

2. 用汇编语言编程实现:100+101+102+…+200,其和存于R0。

3. 用汇编语言编程实现:从存储器中起始地址M1处的20个字节数据中,找出一个最小数存放在R0中。

4. 利用跳转表的思想编写一个汇编子程序,根据键入的值(存放在R0中)不同来完成不同的子程序跳转(假设有四个子程序SUB0、SUB1、SUB2、SUB3)。

第三次实验1 用C语言和汇编语言混合编程实现:在C语言程序中调用汇编语言代码,完成字符串STR1与STR2内容的互换(假设STR1和STR2长度一致)。

2. 用C语言和汇编语言混合编程实现:在C语言程序中调用汇编语言代码,将输入的20个字节数据,从大到小加以排序,大数在前,小数在后。

3. 用C语言和汇编语言混合编程实现:用汇编语言完成对C语言全局变量的访问。

假设CV AR1和CV AR2是C语言中定义的全局变量,请用一段汇编语言访问它们,完成两者的相加运算,结果存放在CV AR1中。

第四次实验1. 用C语言和汇编语言混合编程实现:在C语言程序中调用汇编语言代码,完成两个字符串的比较,并返回比较结果。

如果比较字符串相同,返回1,否则返回0。

2. 用C语言和汇编语言混合编程实现:请完成一段字符串“Hello Zhejiang University of Technology!”的拷贝,要求主程序用C语言编写,字符串拷贝子程序用汇编语言编写。

嵌入式实时操作系统ucosII实验2

嵌入式实时操作系统ucosII实验2

嵌入式实时操作系统实验报告任务间通信机制的建立系别计算机与电子系专业班级电子0901班学生姓名高傲指导教师黄向宇提交日期 2012 年 4 月 1 日一、实验目的二掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。

掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理及解决优先级反转的策略——优先级继承的原理。

二、实验内容1.建立并熟悉Borland C 编译及调试环境。

2.使用课本配套光盘中第五章的例程运行(例5-4,例5-5,例5-6),观察运行结果,掌握信号量的基本原理及使用方法,理解出现优先级反转现象的根本原因并提出解决方案。

3.试编写一个应用程序,采用计数器型信号量(初值为2),有3个用户任务需要此信号量,它们轮流使用此信号量,在同一时刻只有两个任务能使用信号量,当其中一个任务获得信号量时向屏幕打印“TASK N get the signal”。

观察程序运行结果并记录。

4. 试编写一个应用程序实现例5-7的内容,即用优先级继承的方法解决优先级反转的问题,观察程序运行结果并记录。

5.在例5-8基础上修改程序增加一个任务HerTask,它和YouTask一样从邮箱Str_Box里取消息并打印出来,打印信息中增加任务标识,即由哪个任务打印的;MyTask发送消息改为当Times为5的倍数时才发送,HerTask接收消息采用无等待方式,如果邮箱为空,则输出“The mailbox is empty”, 观察程序运行结果并记录。

三、实验原理1. 信号量µC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。

用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样µC/OS-II 才能支持信号量。

在使用一个信号量之前,首先要建立该信号量,也即调用OSSemCreate()函数(见下一节),对信号量的初始计数值赋值。

嵌入式实验报告

嵌入式实验报告

嵌⼊式实验报告实验⼀流⽔灯实验1实验⽬的1、掌握如何利⽤STM32F407IGTb芯⽚的I/O⼝控制LED。

2、了解掌握STM32F407GPIO的使⽤。

3、点亮⼀个led,使4个LED灯循环流动,达到流⽔效果。

2实验环境FS-STM32F407开发平台ST-Link仿真器RealView MDK5.10集成开发软件STM32CUBEMX图形开发软件PC机Xp3实验内容熟悉开发环境,构建基于固件库的⼯程,编写实验代码实现流⽔灯⼯程,实现FS-STM32F407开发平台上的LED循环闪烁。

调试编译好固件程序后,将程序下载到开发板,按复位键观察实验结果。

4实验步骤1.new project-stm32f4-stm32f407/417-LQFP176-STM32F407IGTX然后点⿏标⽣成。

2.将4个引脚设置为GPIO_Output。

3.如图所⽰设置RCC。

4.将下图时钟频率改为168。

5.点击⽣成按钮--选择⼯程路径Project Location-⼯程名字Project Name-⼯具/开发集成⼯具(Toolchain/IDE)(MDK-ARM V5)。

6.在Code Generator当中,在Generated Files当中,将Generate peripheral。

勾上然后OK。

5实验结果编译完程序后,下载到实验箱,按RESET键,按键数码管附近D4,D3,D2,D1附近四个灯循环亮灭,⽽且每次只有⼀个灯亮,达到流⽔效果。

实验⼆串⼝实验1实验⽬的1、了解TM32F407GPIO的配置过程及使⽤⽅法。

2、查找到串⼝对应的引脚,达到串⾏的效果。

3、了解实验箱底板图等。

2实验环境FS-STM32F407开发平台ST-Link仿真器RealView MDK5.10集成开发软件PC机XP、Window7/8(32/64bit)串⼝调试⼯具串⼝交叉线3实验内容1、了解keil的使⽤2、STM32CUBEMX软件的使⽤3、查找到串⼝对应的引脚,达到串⾏的效果。

嵌入式实验二

嵌入式实验二

嵌入式实验二创建一个普通文件touch hello基于文件锁机制的文件读写:创建两个程序。

一个向文件写;一个从文件读,读后删除1,首先运行读锁程序,显示读锁设置成功2,然后运行写锁程序,显示读锁已设置,无法向文件写数据3,释放读锁,显示锁释放,写锁设置成功4,释放写锁,显示锁释放代码write_lock.cint main(int argc, char **argv){int fd = -1;int wc = -1;fd = open("hello", O_RDWR);if(fd == -1){perror("open error");}/* 给文件上写入锁*/lock_set(fd, F_WRLCK);wc = write(fd, "Welcome to China\n", strlen("Welcome to China\n"));if(wc == -1){close(fd);perror("write error");}getchar();/* 给文件解锁*/lock_set(fd, F_UNLCK);close(fd);return 0;}read_lock.cint main(int argc, char **argv){int fd = -1;int rc = -1;int buffer_size = 30;char buffer[buffer_size];fd = open("hello", O_RDWR);if(fd == -1){perror("open error");}/* 给文件上写入锁*/lock_set(fd, F_RDLCK);lseek(fd, 0, SEEK_SET);memset(buffer, '\0', buffer_size);rc = read(fd, buffer, buffer_size);if(rc == -1){close(fd);perror("read error");}buffer[buffer_size - 1] = '\0';printf("buffer=%s", buffer);getchar();/* 给文件解锁*/lock_set(fd, F_UNLCK);close(fd);return 0;}基于多路转接模型的文件读写本实例中主要实现通过调用poll()函数来监听三个终端的输入(分别重定向到两个管道文件的虚拟终端及主程序所运行的虚拟终端)并分别进行相应的处理。

嵌入式系统实验报告

嵌入式系统实验报告

嵌入式系统实验报告学院:计算机科学与工程姓名:学号:______________专业:指导老师:完成日期:实验一:流水灯案例、8位数码管动态扫描案例一、实验目的1.1进一步熟悉Keil C51集成开发环境调试功能的使用;1.2学会自己编写程序,进行编译和仿真测试;1.3利用开发板下载hex文件后验证功能。

二、实验原理2.1:实验原理图2.2:工作原理2.2.1:流水灯电路中有LO,1,L2,L3,4,L5,L6,L7 共八个发光二极管,当引脚LED_ SEL输入为1,对于A、B、C、D、E、F、G、H引脚,只要输入为1,则点亮相连接的发光二极管。

A~H引脚连接STM32F108VB芯片的PE8~PE15,程序初始化时,对其进行初始设置。

引脚LED_ SEL 为1时,发光二极管才工作,否则右边的数码管工作。

注意,LED SEL 连接于PB3,该引脚具有复用功能,在默认状态下,该引脚的I0不可用,需对AFIO_ MAPR寄存器进行设置,设置其为10可用。

2.2.2:8位数码管数码管中的A~G、DP段分别连接到电路图中的A~G、H线上,当某段上有一-定的电压差值时,便会点亮该段。

当E3输入为1,也就是LED_ SEL输入为0时,根据SELO~SEL2的值确定选中的数码管,即位选,再根据A~H引脚的高低电平,点亮对应段,即段选。

三、实验结果3.1:流水灯对于给出的流水灯案例,下载HEX文件后,在开发板上可观察到L0-L7从左至右依次点亮,间隔300ms。

当全部点亮八个发光二极管后,八个发光二极管同时熄灭,间隔300ms后,发光二极管再次从左至右依次点亮。

如此反复循坏。

3.2:8位数码管对于给出的8位数码管动态扫描案例,下载后,在开发板上可观察到8个数码管从左至右依次显示对应的数字,且每一个数码显示的数字在1-9之间循环。

可以通过加快扫描频率,使得八位数码管在人眼看上去是同时显示。

在后续的案例中可以看到该现象。

嵌入式系统实验

嵌入式系统实验

嵌入式系统实验指导书计算机科学与技术学院实验教学中心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指令系统,汇编语言编程知识。

嵌入式系统实验二-LED控制实验

嵌入式系统实验二-LED控制实验

《嵌入式系统》课程实验报告学生姓名:指导教师:记分及评价:一、实验名称LED控制实验二、实验目的掌握利用S3C2410X芯片地址总线扩展到I/O来驱动LED显示;了解ARM芯片中利用总线扩展I/O口的使用方法。

三、实验内容编写程序,控制实验平台的发光二极管LED1,LED2,LED3,LED4,使它们有规律的点亮和熄灭,具体顺序如下:LED1亮->LED2亮->LED3亮->LED4亮>LED1灭>LED2灭->LED3灭>LED4灭->全亮->全灭,如此反复。

四、实验原理片选信号在接入74HC573前经过了如下处理:LE信号的产生:向LED写入数据LED连接图五、实验结果超级终端上显示一下信息:六、练习自己编写程序使数码管以不同的显示方式显示。

显示方式:用LED1、LED2、LED3、LED4依次显示00F9~00F6-00F6~00F9,然后依次显示00FE~00F0-00F0~00FE。

#include "2410lib.h"#define rCPLDLEDADDR (*(volatile unsigned char*)0x21180000)void led_on(void){int i,nOut;nOut = 0xFF;rCPLDLEDADDR = nOut & 0xF9;for(i = 0; i < 500000; i++);rCPLDLEDADDR = nOut & 0xF6;for(i = 0; i < 500000; i++);rCPLDLEDADDR = nOut & 0xF6;for(i = 0; i < 500000; i++);rCPLDLEDADDR = nOut & 0xF9;for(i = 0; i < 500000; i++);}void led_off(void){int i,nOut;nOut = 0xF0;rCPLDLEDADDR = nOut | 0xFE;for(i = 0; i < 100000; i++);rCPLDLEDADDR = nOut | 0xFC;for(i = 0; i < 100000; i++);rCPLDLEDADDR = nOut | 0xF8;for(i = 0; i < 100000; i++);rCPLDLEDADDR = nOut | 0xF0;for(i = 0; i < 100000; i++);rCPLDLEDADDR = nOut | 0xF0;for(i = 0; i < 100000; i++);rCPLDLEDADDR = nOut | 0xF8;for(i = 0; i < 100000; i++);rCPLDLEDADDR = nOut | 0xFC;for(i = 0; i < 100000; i++);rCPLDLEDADDR = nOut | 0xFE;for(i = 0; i < 100000; i++); }void led_on_off(void){int i;rCPLDLEDADDR = 0xF0;for(i = 0; i < 500000; i++);rCPLDLEDADDR = 0xFF;for(i = 0; i < 500000; i++);void led_test(void){uart_printf("\n Expand I/O (Diode Led) Test Example\n");uart_printf(" Please Look At The LEDS \n");led_on();led_off();led_on_off();delay(20000);uart_printf(" End.\n");}。

北理工嵌入式系统实验报告

北理工嵌入式系统实验报告

嵌入式系统实验报告目录实验二 (1)实验三 (4)实验四 (7)实验六 (17)填充三角形实验 (24)实验二基于ARM的汇编语言程序设计简介一、实验目的1. 了解ARM 汇编语言的基本框架,学会使用ARM 的汇编语言编程二、实验内容1. 用汇编语言编写一个简单的应用程序三、实验设备1. EL-ARM-830 教学实验箱,PentiumII 以上的PC 机,仿真调试电缆,串口电缆。

2. PC 操作系统WIN98 或WIN2000 或WINXP,ADS1.2 集成开发环境,仿真调试驱动程序四、汇编语言简介1. ARM汇编的一些简要的书写规范ARM 汇编中,所有标号必须在一行的顶格书写,其后面不要添加“:”,而所有指令均不能顶格书写。

ARM 汇编对标识符的大小写敏感,书写标号及指令时字母大小写要一致。

在ARM 汇编中,ARM 指令、伪指令、寄存器名等可以全部大写或者全部小写,但不要大小写混合使用。

注释使用“;”号,注释的内容由“;”号起到此行结束,注释可以在一行的顶格书写。

详细的汇编语句及规范请参照ARM汇编的相关书籍、文档,也可参照我们提供的文档。

2. ARM汇编语言程序的基本结构在ARM 汇编语言程序中,是以程序段为单位来组织代码。

段是相对独立的指令或数据序列,具有特定的名称。

段可以分为代码段的和数据段,代码段的内容为执行代码,数据段存放代码运行时所需的数据。

一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行文件。

可执行映像文件通常由以下几部分构成:◆一个或多个代码段,代码段为只读属性。

◆零个或多个包含初始化数据的数据段,数据段的属性为可读写。

◆零个或多个不包含初始化数据的数据段,数据段的属性为可读写。

链接器根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位EL - ARM - 830 实验指导书39置。

源程序中段之间的相邻关系与执行的映象文件中的段之间的相邻关系不一定相同。

合工大嵌入式系统实验报告

合工大嵌入式系统实验报告

计算机与信息学院《嵌入式系统》实验报告学生姓名:学号:专业班级: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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数,就有任务恢复函数,通过该函数将被挂起的任务恢复,让调度器能够重新调度 该函数。UCOSII 提供的任务恢复函数原型为:INT8U OSTaskResume(INT8U prio) 四、实验内容 在UCOSII里面创建3个任务: 开始任务、 LED0任务和LED1 任务,开始任务用于创建其他(LED0和LED1)任务,之后挂 起;LED0任务用于控制DS0 的亮灭,DS0每秒钟亮80ms;LED1 任务用于控制DS1的亮灭,DS1亮300ms,灭300ms,依次循环。 所要用到的硬件资源如下: 1)指示灯DS0 、DS1 的硬件电路图如图 其中PWR是系统电源指示灯, 为蓝色。 LED0和LED1分别接在PB5 和PE5上。为了方便大家判断,我们选择了DS0为红色的LED, DS1为绿色的LED。 2)软件参数设置 在 os_cfg.h 里面定义 OS_TICKS_PER_SEC=200,也就是设置 UCOSII 的时钟节拍为 5ms。 OS_MAX_TASKS = 10,也就是最多 10 个任务(包括空闲任务和统计任务在内)。 前面提到,我们需要在sys.h里面设置SYSTEM_SUPPORT_UCOS为1,以支持UCOSII,通过这个设 置,不仅可以实现利用delay_init来初始化SYSTICK,产生UCOSII的系统时钟节拍,还可以让 delay_us和delay_ms函数在UCOSII下能够正常使用,这使得我们之前的代码可以十分方便的移植 到UCOSII下。虽然UCOSII也提供了延时函数:OSTimeDly和OSTimeDLyHMSM,但是这两个函数的最 少延时单位只能是1个UCOSII时钟节拍,在本次实验中,即5ms,显然不能实现us级的延时,而us 级的延时在很多时候非常有用: 比如IIC模拟时序, DS18B20等单总线器件操作等。 而通过delay_us 和delay_ms,则可以方便的提供us和ms的延时服务,这比UCOSII本身提供的延时函数更好用。在 设置SYSTEM_SUPPORT_UCOS为1之后,UCOSII的时钟节拍由SYSTICK的中断服务函数提 供,该部分代码如下: systick 中断服务函数,使用 ucos 时用到 void SysTick_Handler(void) { OSIntEnter();//进入中断 OSTimeTick(); //调用 ucos 的时钟服务程序 OSIntExit(); //触发任务切换软中断 } 以上代码,其中OSIntEnter是进入中断服务函数,用来记录中断嵌套层数(OSIntNesting增 加1);OSTimeTick是系统时钟节拍服务函数,在每个时钟节拍了解每个任务的延时状态,使已经 到达延时时限的非挂起任务进入就绪状态;OSIntExit是退出中断服务函数,该函数可能触发一次 任务切换(当OSIntNesting==0&&调度器未上锁&&就绪表最高优先级任务!=被中断的任务优先级 时),否则继续返回原来的任务执行代码(如果OSIntNesting不为0,则减1)。 事实上,任何中断服务函数,都应该加上OSIntEnter和OSIntExit函数,这是因为 UCOSII是一个可剥夺型的内核,中断服务子程序运行之后,系统会根据情况进行一次任务调度去 运行优先级别最高的就绪任务,而并不一定接着运行被中断的任务! -3 -
#include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "includes.h" ///////////////////////////////////////UCOSII任务设////////////////////////////////////////////// //START 任务 //设置任务优先级 #define START_TASK_PRIO //设置任务堆栈大小 #define START_STK_SIZE //任务堆栈 OS_STK START_TASK_STK[START_STK_SIZE]; //任务函数 void start_task(void *pdata); //LED0任务 //设置任务优先级 #define LED0_TASK_PRIO //设置任务堆栈大小 #define LED0_STK_SIZE //任务堆栈 OS_STK LED0_TASK_STK[LED0_STK_SIZE]; //任务函数 64 7 64 10 //开始任务的优先级设置为最低
-4 -
void led0_task(void *pdata); //LED1任务 //设置任务优先级 #define LED1_TASK_PRIO //设置任务堆栈大小 #define LED1_STK_SIZE //任务堆栈 OS_STK LED1_TASK_STK[LED1_STK_SIZE]; //任务函数 void led1_task(void *pdata); int main(void) { Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); LED_Init(); LED_Init(); OSInit(); OSTaskCreate(start_task, (void *)0, (OS_STK *)&START_TASK_STK[START_STK_SIZE-1], START_TASK_PRIO );//创建起始任务 OSStart(); } //开始任务 void start_task(void *pdata) { OS_CPU_SR cpu_sr=0; pdata = pdata; OS_ENTER_CRITICAL(); OSTaskCreate(led0_task, (void *)0, (OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1], LED0_TASK_PRIO); OSTaskCreate(led1_task, (void *)0, (OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1], LED1_TASK_PRIO); OSTaskSuspend(START_TASK_PRIO); //挂起起始任务. OS_EXIT_CRITICAL(); } //退出临界区(可以被中断打断) //进入临界区(无法被中断打断) //初始化与LED连接的硬件接口 //延时初始化 64 6
最后,打开 test.c. 该部分代码我们创建了3个任务:start_task、led0_task和led1_task,优先级分别是10、7 和6,堆栈大小都是64(注意OS_STK为32位数据)。我们在main函数只创建了start_task一个任务, 然后在start_task再创建另外两个任务,在创建之后将自身(start_task)挂起。这里,我们单 独创建start_task,是为了提供一个单一任务,实现应用程序开始运行之前的准备工作。 在应用程序中经常有一些代码段必须不受任何干扰地连续运行,这样的代码段叫做临界段。 因此,为了使临界段在运行时不受中断所打断,在临界段代码前必须用关中断指令使CPU屏蔽中断 请求,而在临界段代码后必须用开中断指令解除屏蔽使得CPU可以响应中断请求。UCOSII提 OS_ENTER_CRITICAL和OS_EXIT_CRITICAL两个宏来实现,这两个宏需要在移植UCOSII的时候实现, 采OS_CRITICAL_METHOD为3来实现这两个宏。因为临界段代码不能被中断,将严重影响系统的实时 性,所以临界段代码越短越好! 在start_task任务中,我们在创建led0_task和led1_task的时候,不希望中断打断,故使用 了临界区。其他两个任务,就十分简单了,我们就不细说了,注意我们这里使用的延时函数还是 delay_ms,而不是直接使用的OSTimeDly。 另外,一个任务里面一般是必须有延时函数的,以释 放CPU使用权,否则可能导致低优先级的任务因高优先级的任务不释放CPU使用权而一直无法得到 CPU使用权,从而无法运行。 五、实验程序
龙岩学院物理与机电工程学院

班 级 学 室 实验日期

号 温

姓 名

同组人 绩_________
大气压_________成
实验项目:实验二:UCOS-II 任务管理
一、实验目的 1、掌握 UCOS-II 中任务管理的函数的应用。 2、掌握 UCOS-II 在 STM32 平台下对硬件的控制。 3、掌握开发 UCOS-II 应用的程序结构。 二、实验设备 1、PC 机 2、STM32 战舰开发板一台 3、keil4 三、实验步骤 四、1、UCOSII 工作原理 UCOSII提供系统时钟节拍,实现任务切换和任务延时等功能。这个时钟节拍由 OS_TICKS_PER_SEC (在os_cfg.h中定义) 设置, 一般我们设置UCOSII的系统时钟节拍为1ms~100ms。 本次实验利用STM32的SYSTICK定时器来提供UCOSII时钟节拍。 UCOSII 的任何任务都是通过一个叫任务控制块(TCB)的东西来控制的,每个任务管理块有 3 个最重要的参数:(1)任务函数指针;(2)任务堆栈指针;(3)任务优先级。 在UCOSII中,使用CPU的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权, 即任务就绪表中总是优先级最高的任务获得CPU使用权,只有高优先级的任务让出CPU使用权(比 如延时)时,低优先级的任务才能获得CPU使用权。UCOSII不支持多个任务优先级相同,也就是每 个任务的优先级必须不一样。任务的调度其实就是CPU运行环境的切换,即:PC指针、SP指针和寄 存器组等内容的存取过程 UCOSII的每个任务都是一个死循环。每个任务都处在以下5种状态之一的状态下,这5种状态 是:睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。 睡眠状态,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。 就绪状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备 好了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行,这时任务的状态 叫做就绪状态。 运行状态,该任务获得CPU使用权,并正在运行中,此时的任务状态叫做运行状态等待状态, -1 -
相关文档
最新文档