嵌入式μCOS-II内核实验四(哲学家就餐问题的实现).ppt
内核实验(四),哲学家就餐问题的实现,实验目的,掌握在基于嵌入式实时操作系统C/OS-II的应用中,任务使用信号量的一般原理。通过经典的哲学家就餐实验,了解如何利用信号量来对共享资源进行互斥访问。,5个任务:Task0、Task1、Task2、Task3、Task4 5个信号量:Sem0,Sem1,Sem2,Sem3,Sem4 优先级:Task0Task1Task2Task3Task4 每个任务i均作相同的工作:申请信号量i,(i+1)mod 5;保持信号量;释放信号量(i+1)mod 5,i,实验设计,实验设计,1、Task0 Task4先后执行,显示“thinking”,然后挂起;2、Task0 Task4延时先后到期,显示“hungry”,然后挂起;3、Task0、2、4、1、3先后获得信号量号,显示“eating”,然后挂起;4、,运行流程,#define OS_TASK_CREATE_EN 1/*允许使用OSTaskCreate()*/,#define OS_MAX_TASKS 6/*最多可以创建6个任务*/,#define OS_TASK_STAT_EN 0/*禁止统计任务*/,#define OS_TASK_CREATE_EXT_EN 1/*是否允许使用OSTaskCreateExt()*/,操作系统配置,#define OS_TICKS_PER_SEC 200/*设置每秒之内的时钟节拍数目*/,#define OS_SEM_EN 1/*是否允许使用信号量功能*/,#define OS_MAX_EVENTS 5/*最多可以有5个事件*/,#define OS_LOWEST_PRIO 7/*任务优先级不可以大于7*/,操作系统配置,OSSemCreate():建立并初始化一个信号量,本实验中所用到的C/OS-II相关函数,OSSemPend():申请信号量,OSSemPost():释放信号量,OSTimeDly():将一个任务延时若干个时钟节拍,OSTaskCreateExt():创建一个任务,、创建起始任务TaskStart,OSTaskCreateExt(TaskStart,(void*)0,源程序说明,TaskStart负责:,安装时钟中断服务例程ucos_x86_idt_set_handler(0 x20,(void*)OSTickISR,0 x8e00);初始化操作系统时钟ucos_timer_init();创建信号量forki=OSSemCreate(1);创建应用任务TaskStartCreateTasks();,源程序说明,2、创建应用任务Task0,Task4,for(i=0;i N_TASKS;i+)TaskDatai=i;OSTaskCreate(Task,(void*),3、应用任务,源程序说明,void Task(void*pdata)for(;)/*无限循环*/TASK_Thinking_To_Hungry(i);OSSemPend(forki,0,/*Delay 100 clock tick*/,源程序说明,输出信息,