📄 ex1.lst
字号:
C51 COMPILER V7.02a EX1 10/16/2006 15:27:51 PAGE 1
C51 COMPILER V7.02a, COMPILATION OF MODULE EX1
OBJECT MODULE PLACED IN ex1.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE ex1.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //任务1、2 试验信号量,可以看出任务切换顺序
2 //任务3、4 试验邮箱 遗留问题邮箱中的数据如何取出来
3 #include "..\uc_os_II\includes.h"
4
5
6 OS_STK xdata Task1Stack[CPU_MAX_STK_SIZE];
7 OS_STK xdata Task2Stack[CPU_MAX_STK_SIZE];
8 OS_STK xdata Task3Stack[CPU_MAX_STK_SIZE];
9 OS_STK xdata Task4Stack[CPU_MAX_STK_SIZE];
10
11 OS_EVENT *DispSem;//信号量
12 OS_EVENT *TxMbox,*rxmsg;
13
14 void *temp;
15 char err ;
16
17 uint8 const TXMSG =1;
18 INT16U num=0;
19 INT16U num1=0;
20
21
22 void Task1(void xdata * ppdata);
23 void Task2(void xdata * ppdata);
24 void Task3(void xdata * ppdata);
25 void Task4(void xdata * ppdata);
26
27
28 //---------------------------------------test OSSem---------------------------------/
29 void Task1(void xdata * ppdata)
30 {
31 1 ppdata = ppdata;
32 1 while(1)
33 1 {
34 2 ledd();
35 2 printf("\nTask1_1: %d\n",num ); //优先级最高,运行到此处
36 2 OSSemPend(DispSem, 0,temp); //再次等待信号量,任务切换到任务2
37 2 printf("\nTask1: %d\n",num1); //任务2发送信号量后接着运行
38 2 num++;
39 2 if(num>=100){num1++;num=num-100; printf("num=100" ); }
40 2 OSTimeDly(50);
41 2 }
42 1 }
43
44 void Task2(void xdata *yydata)
45 {
46 1 yydata=yydata;
47 1 for(;;)
48 1 {
49 2 printf("\nTask2: %d\n",num1 ); //任务运行到此
50 2 OSSemPost(DispSem); //释放信号量,任务切换到更高优先级--任务1
51 2 printf("\nTask2_2: %d\n",num ); //高优先级--任务1运行完后,接着运行
52 2 OSTimeDly(50);
53 2 }
54 1 }
55
C51 COMPILER V7.02a EX1 10/16/2006 15:27:51 PAGE 2
56
57 //------------------------------------------test OSMbox---------------------------------/
58 void Task3(void xdata * ppdata)
59 {
60 1 ppdata = ppdata;
61 1
62 1 while(1)
63 1 {
64 2 printf("\nTask3_1: %d\n",num ); //运行机制与信号量基本相同
65 2 //OSMboxPost(TxMbox,(void*)&TXMSG);
66 2 OSMboxPend(TxMbox,100,(void*)&err);
67 2 printf("\nTask3: %d\n",num1 );
68 2 OSTimeDly(50);
69 2 }
70 1 }
71
72 void Task4(void xdata * ppdata)
73 {
74 1 ppdata = ppdata;
75 1
76 1 while(1)
77 1 {
78 2 printf("\nTask4_1: %d\n",num );
79 2 //OSMboxPend(TxMbox,100,(void*)&err);
80 2 OSMboxPost(TxMbox,(void*)&TXMSG);
81 2 printf("\nTask4: %d\n", num1);
82 2 OSTimeDly(50);
83 2 }
84 1 }
85
86 /*-------------系统初始化----------------------------------------*/
87 void inti_system(void)
88 {
89 1 TMOD = 0X21;/*0010 0001 d7,d3:gate 门控制位
90 1 d6,d2:c/t计数器/定时器选择位 1计数,0定时
91 1 d5d4,d1d0:工作方式 方式2 常数自动装入的8位定时方式*/
92 1 TL1 = 0XFC;TH1 = 0XFC; /*波特率9600,15MHZ*/
93 1 //9600bps,N=256-(2^SMOD*15*10^6)/(9600*32*12)
94 1 SCON = 0X52; /*0101 0010 d7d6:SM0 SM1串行口工作方式控制位
95 1 d5:SM2多机通讯控制位
96 1 d4:REN串行口接收允许位
97 1 d3:TB8
98 1 d2:RB8
99 1 d1:TI 发送中断标志
100 1 d0:RI接收中断标志*/
101 1 PCON = 0X00;
102 1 TL0 = 0x2c;
103 1 TH0 = 0xcf; //10MS
104 1 // ES = 1; //串行口中断,使用printf()函数不能开串口中断
105 1 ET1 = 0; //禁止t1中断
106 1 ET0 = 1; // 允许t0中断
107 1 EX0 =1;
108 1 EA = 1;
109 1 TR0 = 1;
110 1 TR1 = 1; /*启动t1*/
111 1 }
112
113 main()
114 {
115 1
116 1 OSInit();
117 1 inti_system();
C51 COMPILER V7.02a EX1 10/16/2006 15:27:51 PAGE 3
118 1
119 1 DispSem= OSSemCreate(0);
120 1
121 1 TxMbox=OSMboxCreate((void*)0);
122 1
123 1 OSTaskCreate(Task1, (void *)0, &Task1Stack[0],2);
124 1 OSTaskCreate(Task2, (void *)0, &Task2Stack[0],3);
125 1 OSTaskCreate(Task3, (void *)0, &Task3Stack[0],4);
126 1 OSTaskCreate(Task4, (void *)0, &Task4Stack[0],5);
127 1 OSStart();
128 1 }
129
130 void ledd(void)
131 {
132 1
133 1 }
134
135
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 417 ----
CONSTANT SIZE = 120 ----
XDATA SIZE = 2048 ----
PDATA SIZE = ---- ----
DATA SIZE = 18 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -