📄 ex1.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 + -