⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 信号量.c

📁 使用信号量模拟ucos中优先级反转的问题
💻 C
字号:
#include "INCLUDES.H"
 

#define  TASK_STK_SIZE                 512


 OS_STK    StartTaskStk[TASK_STK_SIZE];
 OS_STK    MyTaskStk[TASK_STK_SIZE];        /* Tasks stacks                                  */
 OS_STK    YouTaskStk[TASK_STK_SIZE];
 OS_STK    HerTaskStk[TASK_STK_SIZE];

 INT16S key;
 /*
 char *s1 = "MyTask is running";
 char *s2 = "YouTask is running";
 char *s3 = "HerTask is running";
 char *ss = "Mytask require the semaphore";
*/

 INT8U   err;
 INT8U   y = 0;
 INT32U   times = 0;
 OS_EVENT  *Semp;

  void  StartTask(void *data);
  void  Task1(void *data);                  /* Function prototypes of Startup task           */
  void  Task2(void *data);
  void  Task3(void *data);

void  main (void)
{

  //PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);      /* Clear the screen                         */

  OSInit();                                              /* Initialize uC/OS-II                      */
  PC_DOSSaveReturn();                                    /* Save environment to return to DOS        */
  PC_VectSet(uCOS, OSCtxSw);                             /* Install uC/OS-II's context switch vector */
  Semp = OSSemCreate(1);

  OSTaskCreate(StartTask, (void *)0, &StartTaskStk[TASK_STK_SIZE - 1], 0);
  OSStart();                                             /* Start multitasking                       */
}


void StartTask(void *pdata)
{
 #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
  OS_CPU_SR  cpu_sr;
#endif


  pdata = pdata;                                         /* Prevent compiler warning                 */

  OS_ENTER_CRITICAL();
  PC_VectSet(0x08, OSTickISR);                           /* Install uC/OS-II's clock tick ISR        */
  PC_SetTickRate(OS_TICKS_PER_SEC);                      /* Reprogram tick rate                      */
  OS_EXIT_CRITICAL();

  OSStatInit();                                          /* Initialize uC/OS-II's statistics         */

  OSTaskCreate(Task1,(void *)0, &MyTaskStk[TASK_STK_SIZE - 1], 3);

  OSTaskCreate(Task2,(void *)0, &YouTaskStk[TASK_STK_SIZE - 1], 4);

  OSTaskCreate(Task3,(void *)0, &HerTaskStk[TASK_STK_SIZE - 1], 5);

  for(;;)
  {

  if( PC_GetKey(&key) == TRUE )
  {
   if( key == 0x1B )
   {
    PC_DOSReturn();
    }


  }
     OSTimeDlyHMSM(0,0,3,0);
 }

}
void  Task1 (void *pdata)
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
  OS_CPU_SR  cpu_sr;
#endif


  pdata = pdata;                                         /* Prevent compiler warning                 */


  for (;;)
  {

	OSTimeDlyHMSM(0,0,0,200);

	//PC_DispStr(10,++y,ss,DISP_BGND_BLACK + DISP_FGND_WHITE);
	printf("task1 is waiting for sem\n");
	OSSemPend(Semp,0,&err);

	printf("task1 is running\n");
//PC_DispStr(10,++y,s1,DISP_BGND_BLACK + DISP_FGND_WHITE);

	printf("task1 is releasing sem\n");
	OSSemPost(Semp);

	OSTimeDlyHMSM(0,0,0,500);

   }

}

void Task2(void *pdata)
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
  OS_CPU_SR  cpu_sr;
#endif

  pdata = pdata;

  for (;;)
   {
	OSTimeDlyHMSM(0,0,0,500);
	   //PC_DispStr(10,++y,s2,DISP_BGND_BLACK + DISP_FGND_WHITE);
	printf("task2 is running\n");
	OSTimeDlyHMSM(0,0,0,500);
  }

}

void Task3( void *pdata )
{
#if OS_CRITICAL_METHOD == 3
  OS_CPU_SR cpu_sr;
#endif

 pdata = pdata;

 for(;;)
 {

	OSSemPend( Semp,0,&err);
	printf("task3 is waiting for sem\n");
   //PC_DispStr(10,++y,s3,DISP_BGND_BLACK + DISP_FGND_WHITE);
	printf("task3 is running\n");
   for( times; times<20000000; times++ )
   {
    OS_Sched();
   }

	printf("task3 is releasing sem\n");
	OSSemPost( Semp );

//	OSTimeDlyHMSM(0,0,1,0);

	OSTimeDlyHMSM(0,0,0,500);
 }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -