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

📄 main.c

📁 small RTOS 嵌入式实时多任务开发
💻 C
字号:

// 设定为接收方

#include "config.h"

#ifndef   OS_Q_MEM_SEL
   #define   OS_Q_MEM_SEL  idata
#endif



volatile uint8 data  SelfAddr=0x71,DesAddr=0x69,SourAddr,ReceAddr;
volatile uint8 idata DataCnt, AddressCnt;
volatile uint8 idata FrameType;
volatile uint8 data SendData[_DataWidth]={'x','y'};



Info  volatile bdata ControlByte;  // 定义

uint8 code Rxconfig_Word[15]={0x20,0x20,0x00,0xcc,0xcc,0xcc,0xcc,
                              0x00,0x71,0x71,0x71,0x71,0x83,0x4f,0x05};  
/* Receive Mode,控制信道为2402MHz,发射功率0DBm,250Kbps,晶振16Mhz,ShockBurst Mode,
   使用Channel One,16bits CRC,地址宽度32bits,Payload长度32bits    */

uint8 OS_Q_MEM_SEL SerialInBuf[SendBuf];        //给读UART_RX消息队列分配的队列空间
uint8 OS_Q_MEM_SEL ReceDataBuf[ReceBuf];        //给写UART_TX消息队列分配的队列空间
uint8 OS_Q_MEM_SEL AckInBuf[AckBuf];

volatile bit SerialCanSend=1;


void Delay(uint8 TimeFlip) 
{
 OS_ENTER_CRITICAL();   // 进入临界区
   switch(TimeFlip) /* timeflip表示延迟等待的时间片 */
     {
       case  _10MS     :     TH0=0xdc;  /* T0定时周期为10ms的计数初值 */
                             TL0=0x00;
	                         break;
       case  _5MS      :     TH0=0xee;  /* T0定时周期为5ms的计数初值 */
                             TL0=0x00;
	                         break;
       case   _3MS    :      TH0=0xf5;  /* T0定时周期为3ms的计数初值 */
                             TL0=0x33;
	                         break;
       case  _1MS      :     TH0=0xfc;  /* T0定时周期为1ms的计数初值 */
                             TL0=0x66;
					         break;
       case  _500US    :     TH0=0xfe;  /* T0定时周期为500us的计数初值 */
                             TL0=0x33;
					         break;
       default         :     break;
     }
   _WAIT_TIMER0; 
 OS_EXIT_CRITICAL();  // 退出临界区 
}


void UART(void) interrupt OS_UART_ISR
{
 uint8 data temp;

 #if EN_OS_INT_ENTER>0
       OS_INT_ENTER();
 #endif

 if(RI == 1)
    {
      RI=0;
      OSQIntPost(SerialInBuf,SBUF);
    } 
 if(TI == 1)
    {
      TI=0;
      if(OSQAccept(&temp,ReceDataBuf)==OS_Q_OK)   SBUF=temp;
      else SerialCanSend=1;
    }
 OSIntExit();
 return;    
 
}


void INT1ISR(void) interrupt OS_INT1_ISR
{
 uint8 temp;
 #if EN_OS_INT_ENTER>0
       OS_INT_ENTER();
 #endif
//  INT1 = 1; IE1 = 0;  // 清中断源,其实MCU会自动清此中断源,故略去
  _RX_SPI(temp);
  ControlByte.CtrlDataFlag   =  (temp&_CtrlDataFlag)>>7;
  ControlByte.AckState       =  (temp&_AckState)>>5;                
  ControlByte.NewFrame       =  (temp&_NewFrame)>>4;                
  ControlByte.LastFrame      =  (temp&_LastFrame)>>3;               
  ControlByte.FrameSequence  =  (temp&_FrameSequence);               
   switch((uint8)ControlByte.CtrlDataFlag)
     {
    /*    case   _F_Ctrl  :  OSIntSendSignal(TaskID_ReceAck); // 唤醒应答帧接收任务
                           break; */
        case   _F_Data  :  OSIntSendSignal(TaskID_ReceData);// 唤醒接收数据任务
                           break;
        default         :  break;
     }
  OSIntExit();
  return;
}



void main(void)
{
 Init_System(); // 系统初始化
 OSStart();      // 启动多任务
}

 

⌨️ 快捷键说明

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