一,简单测试步骤:
1. license management包含两项:artx51 real time os, PK51
2. code
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include "rtx51tny.h" #include <reg51.h> sbit led0 = P2^0; sbit led1 = P2^1; sbit led2 = P2^2; /*在Conf_tny.A51中可配置INT_CLOCK来决定中断使用的周期数也就是时间片,在12HZH的晶振下,INT_CLOCK EQU 10000为10ms, TIMESHARING EQU?5表示任务的时间片最大为50ms*/ void main_job() _task_ 0 { os_create_task(1);//task1 os_create_task(2);//task2 os_create_task(3);//task3 os_delete_task(0);//delet task0 } void led0_job() _task_ 1 { led0 = 0; for (;;) { led0 = !led0; /*关于os_wait函数的理解第一个参数为等待时间,有三个选项K_SIG(启动信号),K_TMO(超时信号),K_IVL(周期信号)或是组合使用。 第二个参数为等待的滴答时间,设置为10的话就是基准时间片*10,第三个参数未使用,默认设置为0*/ os_wait(K_TMO,100,0); //延时1s } } void led1_job() _task_ 2 { led1 = 0; for (;;) { led1 = !led1; os_wait(K_TMO,100,0); //延时1.5s } } void led2_job() _task_ 3 { led2 = 0; for (;;) { led2 = !led2; os_wait(K_TMO,100,0); //延时1.5s } }
3. ok
二、stc15
1.
2
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#define MAIN_Fosc 11059200L //定义主时钟 #define Main_Fosc_KHZ (MAIN_Fosc / 1000) #include "15W4KxxS4.h" #include <rtx51tny.h> #include <stdio.h> #define Buf_Max 5 #define uint8 unsigned char #define uint16 unsigned int //#define uchar unsigned char uint8 data Rec_Buf[Buf_Max]; uint8 i = 0; uint8 xdata buf[20]; void delay_ms(unsigned char ms) { unsigned int i; do { i = MAIN_Fosc / 13000; while(--i) ; //14T per loop } while(--ms); } void UART_Init(void) { SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x40; //定时器1时钟为Fosc,即1T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //设定定时器1为16位自动重装方式 TL1 = 0xE0; //设定定时初值 TH1 = 0xFE; //设定定时初值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 ES=1; } void U1SendData(uint8 ch) { SBUF = ch; //写数据到UART数据寄存器 while(TI == 0); //在停止位没有发送时,TI为0即一直等待 TI = 0; //清除TI位(该位必须软件清零) } void U1SendString(uint8 *s) { while (*s) //检测字符串结束标志 { U1SendData(*s++); //发送当前字符 } } void Uart1() interrupt UART1_VECTOR using 1 { ES = 0; // 串口1中断关闭 if (RI) //串行接收到停止位的中间时刻时,该位置1 { RI = 0; //清除RI位 (该位必须软件清零) Rec_Buf[i] = SBUF; //把串口1缓存SBUF寄存器数据依次存放到数组Rec_Buf中 i++; if(i>Buf_Max) //接收数大于定义接收数组最大个数时,覆盖接收数组之前值 { i = 0; } } if (TI) //在停止位开始发送时,该位置1 { TI = 0; //清除TI位(该位必须软件清零) } ES = 1; // 串口1中断打开 } void UART_Send_Byte(unsigned char mydata) { ES=0; TI=0; SBUF=mydata; while(!TI); TI=0; ES=1; } void UART_Send_Str(char *s) { int i=0; while(s[i]!=0) { UART_Send_Byte(s[i]); i++; } } unsigned int x0,x1,x2; void job0(void) _task_ 0 { x0=x1=x2=0; UART_Init( ); UART_Send_Str("The different between K_VIL with K_TMO\x0a\x0d");//结尾的两个转义字符起换行作用 delay_ms(200); os_create_task(1); os_create_task(2); os_create_task(3); os_create_task(4); while(1){ os_wait(K_TMO,1,0); x0++; } } void job1(void) _task_ 1{ while(1) { os_wait2(K_IVL,1);//os_wait(K_IVL,1,0);使用RTX51tiny中使用os_wait2效率更高 x1++; } } void job2(void) _task_ 2{ while(1) { os_wait2(K_IVL,1); //os_wait(K_IVL,1,0); x2++; } } void job3(void) _task_ 3{ while(1) { //取消注释后,系统负担变轻,可以及时响应 //注释下面一句使系统的负担变得很重,不能及时响应job0和job1的延时信号 os_wait2(K_TMO,1); } } void job4(void) _task_ 4{ unsigned char StrTmp[18]="hello world"; while(1) { os_wait2(K_IVL,50); sprintf(StrTmp,"%d %d %d%c%c",x0,x1,x2,10,13); UART_Send_Str(StrTmp); UART_Send_Str("\r\n"); } }