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

📄 yy1.c

📁 c8051f040单片机上的UCOS 移植代码
💻 C
字号:
#include <includes.h>
#include <stdio.h>
#define BAUDRATE     115200            // Baud rate of UART in bps
#define SYSCLK       24500000          // Internal oscillator frequency in Hz


sbit LED = P1^6;                       // LED='1' means ON
sbit SW1 = P3^7;                       // SW1='0' means switch pressed

void Initsystem() reentrant;
void UART1_Init (void)	  reentrant;
void TaskStartyya(void *yydata) reentrant;
void TaskStartyyb(void *yydata) reentrant;
void TaskStartyyc(void *yydata) reentrant;
void TaskStartyyd(void *yydata) reentrant;
void TaskStartyye(void *yydata) reentrant;
void TaskStartyyf(void *yydata) reentrant;
void TaskStartyyg(void *yydata) reentrant;
void TaskStartyyh(void *yydata) reentrant;
void TaskStartyyi(void *yydata) reentrant;




OS_STK TaskStartStkyya[MaxStkSize];//注意:我在ASM文件中设置?STACK空间为40H即64。
OS_STK TaskStartStkyyb[MaxStkSize];	//任务堆栈 ;静态堆栈
OS_STK TaskStartStkyyc[MaxStkSize];
 OS_STK TaskStartStkyyd[MaxStkSize];
 OS_STK TaskStartStkyye[MaxStkSize];
 OS_STK TaskStartStkyyf[MaxStkSize];
 OS_STK TaskStartStkyyg[MaxStkSize];
 OS_STK TaskStartStkyyh[MaxStkSize];	//任务堆栈 ;静态堆栈
OS_STK TaskStartStkyyi[MaxStkSize];

void main(void)
{
    OSInit();	//1.OSIint()初始化μC/OS-Ⅱ所有的变量和数据结构	 2.建立空闲任务idle task,这个任务总是处于就绪态的。
	//3.如果统计任务允许OS_TASK_STAT_EN和任务建立扩展允许都设为1,则OSInit()还得建立统计任务OSTaskStat()并且让其进入就绪态。
    Initsystem();
	UART1_Init();
 //   InitSerial();  //使用T1作为串口0的波特率发生器波特率为115200
//    InitSerialBuffer();
/*,OSTaskCreate()需要四个参数:
task是任务代码的指针,
pdata是当任务开始执行时传递给任务的参数的指针,
ptos是分配给任务的堆栈的栈顶指针(参看4.02,任务堆栈),
prio是分配给任务的优先级。

此外还有:OSTaskCreateExt()需要九个参数!
前四个参数(task,pdata,ptos和prio)与OSTaskCreate()的四个参数完全相同,连先后顺序都一样。
*/  
  
        OSTaskCreate(TaskStartyya, (void *)0, &TaskStartStkyya[0],1);
	    OSTaskCreate(TaskStartyyb, (void *)0, &TaskStartStkyyb[0],3);
	    OSTaskCreate(TaskStartyyc, (void *)0, &TaskStartStkyyc[0],4);
	    OSTaskCreate(TaskStartyyd, (void *)0, &TaskStartStkyyd[0],5);
	//	OSTaskCreate(TaskStartyye, (void *)0, &TaskStartStkyye[0],6);
	  //  OSTaskCreate(TaskStartyyf, (void *)0, &TaskStartStkyyf[0],7);
	 //	 OSTaskCreate(TaskStartyyg, (void *)0, &TaskStartStkyyg[0],8);
	//	 OSTaskCreate(TaskStartyyh, (void *)0, &TaskStartStkyyh[0],9);
	     OSTaskCreate(TaskStartyyi, (void *)0, &TaskStartStkyyi[0],0);

    OSStart();	  /*多任务的启动是用户通过调用OSStart()实现的。 开始多任务调度!OSStart()永远不会返回 */

}


void TaskStartyya(void *yydata) reentrant
{
  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
    yydata=yydata;
	InitTimer0();	 //用户必须在多任务系统启动以后再开启时钟节拍器
	SFRPAGE = UART1_PAGE;
    printf ("\n\t\t*******************************\n");
     printf ("\t\t*     Hello! The world.       *\n");
    printf ("\t\t*******************************\n\n\n");
    SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
    for(;;){
	SFRPAGE = UART1_PAGE;
         printf ("\taaaaaaaAAAAAA111111 is active.\n");
 SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
        OSTimeDly(2);   // 20hz   调用?C/OS-Ⅱ的服务例程之一:任务延时函数 OSTimeDly()
    }    
}

 void TaskStartyyb(void *yydata) reentrant
{
  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
    yydata=yydata;
    for(;;){
	SFRPAGE = UART1_PAGE;
printf ("\tbbbbbbbBBBBBB111111 is active.\n");
 SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
        OSTimeDly(5);   //  10hz  调用?C/OS-Ⅱ的服务例程之一:任务延时函数 OSTimeDly()
    }    
}


 void TaskStartyyc(void *yydata) reentrant
{
  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
    yydata=yydata;
    for(;;){
	SFRPAGE = UART1_PAGE;
 //        printf ("\tcccccCCCCCC11111111 is active.\n");
//		 printf ("\tcccccCCCCCC22222222 is active.\n");
//		 printf ("\tcccccCCCCCC33333333 is active.\n");
		 puts ("\tcccccCCCCCC44444444 is active.\n");
		 puts ("\tcccccCCCCCC555555 is active.\n");
		 puts ("\tcccccCCCCCC6666666 is active.\n");
 SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
        OSTimeDly(10);   //  5hz  调用?C/OS-Ⅱ的服务例程之一:任务延时函数 OSTimeDly()
    }    
}
 void TaskStartyyd(void *yydata) reentrant
{
  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
    yydata=yydata;
    for(;;){
	SFRPAGE = UART1_PAGE;
         puts ("\tddddddddddd11111111 is active.\n");
		 puts ("\tddddddddddd2222222 is active.\n");
		 puts ("\tddddddddddd3333333 is active.\n");

 SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
        OSTimeDly(25);   //  2hz  调用?C/OS-Ⅱ的服务例程之一:任务延时函数 OSTimeDly()
    }    
}
 void TaskStartyye(void *yydata) reentrant
{
  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
    yydata=yydata;
    for(;;){
	SFRPAGE = UART1_PAGE;
         puts ("\teeeeeeeeeeee55555555 is active.\n");
 SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
        OSTimeDly(18*OS_TICKS_PER_SEC);   //    调用?C/OS-Ⅱ的服务例程之一:任务延时函数 OSTimeDly()
    }    
}
 void TaskStartyyf(void *yydata) reentrant
{
  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
    yydata=yydata;
    for(;;){
	SFRPAGE = UART1_PAGE;
         puts ("\tffffffffffff666666666 is active.\n");
 SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
        OSTimeDly(10*OS_TICKS_PER_SEC);   //    调用?C/OS-Ⅱ的服务例程之一:任务延时函数 OSTimeDly()
    }    
}
 void TaskStartyyg(void *yydata) reentrant
{
  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
    yydata=yydata;
    for(;;){
	SFRPAGE = UART1_PAGE;
         puts ("\tgggggggggggg7777777777 is active.\n");
 SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
        OSTimeDly(12*OS_TICKS_PER_SEC);   //    调用?C/OS-Ⅱ的服务例程之一:任务延时函数 OSTimeDly()
    }    
}
 void TaskStartyyh(void *yydata) reentrant
{
  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
    yydata=yydata;
    for(;;){
	SFRPAGE = UART1_PAGE;
         puts ("\thhhhhhhhhhh88888888888 is active.\n");
		 puts ("\tkkkkkkkk11111111111111 is active.\n");
 SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
        OSTimeDly(14*OS_TICKS_PER_SEC);   //    调用?C/OS-Ⅱ的服务例程之一:任务延时函数 OSTimeDly()
    }    
}


 void TaskStartyyi(void *yydata) reentrant
{
  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
    yydata=yydata;
    for(;;){
	SFRPAGE = UART1_PAGE;
        printf ("%lu\n", OSTime);
 SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
        OSTimeDly(OS_TICKS_PER_SEC);   //    调用?C/OS-Ⅱ的服务例程之一:任务延时函数 OSTimeDly()
    }    
}
void Initsystem()  reentrant
{
  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
  
   WDTCN = 0xde;                       // disable watchdog timer
   WDTCN = 0xad;

   SFRPAGE = CONFIG_PAGE;              // set SFR page

   OSCICN = 0x83;                      // set internal oscillator to run
                                       // at its maximum frequency

   CLKSEL = 0x00;                      // Select the internal osc. as
   XBR0     = 0x00;
   XBR1     = 0x00;
   XBR2     = 0x44;                    // Enable crossbar and weak pull-up
                                       // Enable UART1

   P0MDOUT |= 0x01;                    // Set TX1 pin to push-pull
   P1MDOUT |= 0x40;                    // Set P1.6(LED) to push-pull
//   SFRPGCN=0;	    //禁止SFRPAGE的页面切换功能
   SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page


}
void UART1_Init (void)	  reentrant
{
   char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page

   SFRPAGE = UART1_PAGE;
   SCON1   = 0x10;                     // SCON1: mode 0, 8-bit UART, enable RX

   SFRPAGE = TIMER01_PAGE;
   TMOD   &= ~0xF0;
   TMOD   |=  0x20;                    // TMOD: timer 1, mode 2, 8-bit reload


   if (SYSCLK/BAUDRATE/2/256 < 1) {
      TH1 = -(SYSCLK/BAUDRATE/2);
      CKCON |= 0x10;                   // T1M = 1; SCA1:0 = xx	  定时器1使用系统时钟
   } else if (SYSCLK/BAUDRATE/2/256 < 4) {
      TH1 = -(SYSCLK/BAUDRATE/2/4);
      CKCON &= ~0x13;                  // Clear all T1 related bits
      CKCON |=  0x01;                  // T1M = 0; SCA1:0 = 01	 定时器1使用系统时钟的1/4
   } else if (SYSCLK/BAUDRATE/2/256 < 12) {
      TH1 = -(SYSCLK/BAUDRATE/2/12);
      CKCON &= ~0x13;                  // T1M = 0; SCA1:0 = 00		定时器1使用系统时钟的1/12
   } else {
      TH1 = -(SYSCLK/BAUDRATE/2/48);
      CKCON &= ~0x13;                  // Clear all T1 related bits
      CKCON |=  0x02;                  // T1M = 0; SCA1:0 = 10		  定时器1使用系统时钟的1/48
   }

   TL1 = TH1;                          // initialize Timer1
   TR1 = 1;                            // start Timer1

   SFRPAGE = UART1_PAGE;
   TI1 = 1;                            // Indicate TX1 ready

   SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page

}

⌨️ 快捷键说明

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