前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >STC单片机操作系统——RTX51 Tiny

STC单片机操作系统——RTX51 Tiny

作者头像
知否知否应是绿肥红瘦
发布2025-02-19 21:15:21
发布2025-02-19 21:15:21
6000
代码可运行
举报
文章被收录于专栏:Linux知识Linux知识
运行总次数:0
代码可运行
RTX51 是keil公司开发的一款实时操作系统,其有两个版本:1.Tiny 2.Full,区别如下:

RTX51 Full :使用四个任务优先权完成同时存在时间片轮转调度和抢先的任务切换 RTX51工作在

与中断功能相似的状态下 信号和信息可以通过邮箱系统在任务之间互相传递 你可以从一存

储池中分配和释放内存 你可以强迫一个任务等待中断 超时或者是从另一个任务或中断发出的

信号或信息

RTX51 Tiny:仅支持时间片轮转任务切换和使用信号进行任务切换 不支持抢先式的任务切换

不包括消息历程 没有存储器池分配程序

总结来说,Tiny就是RTX51 Full的精简版,只有基本的任务切换功能。

使用RTX51操作系统需要有以下要求:
1.keil C51 集成开发环境,其许可证版本必须为PK51,否则无法编译通过。
2. RTX51_Tiny需要占用 定时器0 、定时器0中断以及寄存器组0。用户程序不可再使用这些资源。

下面介绍STC15W系列单片机如何使用RTX51_Tiny操作系统:

1.首先将RTX51_Tiny的头文件和Lib库文件添加到工程,这两个文件在keil C51的安装目录下
把这两个文件拷贝到工程目录下,并在Keil中把这两个文件添加到工程。
2.keil配置选项里选择RTX51_Tiny操作系统
3.RTX51_Tiny 相关配置
由于RTX51_Tiny是基于时间片的操作系统,而且它没有优先级的概念,每个任务执行的时间是一定的,即当前任务的时间片达到时,会立即切换到其他就绪的任务,任务的时间片可以通过Conf_tny.A51文件的相关参数修改。
INT_CLOCK 是 RTX系统的1个滴答时钟的时间,此处定义为33177是指 1个系统滴答时钟=33177个单片机的机器周期,由于我的单片机时钟的33.1776Mhz,所以其一个机器周期为1/33.1776 ≈ 0.0301us,33177个机器周器就是 999.9us≈1ms。注意:此值最大为65536
TIMESHARING 是 一个时间片等于多少个RTX系统的滴答时钟,此处定义为10,即定义时间片为10ms。
4. 编写测试程序。
RTX51 Tiny 无需编写main函数,直接编写任务函数即可,且每个任务函数必须是死循环,不可以返回。这里编写了3个任务,任务0 负责初始化和创建任务1 和任务2,最后删除自身,不再执行。任务1和任务2 都是串口打印,这样可以使用串口工具,观察其运行情况。程序中需要包含 "RTX51TNY.h" 头文件,即RTX51 Tiny的系统函数头文件。
代码语言:javascript
代码运行次数:0
复制
#include "config.h"// 时钟 IO口配置头文件

#include "USART.h"
#include "stdio.h"
#include "RTX51TNY.h"   //包含系统头文件



void MainTask(void) _task_ 0  //任务0,首先进入这里
{
  UartInit();//串口初始化
  os_create_task (1);   //创建任务1、2
  os_create_task (2);    
  os_delete_task (0);   //挂起本任务0,不再运行本任务
}


void LEDTask(void)  _task_ 1  //任务1
{

  while(1) 
  { 
	printf("11111111111\r\n");	
  }
}

void UARTTask(void) _task_ 2 //任务2
{
  while(1)
  {
	printf("task task task \r\n");
  }
	
}
通过串口可以看出,这两个任务在交替运行:
5.系统延时函数的使用
代码语言:javascript
代码运行次数:0
复制
char os_wait(
unsigned char event_sel, /*要等待的事件*/
unsigned char ticks, /*要等待的滴答数*/
unsigned int dammy); /*无用参数*/
该函数挂起当前任务,并等待一个或几个事件,如时间间隔,超时,或从其它任务和中断发来的信号。参数 event_set 指定要等待的事件,可以是下面中事件的一些组合。
注意:其第二个参数ticks是以INT_CLOCK为基准的。

K_SIG

等待一个信号

K_TMO

等待超时

K_IVL

等待定时器滴答的间隔

K_SIG:是等待其他任务给本任务发生一个信号然后才开始执行本任务,如果一直没有收到这个信号,那么本任务将不会执行。
可以看出,任务2 一直没有被执行,因为它一直收不到信号。
K_TMO:等待产生超时信号,当信号产生后,只是将相应的任务置上就绪标志位,任务并不是立即就能够运行。任务需要等到其它任务轮流执行,到自己的时间片后才会执行。一个任务可以等待一个超时事件(Timeout),超时事件是一个非常普通的事件,就是一个简单的数,代表有多少个内核时钟滴答数。当一个任务在等待超时事件,那么其他的任务将继续运行。一旦需要等待的内核时钟滴答数已经耗尽,那么这个等待的任务则继续运行。 K_IVL:时间间隔事件(Interval)是超时事件的一个变种,两者之间的差别就在于时间间隔事件所要求的时钟滴答数和任务中上一次调用的内核函数 os_wait 有关。时间间隔事件通 常用来产生一个规则而且是同步运行的任务(例如:一秒钟运行一次的任务),而不管 任务运行和 os_wait 之间的时间是多长。如果所设定的时钟滴答数已经耗尽(时间是从 内核函数 os_wait 的上一次调用开始算起),任务将立即运行(在没有其他任务运行的 条件下)。
RTX51Tiny使用说明文档:https://sourceforge.net/projects/stc51/files/RTX51/RTX51-Tiny____.pdf/download
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • RTX51 是keil公司开发的一款实时操作系统,其有两个版本:1.Tiny 2.Full,区别如下:
  • 总结来说,Tiny就是RTX51 Full的精简版,只有基本的任务切换功能。
    • 使用RTX51操作系统需要有以下要求:
    • 1.keil C51 集成开发环境,其许可证版本必须为PK51,否则无法编译通过。
    • 2. RTX51_Tiny需要占用 定时器0 、定时器0中断以及寄存器组0。用户程序不可再使用这些资源。
  • 下面介绍STC15W系列单片机如何使用RTX51_Tiny操作系统:
    • 1.首先将RTX51_Tiny的头文件和Lib库文件添加到工程,这两个文件在keil C51的安装目录下
    • 把这两个文件拷贝到工程目录下,并在Keil中把这两个文件添加到工程。
    • 2.keil配置选项里选择RTX51_Tiny操作系统
    • 3.RTX51_Tiny 相关配置
    • 由于RTX51_Tiny是基于时间片的操作系统,而且它没有优先级的概念,每个任务执行的时间是一定的,即当前任务的时间片达到时,会立即切换到其他就绪的任务,任务的时间片可以通过Conf_tny.A51文件的相关参数修改。
    • INT_CLOCK 是 RTX系统的1个滴答时钟的时间,此处定义为33177是指 1个系统滴答时钟=33177个单片机的机器周期,由于我的单片机时钟的33.1776Mhz,所以其一个机器周期为1/33.1776 ≈ 0.0301us,33177个机器周器就是 999.9us≈1ms。注意:此值最大为65536
    • TIMESHARING 是 一个时间片等于多少个RTX系统的滴答时钟,此处定义为10,即定义时间片为10ms。
    • 4. 编写测试程序。
    • RTX51 Tiny 无需编写main函数,直接编写任务函数即可,且每个任务函数必须是死循环,不可以返回。这里编写了3个任务,任务0 负责初始化和创建任务1 和任务2,最后删除自身,不再执行。任务1和任务2 都是串口打印,这样可以使用串口工具,观察其运行情况。程序中需要包含 "RTX51TNY.h" 头文件,即RTX51 Tiny的系统函数头文件。
    • 通过串口可以看出,这两个任务在交替运行:
    • 5.系统延时函数的使用
    • 该函数挂起当前任务,并等待一个或几个事件,如时间间隔,超时,或从其它任务和中断发来的信号。参数 event_set 指定要等待的事件,可以是下面中事件的一些组合。
    • 注意:其第二个参数ticks是以INT_CLOCK为基准的。
    • K_SIG:是等待其他任务给本任务发生一个信号然后才开始执行本任务,如果一直没有收到这个信号,那么本任务将不会执行。
    • 可以看出,任务2 一直没有被执行,因为它一直收不到信号。
    • K_TMO:等待产生超时信号,当信号产生后,只是将相应的任务置上就绪标志位,任务并不是立即就能够运行。任务需要等到其它任务轮流执行,到自己的时间片后才会执行。一个任务可以等待一个超时事件(Timeout),超时事件是一个非常普通的事件,就是一个简单的数,代表有多少个内核时钟滴答数。当一个任务在等待超时事件,那么其他的任务将继续运行。一旦需要等待的内核时钟滴答数已经耗尽,那么这个等待的任务则继续运行。 K_IVL:时间间隔事件(Interval)是超时事件的一个变种,两者之间的差别就在于时间间隔事件所要求的时钟滴答数和任务中上一次调用的内核函数 os_wait 有关。时间间隔事件通 常用来产生一个规则而且是同步运行的任务(例如:一秒钟运行一次的任务),而不管 任务运行和 os_wait 之间的时间是多长。如果所设定的时钟滴答数已经耗尽(时间是从 内核函数 os_wait 的上一次调用开始算起),任务将立即运行(在没有其他任务运行的 条件下)。
    • RTX51Tiny使用说明文档:https://sourceforge.net/projects/stc51/files/RTX51/RTX51-Tiny____.pdf/download
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档