STC设计与RTX51--RTX51操作系统

知不足而奋进 望远山而前行


目录

文章目录

前言

内容

操作系统

我们认知的操作系统

最小的操作系统

RTX51系统

RTX51 Real-Time Kernel

RTX51 Tiny环境搭建

库函数与RTX51

RTX51的延时问题

K_TMO与K_IVL的区别

K_SIG信号等待

总结


前言

  • 理解操作系统功能
  • 学会使用RTX51操作系统

内容

操作系统

我们认知的操作系统

我们认知的操作系统更多的是通过PC机或者手机来进行理解的,例如Window系统,Android系统。

由于这些商业系统属于高度集成化后的产物,我们会发现操作系统这个概念很复杂、很宽泛,无法理解和去实现。

目前大家已知的操作系统功能大致如下:

  1. 进程管理:管理程序的执行,包括进程的创建、终止、调度和通信等。
  2. 内存管理:负责管理内存的分配和回收,保证每个程序都能获得足够的内存空间。
  3. 文件系统管理:为应用程序提供文件的读写和管理功能,包括文件的创建、打开、关闭、删除等。
  4. 设备管理:管理计算机系统中的各种设备,包括输入输出设备、网络设备、存储设备等。
  5. 安全管理:保护系统的安全性,防止病毒、黑客等对系统进行攻击和破坏。
  6. 用户界面:提供用户与计算机系统进行交互的方式,包括图形用户界面和命令行界面等。
  7. 网络通信:管理计算机系统的网络通信,包括数据传输、协议处理、连接管理等。
  8. 错误处理:监测和处理各种错误和异常情况,保证系统的稳定性和可靠性。

操作系统是计算机系统中的核心软件,为用户和应用程序提供各种服务和支持,使得计算机系统能够高效、稳定地运行。

以上是我们认知中的商业操作系统的功能概述,每一块单独拿出来,都是一个复杂的内容,而且这些最终这些还要集合到一起去。

最小的操作系统

其实操作系统的复杂程度和硬件功能的集成度相关,内存、存储、CPU性能、是否有网络设备、是否有输入输出设备等等这些条件。

由于集成度不同,通用性也就不同,但是作为一个操作系统,必然会提供以下功能:

  • 任务管理
  • 任务调度
  • 任务间通信

所有操作系统必须提供这三种特定功能,有的只是叫法不同。

任务管理、任务调度和任务通讯是单片机最小操作系统中的核心功能,下面分别介绍一下:

  1. 任务管理:最小操作系统通常支持多任务,任务管理就是对多任务的管理。它包括任务的创建、销毁和切换。任务创建时需要分配任务所需要的资源,例如堆栈、全局变量等;任务销毁时需要释放这些资源。任务切换时需要保存任务的上下文并切换到下一个任务的上下文。
  2. 任务调度:任务调度是指按照一定的规则从就绪队列中选择一个任务并将处理器分配给它执行。最小操作系统通常采用时间片轮转的方式进行任务调度,每个任务被分配一个时间片,当时间片用完后,处理器被分配给下一个任务。
  3. 任务通讯:任务通讯是指多个任务之间进行信息交换。最小操作系统中通常采用消息队列的方式进行任务通讯,一个任务发送消息,另一个任务接收消息。任务通讯还可以采用信号量、邮箱等方式实现。

需要注意的是,最小操作系统的功能非常简单,只能满足一些基本的需求,例如任务管理、任务调度和任务通讯。如果需要更加复杂的功能,例如文件系统、网络协议栈等,则需要使用更加完善的操作系统。

RTX51系统

RTX51是Keil公司推出的用于8051系列单片机的实时操作系统(RTOS)。它提供了任务管理、任务调度、任务通讯、定时器、信号量、邮箱等实时操作系统的基本功能,并且与Keil公司的C51编译器紧密集成,能够方便地进行开发和调试。

RTX51支持多任务并发执行,通过任务管理器实现任务的创建、删除、挂起、恢复、优先级调整等功能。任务调度器能够根据任务的优先级、时间片轮转等算法进行任务调度,保证系统中各个任务都能得到适当的执行机会。任务通讯机制包括消息队列、信号量、邮箱等,能够方便地实现任务之间的数据共享和同步。

除了任务管理、任务调度、任务通讯等基本功能之外,RTX51还提供了定时器、中断服务程序等功能,能够方便地实现定时器、PWM、ADC等应用。同时,RTX51还提供了对Flash和EEPROM的编程支持,能够方便地实现在线升级等功能。

总之,RTX51是一款成熟、可靠、易用的实时操作系统,能够大大简化单片机的开发过程,提高开发效率和可靠性。

RTX51 包含两个版本:

  • RTX51 Tiny
  • RTX51 Full

RTX51 Tiny是一个非常小型的实时操作系统,具有基本的任务调度功能,包括任务优先级和时间片轮转等。RTX51 Tiny适用于基于51系列单片机的应用程序,特别是对于小型和简单的应用程序,因为它不需要太多的RAM和ROM资源。

注意:

RTX51采用的是Timer0实现的任务切换,因此不可以使用timer0,包括其中断函数也不可以声明!

否则系统不可用!

RTX51 Full则是一个功能更为强大的实时操作系统,它不仅支持基本的任务调度功能,还提供了更多的RTOS特性,例如信号量、邮箱、消息队列、事件标志和互斥量等,使得它更加适合于需要更高级RTOS特性的应用程序。

RTX51 Tiny是一个轻量级的RTOS,适用于简单的应用程序,而RTX51 Full则提供了更多的RTOS特性,适用于更为复杂的应用程序。

RTX51 Real-Time Kernel

RTX51 is a real-time kernel for the 8051 family of microcontrollers that is designed to solve two problems common to embedded programs.

  1. Multitasking: several operations must execute simultaneously.
  2. Real-time control: operations must execute within a defined period of time.

RTX51 Tiny环境搭建

  1. 新建一个项目
  2. 打开keil安装目录,来到C51\RtxTiny2\SourceCode目录,拷贝Conf_tny.A51RTX51TNY.LIB到项目中。

  1. 在项目中添加一个Group,名称自己定义,我们在这里定义为OS,将添加的两个文件加入到group中

  1. 打开配置,来到Target中,将Operating system修改为RTX-51 Tny

  1. 新建好main.c, 代码如下
#include "RTX51TNY.H"
#include "STC8H.H"

// P5.3 闪烁
void sys_init() {
	P5M1 &= ~0x08; P5M0 &= ~0x08;
}

// 这里函数名可随意, 建议不要使用start, 会和I2C.h里的Start冲突
void main_start() _task_ 0 {
	sys_init();
	// 创建任务 1
	os_create_task(1);
	// 结束任务 0
	os_delete_task(0);
}

void task_0() _task_ 1 {
	while(1) {
		P53 = 1;
		os_wait1(K_TMO);
		
		P53 = 0;
		os_wait1(K_TMO);
	}
}
  • 不再有main函数
  • 代码入口为标记为 _task_ 0的函数。
  • _task_标记的函数,表示这个是独立的任务,多个task可以同时执行。

库函数与RTX51

开发过程中,会将库函数环境和OS环境进行整合,整合的过程需要用到两者特性,并且不产生冲突。

  1. 新建项目
  2. 在项目目录中新建User目录、Lib目录、OS目录。
  • User目录存放main.c等和业务相关的文件
  • Lib目录存放库函数目录
  • OS目录存放操作系统文件
  • Driver目录存放硬件驱动
  1. 在项目中添加Group,依次对应新建的几个目录,将对应的文件加入到各自的group中。
  2. keil中配置include path,将以上几个目录配置进去。
  3. 修改config.h文件,内容如下:

#ifndef		__CONFIG_H
#define		__CONFIG_H

//========================================================================
//                               主时钟定义
//========================================================================

#define MAIN_Fosc		24000000L	//定义主时钟
//#define MAIN_Fosc		22118400L	//定义主时钟
//#define MAIN_Fosc		12000000L	//定义主时钟
//#define MAIN_Fosc		11059200L	//定义主时钟
//#define MAIN_Fosc		 5529600L	//定义主时钟

#define	NULL	0

//========================================================================
//                                头文件
//========================================================================

#include "STC8H.H"
#include "RTX51TNY.H"
#include <intrins.h>
#include <stdlib.h>
#include <stdio.h>

//========================================================================
//                               类型定义
//========================================================================

typedef unsigned char   u8;     //  8 bits 
typedef unsigned int    u16;    // 16 bits 
typedef unsigned long   u32;    // 32 bits 

typedef signed char     int8;   //  8 bits 
typedef signed int      int16;  // 16 bits 
typedef signed long     int32;  // 32 bits 

typedef unsigned char   uint8;  //  8 bits 
typedef unsigned int    uint16; // 16 bits 
typedef unsigned long   uint32; // 32 bits 

//===================================================

#define	TRUE	1
#define	FALSE	0

//===================================================

#define	Priority_0			0	//中断优先级为 0 级(最低级)
#define	Priority_1			1	//中断优先级为 1 级(较低级)
#define	Priority_2			2	//中断优先级为 2 级(较高级)
#define	Priority_3			3	//中断优先级为 3 级(最高级)

#define ENABLE		1
#define DISABLE		0

#define SUCCESS		0
#define FAIL		-1


//===================================================

#define	I2C_Mode_Master			1
#define	I2C_Mode_Slave			0

#define	PIE			0x20	//1: 比较结果由0变1, 产生上升沿中断
#define	NIE			0x10	//1: 比较结果由1变0, 产生下降沿中断

#define	PWMA	128
#define	PWMB	129

#define	FALLING_EDGE		1		//产生下降沿中断
#define	RISING_EDGE			2		//产生上升沿中断
//===================================================


//========================================================================
//                             外部函数和变量声明
//========================================================================

#endif
    • include加入OS的支持

RTX51的延时问题

示例代码

#include "config.h"
#include "GPIO.h"
#include <stdio.h>
#include "delay.h"

#define LED_SW		P45
#define LED1			P27
#define LED2			P26

void GPIO_config(void) {
    GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
    GPIO_InitStructure.Pin  = GPIO_Pin_5;		//指定要初始化的IO,
    GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P4, &GPIO_InitStructure);//初始化

    GPIO_InitStructure.Pin  = GPIO_Pin_7;		//指定要初始化的IO,
    GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P2, &GPIO_InitStructure);//初始化

    GPIO_InitStructure.Pin  = GPIO_Pin_3;		//指定要初始化的IO,
    GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P5, &GPIO_InitStructure);//初始化
}

void sys_init() {
    GPIO_config();
    EA = 1;
}

// 这里函数名可随意, 建议不要使用start, 会和I2C.h里的Start冲突
void main_start() _task_ 0 {
    sys_init();
		LED_SW = 0;

    // 创建任务 1
    os_create_task(1);
    // 创建任务 2
    os_create_task(2);

    // 结束任务 0
    os_delete_task(0);
}

void task_1() _task_ 1 {
    P53 = 1;
    while(1) {
        P53 = !P53;
        //os_wait2(K_TMO, 200);
		delay_ms(250);
        delay_ms(250);
        delay_ms(250);
        delay_ms(250);
    }
}

void task_2() _task_ 2 {
    LED1 = 0;
    while(1) {
        LED1 = !LED1;
        os_wait2(K_TMO, 200);
    }
}

两个任务,一个延时会卡住cpu执行,一个不会。

我们可以适当调节延时时间,通过逻辑分析仪来分析。delay的延时会影响到系统的延时。

我们在非必要的情况下,尽量少使用卡住cpu的延时操作。或者在任务执行过程中,任务中的延时要求不需要那么高。否则两者会影响。

K_TMO与K_IVL的区别

  调用os_wait() / os_wait2()指定K_TMO / K_IVL参数都能让任务进入waiting状态,然后等待一段时间后恢复到ready状态,K_TMOK_IVl的区别如下:

  1、计算的起点:K_TMO是以当前调用wait / wait2的时间为起点,K_IVL是以上一次任务结束为起点。

  2、是否包含任务本身执行时间:K_TMO不包含,K_IVl包含。

  通过一个时序图说明情况,如下图,有3个任务,分别是task_0/1/2,假设3个任务的自身执行时间1ms

    • task_0没有调用任何阻塞API。
    • task_1使用K_TMO参数等待3ms超时。
    • task_2使用K_IVL等待3ms间隔。

  并假设调度器先按照task_0、task_1、task_2的顺序调度任务:

task_0先执行1ms,SysTick=1

task_1执行1ms,然后等待3ms超时,SysTick=2

task_2执行1ms,然后等待3ms间隔,SysTick=3

task_0执行2ms,此时只有task_0可执行,故连续执行2ms,SysTick=5

task_2执行1ms,注意,由于K_IVL包含任务自身执行时间,离上一次task_2结束已经过去2ms,所以接下来要执行task_2,SysTick=6

task_1执行1ms,task_1等待的时间已经到了并且超时,所以执行task_1,SysTick=7

task_0执行1ms,SysTick=8

task_2执行1ms,离上一次task_2结束已经过去2ms,接下来执行task_2,SysTick=9

……

  能够观察到,K_TMO是超时的意思,它能够保证一定会等到足够的时间,但是不一定准确,时间轴上可能是不连续的,比如上图而言,task_1只在SysTick=11的时候准确等待了3ms,而前面SysTick=6的时候等待了4ms。

  K_IVL保证间隔的时间是准确的,在时间轴上是连续的。对于code = x(ms),wait() / wait2() = y(ms),调用API后,K_TMO将在 >=(x+y) 的时间执行完成,K_IVL将在 y 时间执行完成。

官网文档:Documentation – Arm Developer

K_SIG信号等待

通过os_wait实现信号等待

void task_2() _task_ 2 {
	while(1) {
		printf("task 2 start wait\r\n");
		os_wait1(K_SIG);
		printf("task 2 end wait\r\n");
	}
}

以上是一个任务在执行,通过os_wait1(K_SIG)进行信号等待,直到有信号来才能执行下一句。

我们可以通过在一些事件中来发送信号:

os_send_signal(2);


总结

  • 如果想从现在起等待一段时间,用K_TMO
  • 如果想做周期性动作,用K_IVL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/678747.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker搭建redis-cluster集群

1. 前期准备 1.1 拉redis镜像 docker search redis docker pull redis1. 2 创建网卡 docker network create myredis --subnet 172.28.0.0/16#查看创建的网卡 docker network inspect myredisdocker network rm myredis #删除网卡命令 多个中间 空格隔开 docker network --h…

排序数组 ---- 分治-快排

题目链接 题目: 分析: 回顾一下快速排序, 快速排序的思想就是找一个基准值key, 按照基准值, 将数组分成两块, 分别是<key和>key的区域,然后继续对这两个区域划分, 那么快速排序的时间复杂度是O(N*logN), 但是如果数组中有许多相同的元素, 如果我们选定的基准值就有相同…

补上缺失的一环----一种数据库系统主动对外推送表的增删改实时变动数据的实践

在实践中&#xff0c;一些应用程序或模块需要实时获取某些数据库表的增删改变动数据。 对此需求&#xff0c;常见的方案有: 1、应用程序通过轮循查询数据库方式获取数据库表的增删改变动数据. 2、应用程序在把数据写入数据库表之前&#xff0c;通过事件方式向外通知数据库表的增…

【HarmonyOS】应用振动效果实现

一、问题背景&#xff1a; 应用在强提醒场景下&#xff0c;一般会有马达振动的效果&#xff0c;提示用户注意力的关注。 比如消息提醒&#xff0c;扫码提示&#xff0c;删除键确认提示等。 针对高定制化或者固定的振动方式&#xff0c;我们需要有不同的方案实现&#xff0c;马…

【已解决】c++ QT继承基类界面页面丢失问题

本博文源于自己在工位上遇到的一个问题&#xff0c;这个问题不只犯了一次了。首先我继承CBaseDialog里的一个标题栏&#xff0c;结果发现&#xff0c;界面本来想这样结果变成这样&#xff1a; 结果变成这个样子&#xff1a; 问题原因 在于ui.setupUi这个层面&#xff0c;错…

C语言王国——字符函数和字符串函数(2)

目录 5 strtok函数 5.1 函数的表达式 5.2 函数模拟 6 strstr函数 6.1 函数表达式 7 strerror函数 7.1 函数表达式 7.2 例子 7.3 perror 8 strncpy、strncat、strncmp函数 四 结论 5 strtok函数 strtok函数我的理解是他是一个分割字符串的函数 5.1 函数的表达式 cha…

光伏无人机踏勘需要使用哪些设备?用到哪些原理?

随着全球能源结构的转型和绿色能源的大力推广&#xff0c;光伏电站的建设和运维正成为能源领域的热点。然而&#xff0c;光伏电站的选址、建设和后期运维过程中&#xff0c;往往面临着地形复杂、设备分散、巡检难度大等挑战。在这一背景下&#xff0c;无人机踏勘技术以其独特的…

最新 Navicat Data Modeler 4 | 产品介绍

在过去的几周里&#xff0c;我们已经介绍了 Navicat 版本 17&#xff0c;现在我们来把注意力转移到另外两个值得关注的产品上&#xff0c;即 Navicat Data Modeler 和 Navicat BI&#xff08;之前称为 Navicat Chart Creator&#xff09;。今天的博客将介绍 Navicat Data Model…

draw.io 如何设置图形圆角?

draw.io 如何设置图形圆角呢&#xff1f; draw.io 是一款强大的&#xff0c;免费的开源工具&#xff0c;我经常用它来画流程图&#xff0c;但是我发现 draw.io 对于图形圆角的设置&#xff0c;只提供了一个设置选项&#xff0c;如下图&#xff1a; 当你选中某个图形&#xff0…

go语言进阶 init() 函数

go 语言包 在一个项目中通常我们需要引入第三方包&#xff0c;我们来看下 当我们导入一个包的时候 发生了什么&#xff1a; 首先我们先详细介绍下两个函数&#xff1a; init(), main() 是 go 语言中的保留函数。我们可以在源码中 定义 init()函数&#xff0c; 此函数会在包导入…

谷粒商城实战(031 业务-秒杀功能2)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第315p-第p318的内容 秒杀上架 定时上架功能 EnableAsync 异步 EnableScheduling 定时调度 Configuration 配置类 创建上架定时任务类和方法 …

抖店商家疑惑,自然流量突然下滑,为什么呢?

大家好&#xff0c;我是喷火龙。 很多的抖店商家会遇到一种情况&#xff0c;那就是自己店铺的流量好好的&#xff0c;不知道怎么的就突然没流量了&#xff0c;各方面的数据都断崖式的下降。 为什么会这样呢&#xff1f;原因有以下几点&#xff0c;大家可以检查一下&#xff0…

Typora配置自动上传图片到图床

Typora配置自动上传图片到图床 在多平台发布文章时&#xff0c;如果遇到图片不能导入的问题&#xff0c;推荐使用图床&#xff01;推荐使用阿里云或腾讯云&#xff0c;免费的不用考虑了&#xff01; PicGo下载 链接&#xff1a;夸克网盘分享 使用手册&#xff1a; PicGo is…

《python开发》cannot allocate memory in static TLS block-报错问题解决

阿丹&#xff1a; 今天在配置跑rasa训练的时候出现问题&#xff0c;找了国内论坛有解决的人&#xff0c;但是说的不明白。查阅了很多论坛之后发现了解决的方案。 https://github.com/keras-team/keras-tuner/issues/317 问题描述以及错误&#xff1a; 关键错误 &#xff1a;c…

升级最新版openssh-9.7p1及openssl-1.1.1h详细步骤及常见问题总结

近期因为openssh相继被漏洞扫描工具扫出存在漏洞&#xff0c;所以考虑升级操作系统中的openssh和openssl为最新版本&#xff0c;来避免漏洞风险。期间的升级过程及遇到的疑难问题&#xff0c;特此记录下来&#xff0c;供有需要的人参考。 本次目标是升级 openssh 为 9.7p1 版本…

ios v品会 api-sign算法

vip品会 api-sign算法还原 ios入门案例 视频系列 IOS逆向合集-前言哔哩哔哩bilibili 一、ios难度与安卓对比 这里直接复制 杨如画大佬的文章的内容&#xff1a; ios难度与安卓对比 很多人说ios逆向比安卓简单&#xff0c;有以下几个原因 1 首先就是闭源&#xff0c;安卓开源…

UIScrollView代理

场景&#xff1a; 想要监控某组件&#xff0c;可以通过addTarget&#xff0c;但是复杂一点的&#xff0c;如UIScrollView的滚动监听就需要通过代理来实现了。代理本质是官方定义好的协议&#xff08;接口&#xff09;&#xff0c;你只要用官方给出的API接口&#xff0c;就能实…

osg库的下载和安装

下载 下载地址:https://github.com/openscenegraph/OpenSceneGraph 安装 打开Cmake.exe,将上述下载的osg文件下的CMakeLists.txt文件拖入Cmake界面中。 在其路径下新建一个build文件 并配置cmake,点击Configure 修改如下几个选项 ACTUAL_3RDPARTY_DIR BUILD_OSG_EXAM…

Open vSwitch 数据包转发

一、数据包转发流程 Open vSwitch 数据包转发流程如下图所示&#xff0c;其中红色数字序号表示数据包转发的步骤顺序。 以下步骤为一个数据包通过 OVS 时的首次处理流程&#xff1a;&#xff08;步骤序号和图中序号一一对应&#xff09; OVS 从设备接口中获取数据包并交…

GitHub狂揽6700 Star,Python进阶必备的案例、技巧与工程实践

当下是 Python 急剧发展的时代&#xff0c;越来越多的人开始学习和使用Pyhon&#xff0c;而大家也遇到了各种问题。这份手册清晰、细致地介绍了 Python 代码应该遵循的编程风格&#xff0c;并解释了背后的原理和机制。 入门 Python 语言相对简单&#xff0c;但写出优雅的代码并…