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