- 打卡等级:以坛为家II
- 打卡总天数:498
- 最近打卡:2025-05-02 07:00:13
已绑定手机
金牌会员
- 积分
- 1200
|
uCOSII-STC8-V1.06系统的任务A与任务BC之间是如何切换的?谁能看出来,指点一下?代码如下:
/******************************************************
uC/OS-II 移植到STC8H单片机
uC/OS-II Version : V2.93.01
修改版本: V1.03
修改时间: 2023-08-27
作者:熊仔
QQ: 616421684
******************************************************/
#include "config.h"
#include "os.h"
#define ET2 0x04
#define ET3 0x20
#define ET4 0x40
// ==== 实时任务函数定义 ============
void Task_A(void *p_arg) reentrant;
void Task_B(void *p_arg) reentrant;
void Task_C(void *p_arg) reentrant;
#define TASKA_STK_SIZE 64
#define TASKB_STK_SIZE 64
#define TASKC_STK_SIZE 64
// ==== 实时任务堆栈定义 ============
OS_STK Task_STK_A[TASKA_STK_SIZE];
OS_STK Task_STK_B[TASKB_STK_SIZE];
OS_STK Task_STK_C[TASKC_STK_SIZE];
long aa = 123456789 ; //测试任务传参
#define UART1_BAUD 115200
void UartInit(void)
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //定时器时钟1T模式
T2L = -((MAIN_Fosc / UART1_BAUD+2) / 4);
T2H = -((MAIN_Fosc / UART1_BAUD+2) / 4) >> 8;
AUXR |= 0x10; //定时器2开始计时
}
char putchar(char c)
{
SBUF = c;
while(TI == 0);
TI = 0;
return c;
}
// ==== 端口初始化 准双向模式 ========
void PortX_Init(void)
{
P0M1 = 0x00;
P0M0 = 0x00; //设置为准双向口
P1M1 = 0x00;
P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00;
P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00;
P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00;
P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00;
P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00;
P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00;
P7M0 = 0x00; //设置为准双向口
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
P4 = 0xFF;
P5 = 0xFF;
P6 = 0xFF;
P7 = 0xFF;
}
void Delay_MS(unsigned int ms) //reentrant //没必要弄重入函数
{
unsigned int i;
do
{
i = MAIN_Fosc / 10000;
while(--i);
}
while(--ms);
}
// ---- 定时器1初始化,用于测试 ----------
#define Timer1_HZ 10000UL // 10KHz
void Timer1_Init(void)
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = -(MAIN_Fosc / Timer1_HZ);
TH1 = -(MAIN_Fosc / Timer1_HZ) >> 8;
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}
// ---- 定时器3初始化,用于测试 ----------
#define Timer3_HZ 10000UL // 10KHz
void Timer3_Init(void)
{
T4T3M &= 0xF0; //停止计数, 定时模式, 1T模式, 不输出时钟
T4T3M |= 0x02; //定时器时钟1T模式
T3L = -(MAIN_Fosc / Timer3_HZ);
T3H = -(MAIN_Fosc / Timer3_HZ) >> 8;
T4T3M |= 0x08; //开始运行
}
// **** 实时任务 ***************
// ==== 任务 A ====================
void Task_A(void *p_arg) reentrant
{
// long v;
// v = *( long*)p_arg;
// printf("p_arg=%ld\n",v);
p_arg = p_arg;
// ==== 无限循环 ============
while (1)
{
P22 = ~P22;
OSTimeDly(OS_TICKS_PER_SEC / 2); // 500毫秒
}
}
// ==== 任务 B ====================
void Task_B(void *p_arg) reentrant
{
int n;
p_arg = p_arg;
// ==== 无限循环 ============
while(1)
{
P24 = 1;
for(n = 0; n < 3; n++)
{
// P23=1;
P1 = 0x0F;
Delay_MS(50); // 50毫秒
P1 = 0xF0;
// P23=0;
Delay_MS(100); // 100毫秒
}
OSTaskResume(4);
P24 = 0;
// OSTimeDly(OS_TICKS_PER_SEC / 100);
OSTaskSuspend(OS_PRIO_SELF);
}
}
// ==== 任务 C ====================
void Task_C(void *p_arg) reentrant
{
char i, m;
p_arg = p_arg;
// ==== 无限循环 ============
while(1)
{
m = 0x04;
P25 = 1;
for(i = 0; i < 6; i++)
{
P3 = ~m;
m <<= 1;
Delay_MS(100); // 100毫秒
}
P25 = 0;
// OSTimeDly(OS_TICKS_PER_SEC / 100);
OSTaskResume(3);
}
}
// **** 单片机程序入口 *********
void main(void)
{
char i;
EAXSFR(); //使能XSFR访问
// ==== 端口初始化 准双向模式 ========
PortX_Init();
// UartInit();
// ==== LOGO ============
for(i = 0; i < 3; i++) // LOGO
{
P2 = 0x00;
Delay_MS(50);
P2 = 0xFF;
Delay_MS(500);
}
// printf("start\r\n");
// ==== 定时器1 初始化 ===========
// Timer1_Init();
// ET1 = 1;
// // ==== 定时器3 初始化 ===========
// Timer3_Init();
// IE2 |= ET3; //允许中断
// ==== uCOS-II RTOS 初始化 ===============
OSInit();
//系统滴答定时器初始化
Timer0_Init();
// ==== uCOS-II 建立任务 ===============
OSTaskCreate(Task_A, ( void * )&aa, &Task_STK_A[0], TASKA_STK_SIZE, 2);
OSTaskCreate(Task_B, (void *)0, &Task_STK_B[0], TASKB_STK_SIZE, 3);
OSTaskCreate(Task_C, (void *)0, &Task_STK_C[0], TASKC_STK_SIZE, 4);
// ==== uCOS-II 开始任务调度 不会返回 ==========
OSStart();
}
|
|