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

📄 ex1.c

📁 ucos移植学习
💻 C
字号:
//任务1、2 试验信号量,可以看出任务切换顺序
//任务3、4 试验邮箱   遗留问题邮箱中的数据如何取出来
#include "..\uc_os_II\includes.h"
 

OS_STK xdata Task1Stack[CPU_MAX_STK_SIZE];
OS_STK xdata Task2Stack[CPU_MAX_STK_SIZE];
OS_STK xdata Task3Stack[CPU_MAX_STK_SIZE];
OS_STK xdata Task4Stack[CPU_MAX_STK_SIZE];
 
OS_EVENT    *DispSem;//信号量
OS_EVENT    *TxMbox,*rxmsg;
 
 void  *temp;
 char    err ;
 
  uint8 const TXMSG      =1;
  INT16U   num=0;
  INT16U   num1=0;

 
void Task1(void xdata * ppdata); 
void Task2(void xdata * ppdata); 
void Task3(void xdata * ppdata); 
void Task4(void xdata * ppdata); 


//---------------------------------------test   OSSem---------------------------------/
void Task1(void xdata * ppdata) 
{
	ppdata = ppdata;
while(1) 
{
ledd();
    printf("\nTask1_1:  %d\n",num );   //优先级最高,运行到此处
    OSSemPend(DispSem, 0,temp);        //再次等待信号量,任务切换到任务2
    printf("\nTask1:  %d\n",num1); //任务2发送信号量后接着运行
    num++;
	if(num>=100){num1++;num=num-100; printf("num=100" ); }
   OSTimeDly(50);
}
}

void Task2(void xdata *yydata)  
{
    yydata=yydata;
    for(;;)
	{    
       printf("\nTask2:  %d\n",num1 );  //任务运行到此
	   OSSemPost(DispSem);             //释放信号量,任务切换到更高优先级--任务1
       printf("\nTask2_2:  %d\n",num );  //高优先级--任务1运行完后,接着运行
        OSTimeDly(50);    
    }    
}
 

//------------------------------------------test  OSMbox---------------------------------/
void Task3(void xdata * ppdata)
{  
	ppdata = ppdata;
 
   while(1)
   {
      printf("\nTask3_1:  %d\n",num );    //运行机制与信号量基本相同
     //OSMboxPost(TxMbox,(void*)&TXMSG);  
    OSMboxPend(TxMbox,100,(void*)&err); 
     printf("\nTask3:  %d\n",num1 );
   OSTimeDly(50);
  } 
}

void Task4(void xdata * ppdata)
{
	ppdata = ppdata;
     
    while(1)
   {
    printf("\nTask4_1:  %d\n",num );
    //OSMboxPend(TxMbox,100,(void*)&err); 
     OSMboxPost(TxMbox,(void*)&TXMSG); 
    printf("\nTask4:  %d\n", num1);
    OSTimeDly(50);
  } 
}
 
/*-------------系统初始化----------------------------------------*/
void inti_system(void)
  {
   TMOD = 0X21;/*0010 0001 d7,d3:gate 门控制位
                          d6,d2:c/t计数器/定时器选择位 1计数,0定时
                          d5d4,d1d0:工作方式  方式2 常数自动装入的8位定时方式*/
    TL1 = 0XFC;TH1 = 0XFC;   /*波特率9600,15MHZ*/
                            //9600bps,N=256-(2^SMOD*15*10^6)/(9600*32*12)
	SCON = 0X52; /*0101 0010  d7d6:SM0 SM1串行口工作方式控制位
                              d5:SM2多机通讯控制位
                              d4:REN串行口接收允许位
                              d3:TB8
                              d2:RB8
                              d1:TI 发送中断标志
                              d0:RI接收中断标志*/
    PCON = 0X00;
    TL0 = 0x2c; 
	TH0 = 0xcf;     //10MS
    // ES = 1;                    //串行口中断,使用printf()函数不能开串口中断
      ET1 = 0;                  //禁止t1中断
    ET0 = 1;                 // 允许t0中断
    EX0 =1;
    EA = 1;
    TR0 = 1;
  TR1 = 1;              /*启动t1*/
}

main()
{
 
    OSInit();
    inti_system();

    DispSem= OSSemCreate(0);
 
	 TxMbox=OSMboxCreate((void*)0);

    OSTaskCreate(Task1, (void *)0, &Task1Stack[0],2);
    OSTaskCreate(Task2, (void *)0, &Task2Stack[0],3);
    OSTaskCreate(Task3, (void *)0, &Task3Stack[0],4);
    OSTaskCreate(Task4, (void *)0, &Task4Stack[0],5);
    OSStart();
}
 
void ledd(void)
{
  
}

 

⌨️ 快捷键说明

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