一、实验目的:

1、了解UCOS操作系统任务调度原理。

2、掌握UCOS时间管理函数的用法。

3、掌握信号量的用法。

二、实验内容:

1.编写程序完成两个LED任务的轮流调度。

2.编写程序利用信号量完成键盘驱动LED和蜂鸣器的任务。(按键KEY0控制LED0灯的亮灭,按键KEY1控制蜂鸣器鸣叫。)

三、实验过程描述及结果展示:

实验原理:

使用时间管理函数完成各任务的并发运行。

 

嵌入式多任务架构 什么是任务_#define

使用信号量完成各任务间的同步

 

嵌入式多任务架构 什么是任务_#define_02

实验代码(两个LED的轮流调度)

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "includes.h"
//UCOSII任务的一般设置
//START_TASK任务
//设置任务的优先级
#define START_TASK_PRIO 10 //设置开始任务的优先级为最高
//设置任务堆栈的大小
#define START_STK_SIZE 64
 
//任务堆栈
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);
//LED0任务
//设置任务优先级
#define LED0_TASK_PRIO 7
//设置任务堆栈大小
#define LED0_STK_SIZE 64
//任务堆栈
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
 
//任务函数
void led0_task(void *pdata);
 
//LED1任务
//设置任务优先级
#define LED1_TASK_PRIO 6
//设置任务堆栈大小
#define LED1_STK_SIZE 64
//任务堆栈
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//任务函数
void led1_task(void *pdata);
int main(void)
{
delay_init(168);//初始化处理器时钟
uart_init(115200);//初始化串口波特率为115200
LED_Init();//初始化LED端口
{
OSInit();//操作系统初始化
 
//创建启动任务
OSTaskCreate(start_task,\(void *)0,\(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],\
START_TASK_PRIO);
printf("ENTER MAIN ACCESS\r\n");
OSStart();//启动操作系统,一去不回。
}
}
 
//开始任务
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;//临界区宏使用
       pdata=pdata;//防止编译器报警
OS_ENTER_CRITICAL();//进入临界区
 
//创建LED0和LED1任务
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();//退出临界区
}
//LED0任务
void led0_task(void *pdata)
{
pdata=pdata;
while(1)
{
printf("LED0_TASK_Running!\r\n");
LED0=0;//点亮LED0
OSTimeDly(100);
LED0=1;
OSTimeDly(100);
              }
}
 
//LED1 任务
void led1_task(void *pdata)
{
              pdata=pdata;
              while(1)
              {
                     printf("LED1_TASK_Running!\r\n");
                     LED1=0;//点亮LED0
                     OSTimeDly(100);
                     LED1=1;
                     OSTimeDly(100);
              }
}

 

 

 

四、总结及实验心得:

    在本次实验之前,老师给我们讲了关于嵌入式操作系统的一些知识,但是可能时间比较紧凑,我没有太跟上老师的思路,所以我只明白了关于操作系统的一个大概的知识。在老师的指导下,跟着老师一步步完成了任务一(两个LED的轮流调度)的代码的书写。由于我的粗心大意还是有一点的小问题,在老师的细心检查下,我最终顺利完成了这个实验。不过遗憾的是,第二个任务比较难,我们最终还是没有完成。不过在课下,我们会积极的讨论这个实验的解决办法,争取完成这个实验。通过这次实验我了解了UCOS操作系统任务调度原理,并掌握了UCOS时间管理函数的用法,达到了学习和理解的目的。