一、实验环境
1. Keil uVision5
2. STC89C52单片机核心板
二、配置操作系统
添加源文件
选择使用 RTX51Tiny 操作系统
包含必备的头文件
从 Keil uVision5 安装路径拷贝一份配置文件到工程目录下
修改 Conf_tny.A51 文件配置参数
- TIMESHARING指定RTX51 Tiny每一个任务运行之前的时间。设为0可以禁用循环任务切换。默认值为5
- INT_CLOCK 指定计时器生成中断之前的周期数,此数值介于1000到65535。数值越小中断到来得越快。此数值用于计算定时器的重装载值(65536-INT_CLOCK)。默认为10000
- LONG_USR_INTR决定了引用中是否有执行时间超过定时器中断的中断(除了本身的定时器中断)。当被置1时RTX51 Tiny会包含防止RTX51 Tiny定时器中断被重入的保护代码。默认为零
建立任务
三、注意
1. RTX51Tiny 只支持可重入函数,使用不可重入函数时要做处理
2. RTX51Tiny 使用 合作式调度和时间片调度方式,不支持任务优先级
四、demo代码
/*
20230905
rtx51tny demo
*/
#include <STC89C5xRC.H>
#include <rtx51tny.h>
#include "uart.h"
#include "type.h"
#include "key.h"
sbit LED1 = P1^0;
sbit LED2 = P1^3;
void start_task (void) _task_ 0
{
InitUart();
os_create_task(1); //创建任务
os_create_task(2);
os_create_task(3);
os_delete_task(0);
}
void sig_task (void) _task_ 1
{
while(1)
{
if(SIG_EVENT == os_wait(K_SIG|K_TMO, 10, 0)) //接收信号,超时100ms
{
os_clear_signal(1); //清除信号
LED1 = 0;
os_wait(K_IVL, 100, 0); //延时1000ms
}
else
{
LED1 = 1;
}
}
}
void led_task (void) _task_ 2
{
while(1)
{
os_wait(K_IVL, 10, 0); //100ms闪一次
LED2 = 1;
os_wait(K_IVL, 10, 0);
LED2 = 0;
}
}
void key_task (void) _task_ 3
{
KeyState_Type KeyState;
while(1)
{
scan_key(&KeyState);
//单次触发
switch(KeyState.Key_Trg)
{
case K_NONE:
break;
case K1:
SendStr("Key_Trg:0x01\n");
os_send_signal(1); //向任务1发送信号
break;
case K2:
SendStr("Key_Trg:0x02\n");
break;
case K3:
SendStr("Key_Trg:0x04\n");
break;
default:
SendByte(KeyState.Key_Trg);
break;
}
//连续触发
switch(KeyState.Key_Cont)
{
case K_NONE:
break;
case K1:
SendStr("Key_Cont:0x01\n");
break;
case K2:
SendStr("Key_Cont:0x02\n");
break;
case K3:
SendStr("Key_Cont:0x04\n");
break;
case K1+K2:
SendStr("Key_Cont:K1+K2\n");
break;
case K1+K3:
SendStr("Key_Cont:K1+K3\n");
break;
case K2+K3:
SendStr("Key_Cont:K2+K3\n");
break;
default:
SendByte(KeyState.Key_Cont);
break;
}
os_wait(K_IVL, 10, 0);
}
}
完整代码
链接:https://pan.baidu.com/s/10AF7b4mF1FDqxV2-l0JP1g
提取码:new4
参考资料 感谢!