#include "INCLUDES.h" #define TASK_STK_SIZE 512 char *s1="MyTask"; char *s2="YouTask"; INT8U err; //定义一个错误信息 INT8U y=0; OS_EVENT *Fun_Semp; //声明信号量 是事件控制块ECB类型的 //注意,前面有一个例子2 定义了互斥信号量,定义如下 //BOOLEAN ac_key; //信号量,互斥信号量 实质上就是一个标志位,是一个全局变量,来标志共享资源的访问情况 //这样,当已经有任务访问共享资源时,其他的任务就不能访问,知道该资源未被访问,其他的任务才可以进行访问 //注意这两个信号量的区别和使用情况 OS_STK StartTaskStk[TASK_STK_SIZE]; //定义任务堆栈区 OS_STK MyTaskStk[TASK_STK_SIZE]; OS_STK YouTaskStk[TASK_STK_SIZE]; void Fun(INT8U x,INT8U y); void StartTask(void *data); void MyTask(void *data); void YouTask(void *data); void main (void) { Fun_Semp=OSSemCreate(1); //在主函数中创建信号量 返回值为创建的信号量指针,参数是信号量的计数器的值 //用该参数对信号量计数器OSEventCnt进行初始化 //1即代表只创建一个信号量,代表信号量用于对共享资源的访问(例如,把它当做二值信号量使用),详见P166 OSInit(); PC_DOSSaveReturn(); PC_VectSet(uCOS, OSCtxSw); OSTaskCreate(StartTask,(void *)0, &StartTaskStk[TASK_STK_SIZE - 1], 0); //创建起始函数 OSStart(); } void StartTask(void *pdata) { #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif INT16S key; pdata = pdata; OS_ENTER_CRITICAL(); PC_VectSet(0x08, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXIT_CRITICAL(); OSStatInit(); OSTaskCreate(MyTask,(void *)0, &MyTaskStk[TASK_STK_SIZE - 1], 1); //创建任务函数 OSTaskCreate(YouTask,(void *)0, &YouTaskStk[TASK_STK_SIZE - 1], 2); //创建任务函数 for (;;) { //如果恩下ESC键,则退出UC/OS-II if (PC_GetKey(&key) == TRUE) { if (key == 0x1B) { PC_DOSReturn(); } } OSTimeDlyHMSM(0,0,3,0); } } //MyTask的函数代码 void MyTask(void *pdata) { #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif pdata = pdata; for (;;) { OSSemPend(Fun_Semp,0,&err); //请求信号量 参数Fun_Semp是信号量指针 0那一项是等待时限timeout,0表示无限等待 //err表示错误信息 PC_DispStr(0,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE); //显示MyTask字符串 Fun(7,y); //调用Fun函数 OSSemPost(Fun_Semp); //发送信号量 释放信号量,函数的参数Fun_Semp代表信号量的指针 OSTimeDlyHMSM(0,0,1,0); } } void YouTask(void *pdata) { #if OS_CRITICAL_METHOD == 3 //Allocate storage for CPU status register OS_CPU_SR cpu_sr; #endif pdata=pdata; for (;;) { OSSemPend(Fun_Semp,0,&err); //请求信号量 PC_DispStr(0,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE); Fun(7,y); //调用FUN函数 OSSemPost(Fun_Semp); //释放信号量 OSTimeDlyHMSM(0,0,2,0); //等待2s } } //公共的函数Fun的代码 void Fun(INT8U x,INT8U y) { PC_DispStr(x,y," Calling FUN()",DISP_BGND_BLACK+DISP_FGND_WHITE); //显示字符串,表示调用了Fun函数 }
|