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

📄 q.c

📁 模仿ucos ii和RTX Tiny写的一个小操作系统
💻 C
字号:
#include <AT89X52.H>

#include "os_core.h"
#include "main.h"
#include "task_switch.h"
#include "sem.h"
#include "q.h"
#include "uart.h"

uint8	OS_Task_Q_List;

//////////////////////////////////发送消息//////////////////////////////////////////////////

uint8 OSSendMsg(void * msg) reentrant 
{
    uint8  i,tempPrio=255;
 	  
     for(i=0;i<TASK_NUM;i++)                      //查找优先级最高的任务
    {
      if(OS_Task_Q_List&OSMapTbl[i]&&OS_TCB[i].Prio<tempPrio)    
      {
	    tempPrio=OS_TCB[i].Prio;
      }
     }

     for(i=0;i<TASK_NUM;i++)
    { 
       if(OS_Task_Q_List&OSMapTbl[i]&&OS_TCB[i].Prio==tempPrio)    
      {
		 break;
      }
	}

    if(i < TASK_NUM)                    //如果有任务需要
    { 
	  OS_TCB[i].msg=msg;	            //传入地址 
	  OS_Task_Q_List&= ~OSMapTbl[i];
       OSSendSignal(i);
	   return Q_OK;			            //成功,返回
    } 
    else 
    {  
        return  NOT_OK;							//没有任务需要,返回
    }		

}
//////////////////////////////////发送消息//////////////////////////////////////////////////
uint8 OSTaskSendMsg(void * msg,uint8 i)  reentrant
{

  if(i < TASK_NUM)                           //如果有任务需要
 { 
     if((OS_Task_Q_List&OSMapTbl[i]))     //判断该任务是否为等待任务
    {
	   OS_TCB[i].msg=msg;	                   //传入地址
	   OS_Task_Q_List&= ~OSMapTbl[i];
       OSSendSignal(i);
	   return  Q_OK;			               //成功,返回
    }   
  }		
       return   NOT_OK;						  //没有任务需要,返回
}

//////////////////////////////// 等待消息  /////////////////////////////////////////////////
void *  OSTaskWaitMsg(uint8 * err,uint8  Timeout) reentrant
{
   void  *msg;
  if(OS_TCB[OS_Current_ID].msg==0x0000)        //指针为空,无消息
 {	
	  
	 OS_Task_Q_List|=OSMapTbl[OS_Current_ID];  //加入消息的任务等待表
  bb:   
   
      if(OSWait(K_TMO,Timeout)==TMO_EVENT)	   //超时唤醒
	{  
	   OS_ENTER_CRITICAL();
	   OS_Task_Q_List&= ~OSMapTbl[OS_Current_ID];  //从等待表中去除
	   OS_EXIT_CRITICAL();  
       *err=Q_TMO;				 //超时
    }

      if(OS_Task_Q_List&OSMapTbl[OS_Current_ID])  
		goto bb;
  }
	 msg=OS_TCB[OS_Current_ID].msg;
	 OS_TCB[OS_Current_ID].msg=0;
	 *err=Q_OK;
	 return msg ;
			//有消息
}

⌨️ 快捷键说明

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