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

📄 os_core.lst

📁 PIC单片机的操作系统。picc18编译过
💻 LST
字号:
     1: // os_core.c
     2: // 名称:mpOS ; 版本:ver 1.1
     3: // 功能: 微动力公司开发的操作系统,面向PIC18F系列单片机
     4: // 其它: 通过低级中断服务程序进行任务调度
     5: //       这个版本是协作型的调度方式,带有延时功能
     6: //       每个用户任务占用7个字节内存
     7: 
     8: #include "os_core.h"
     9: 
    10: void interrupt HI_ISR(void)
    11: {
    12: unsigned char ibyte,itemp;
    13: 
    14:     if (RCIE&&RCIF)     // 异步通信接收,数据放入二级缓冲
    15:     {
    16:         ibyte=RCREG;
    17:         if (FERR||OERR)
    18:         {
    19:                         
    20:         }
    21:         else
    22:         {
    23:             itemp=osCommBuff.SavePosit;
    24:             osCommBuff. buff[itemp]=ibyte;
    25:             if (++itemp >=osCommBuffSize)
    26:             {
    27:                 itemp=0;  // 二级缓冲是FIFO的存储方式
    28:             }
    29:             if (itemp==osCommBuff.GetPosit)
    30:             {
    31:                     bCommBuffFull=1;  // 缓冲区满
    32:                 }
    33:             osCommBuff.SavePosit=itemp;
    34:             if (ibyte==0x7e) // 如果接收同步码,激活协议解释任务
    35:             {
    36:                     ;
    37:                 }
    38:         }        
    39:     }
    40: }
    41: 
    42: void interrupt low_priority LOW_ISR(void)
    43: {
    44: static unsigned char state,id;
    45: 
    46:     if(!bOSSCH&&TMR1H==0)
    47:     {
    48:             if (TMR1IE&&TMR1IF) // 操作系统时钟基 10ms
    49:             {
    50:                 for (id=0;id<OS_TASKS;id++)
    51:                 {
    52:                     if (TCB[id].osWaitTick)
    53:                     {
    54:                         TCB[id].osWaitTick --;
    55:                         if (TCB[id].osWaitTick==0)
    56:                         {
    57:                             TCB[id].osTaskState=osTaskSta_Ready ;
    58:                         }
    59:                     }
    60:                 }
    61:             }
    62:     }
    63: 
    64: // 任务调度
    65:         TMR1IF=0;
    66:         bOSSCH=0;
    67:     //保存当前正在运行的任务指针
    68:     TCB[osRunningTask].osTaskStackTop=(unsigned int)(TOSH<<8)+TOSL;
    69:         osRunningTask=OS_TASKS;
    70:     for (id=0;id<OS_TASKS;id++)
    71:     {
    72:         state=TCB[id].osTaskState;
    73:         if (state==osTaskSta_Ready)   //就绪的任务,优先级高的先运行
    74:         {
    75:             // 要运行的任务指针入栈顶
    76:             osRunningTask=id;
    77:                         break;
    78:         }
    79:     }
    80:     osEnterOsFunction();    
    81:     TOSH=TCB[osRunningTask].osTaskStackTop>>8;
    82:     TOSL=TCB[osRunningTask].osTaskStackTop; 
    83:     osExitOsFunction();
    84: }
    85: 
    86: void osDelay(unsigned int ticks)
    87: {
    88:     TCB[osRunningTask].osWaitTick=ticks;
    89:     TCB[osRunningTask].osTaskState =osTaskSta_Delay;
    90: }
    91: 
    92: void osExitTask(void)
    93: {
    94:     TCB[osRunningTask].osWaitTick=0;
    95:     TCB[osRunningTask].osTaskState =osTaskSta_Stop;
    96:     TCB[osRunningTask].osTaskStackTop=TCB[osRunningTask].osTaskPtr;
    97: }
    98: 
    99: void osInit(void)
   100: {
   101:     IPEN=1;
   102:     TMR1IP=0;
   103:     
   104:     TMR1ON=1;
   105:     TMR1IE=1;
   106:     
   107:     GIEL=1;
   108:     GIEH=1;
   109:     osRunningTask=OS_TASKS;
   110: }
   111: 
   112: void osCreateTask(void *taskPtr, unsigned char TaskID)
   113: {
   114:         TCB[TaskID].osTaskPtr=(unsigned int)taskPtr;
   115:     TCB[TaskID].osTaskStackTop=TCB[TaskID].osTaskPtr;    
   116:     TCB[TaskID].osTaskID=TaskID;
   117: }
   118: 
   119: void osTaskIdle(void)
   120: {
   121:     while (1)
   122:     {
   123:         GIEL=1;
   124:         GIE=1;
   125:         GIEH=1;
   126:         clrwdt();
   127:         osSch();
   128:     }
   129: }
   130: unsigned char OpenComm(unsigned char RxTx )
   131: {
   132: 
   133:         if (RxTx==0x01) // 只发送
   134:         {
   135:                 return 1;
   136:         }
   137:         else if (RxTx==0x10) //只接收
   138:         {
   139:                 return 1;
   140:         }
   141:         else if (RxTx==0x11) // 发送和接收
   142:         {
   143:                 return 1;
   144:         }       
   145:         else // 参数错误
   146:         {
   147:                 return 0;       
   148:         }
   149: }
   150: 
   151: void CloseComm(void)
   152: {
   153: 
   154: }
   155: 
   156: unsigned char 
   157: osGetCommBuff(unsigned char bytes,unsigned char *ptr)
   158: {
   159: unsigned char i,j;
   160:     if (bytes==0) return 0;
   161:     if (osCommBuff.SavePosit==osCommBuff.GetPosit)  return 0;
   162:     if (osCommBuff.SavePosit>osCommBuff.GetPosit)
   163:     {
   164:         bytes= osCommBuff.SavePosit-osCommBuff.GetPosit;
   165:     }
   166:     else
   167:     {
   168:         bytes= osCommBuffSize-osCommBuff.GetPosit+osCommBuff.SavePosit;
   169:     }
   170:     i=bytes;
   171:     do{
   172:         j=osCommBuff.GetPosit;
   173:         *ptr=osCommBuff.buff[j];
   174:         osCommBuff.GetPosit ++;
   175:         if (osCommBuff.GetPosit>=osCommBuffSize) osCommBuff.GetPosit=0;
   176:     }while(--i);
   177:     return bytes;
   178: }
   179: 
   180: unsigned char osChkCommBuff(void)
   181: {
   182: unsigned char bytes;
   183:     if (osCommBuff.SavePosit>=osCommBuff.GetPosit)
   184:     {
   185:         bytes= osCommBuff.SavePosit>=osCommBuff.GetPosit;
   186:     }
   187:     else
   188:     {
   189:         bytes= osCommBuffSize-osCommBuff.GetPosit+osCommBuff.SavePosit;
   190:     }
   191:     return bytes;
   192: }
   193: 
   194: unsigned char
   195: Wr45DB041(unsigned char *addr,unsigned char *buff,unsigned char cnt)
   196: {
   197: 
   198: 
   199:     return 1;
   200: }
   201: 
   202: unsigned char
   203: Rd45DB041(unsigned char *addr,unsigned char *buff,unsigned char cnt)
   204: {
   205: 
   206: 
   207:     return 1;
   208: }

⌨️ 快捷键说明

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