51单片机操作系统-RTX51Tiny

本文介绍了如何在KeiluVision5环境下,使用STC89C52单片机和RTX51Tiny操作系统进行编程,包括配置定时器、创建任务、注意事项和一个简单的demo代码,展示了任务调度和信号处理功能。
摘要由CSDN通过智能技术生成

一、实验环境

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

参考资料 感谢!

https://github.com/DIOLeo/RTX51-Tiny-ChineseDoc

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值