嵌入式实验二

合集下载

嵌入式实验报告总结

嵌入式实验报告总结

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我们学习了嵌入式系统的通信协议和网络协议,如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上的输出波形。

  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 -
相关文档
最新文档