RTX51Tiny 学习笔记(三)

系统运行机制

  • RTX51 Tiny使用和管理目标系统的资源。 可以在项目的基础上逐个配置RTX51 Tiny的许多方面。

1.定时器滴答中断(Timer Tick Interrupt)

RTX51 Tiny使用标准8051定时器0(模式1)产生周期性中断。 此中断是RTX51 Tiny Timer Tick,为RTX51 Tiny库例程指定的超时和间隔值使用RTX51 Tiny Timer Tick进行测量。
默认情况下,RTX51 Timer Tick中断每10,000个机器周期发生一次。 因此,对于以12MHz运行的标准8051,定时器滴答的周期为0.01秒或频率100Hz(12MHZ / 12 / 10,000)。 可以在CONF_TNY.A51配置文件中更改该值。
注:您可以将自己的代码附加到RTX51定时器滴答中断。 有关更多信息,请参阅CONF_TNY.A51配置文件。有关RTX51 Tiny如何使用中断系统的详细信息,请参阅概述中的中断讨论。

2.任务(Tasks)

RTX51 Tiny基本上是一个任务切换器。 要创建RTX51 Tiny程序,必须创建具有一个或多个任务功能的应用程序。 以下详细信息将帮助您快速了解RTX51。
使用Keil C51编译器支持的新关键字在C编程语言中定义任务。
RTX51 Tiny将每个任务保持在一个状态(运行就绪等待删除超时)。
一次只能有一个任务处于运行状态。许多任务可能处于“就绪”,“等待”,“已删除”或“超时”状态。如果所有已定义的任务都被阻止,则空闲任务始终可以运行。

3.任务管理(Task Management)
每个RTX51 Tiny任务总是处于一个状态,告知任务的处置。
在这里插入图片描述
4.事件(Events)

实时操作系统中的事件可用于控制程序中任务的执行。 任务可以等待事件或者可以为其他任务设置事件标志,os_wait函数允许任务等待一个或多个事件。

4.0.超时(timeout)是任务可以等待的常见事件。超时只是一些时钟滴答。当任务等待超时时,可以执行其他任务。一旦经过指定数量的计时器滴答,任务可以继续执行。
4.1.间隔(interval)是超时的变体。间隔就像一个超时,除了指定的时钟周期数相对于任务调用os_wait函数的最后一次。 Interval可用于生成一个任务,该任务以常规的同步调度(例如每秒一次)运行,无论任务在调用os_wait函数之间花费多长时间。如果已经过了指定的时钟周期数(自上次调用os_wait函数以来),则立即重新启动任务 - 不执行任何其他任务。
4.2.信号(singal)是一种简单的任务间通信形式。任务可以等待另一个任务向其发送信号(使用os_send_signalisr_send_signal函数)。
4.3.每个任务都有一个Ready标志,可以由其他任务设置(使用os_set_readyisr_set_ready函数)。可以通过设置其就绪标志来启动等待超时,间隔或信号的任务。

每个事件都有一个RTX51 Tiny维护的相关事件标志。 以下事件选择器可与os_wait函数一起使用,以指定要等待的内容:
在这里插入图片描述os_wait函数返回时,发生的事件由返回值指定:
在这里插入图片描述
os_wait函数可能会等待以下事件组合:
K_SIG | K_TMOos_wait延迟任务,直到向其发送信号或直到指定的时钟周期数已经过去。
K_SIG | K_IVLos_wait延迟任务,直到向其发送信号或直到指定的间隔已经过去。 在这种情况下,您必须使用函数os_reset_interval来消除计时器延迟问题。

5.任务调度器(Task Scheduler)

RTX51 Tiny调度器根据以下规则确定要运行的任务:

当前任务被中断:
==.该任务调用os_switch_task,另一个任务准备好运行。
==.该任务调用os_wait函数并且未发生指定的事件。
==.任务执行的时间超过定义的轮转时间片。

另一项任务若被启动:

  • 1.没有其他任务正在运行。
  • 2.要启动的任务处于READY状态或TIME-OUT状态。

6.轮转任务切换

RTX51 Tiny可以配置为使用轮转多任务RRMT(或任务切换)。 RR允许准并行执行多个任务。任务并不是真正同时执行,而是时间分片(可用的CPU时间分为时间片,RTX51 Tiny为每个任务分配一个时间片)。由于时间片很短(只有几毫秒),因此似乎任务同时执行。

任务在其时间片的持续时间内执行(除非放弃任务的时间片)。然后,RTX51 Tiny切换到准备运行的下一个任务。时间片的持续时间可以由RTX51 Tiny配置定义。

以下示例显示了一个使用RRMT的简单RTX51 Tiny程序。该程序中的两个任务是计数器循环。
RTX51 Tiny开始执行任务0,即名为job0的函数。此函数创建另一个名为job1的任务。在job0执行其时间片后,RTX51 Tiny切换到job1。在job1执行其时间片后,RTX51 Tiny切换回job0。这个过程无限期地重复。

#include <rtx51tny.h>

int counter0;
int counter1;

void job0(void) _task_0 
{
  os_create (1);    // mark task 1 as ready 
  while (1) 
  {   
		
    counter0++; /* update the counter */
  }
}

void job1 (void) _task_1 
{
  while (1)
	{   
    counter1++; /* update the counter */
  }
}

备注:
您可以使用os_wait函数或os_switch_task函数来允许RTX51 Tiny切换到另一个任务,而不是等待任务的时间片到期。 os_wait函数挂起当前任务(将其更改为WAITING状态),直到指定的事件发生(并且任务更改为READY状态)。 在此期间,可能会运行任意数量的其他任务。
7.协同任务切换

如果禁用轮转多任务,则必须设计并实现任务,以便它们协同工作。 具体来说,您必须在每个任务中的某处调用os_wait函数或os_switch_task函数。 这些功能指示RTX51 Tiny切换到另一个任务。

os_wait和os_switch_task之间的区别在于os_wait允许您的任务等待事件,
而os_switch_task立即切换到另一个就绪任务。

8.空闲任务
讨论RTX51 Tiny空闲任务。
当没有任何任务准备好运行时,RTX51 Tiny执行空闲任务。 空闲任务只是一个无限循环。

例如:SJMP $

一些8051兼容设备提供空闲模式,通过暂停程序执行直到发生中断来降低功耗。 在这种模式下,所有外设都包括中断系统仍然继续运行。

RTX51 Tiny允许您在空闲任务中启动空闲模式(当没有其他任务准备好执行时)。
当RTX51 Tiny Timer Tick中断(或任何其他中断)发生时,微控制器恢复程序执行。 可以在CONF_TNY.A51配置文件中启用和配置空闲任务执行的代码。

9.堆栈管理

RTX51 Tiny仅使用8051的内部存储器(IDATA)为每个任务维护一个堆栈。
当一个任务运行时,它被赋予了最大的堆栈空间。 发生任务切换时,前一个任务堆栈将收缩并重新定位,并且当前任务的堆栈将展开并重新定位。

下图说明了具有三个单独任务的示例应用程序的内部存储器布局
在这里插入图片描述
?STACK符号表示堆栈的起始地址。
在此示例中,位于堆栈下方的对象包括全局变量,寄存器和位可寻址存储器。
剩余的内存用于任务堆栈。 可以在配置中指定内存的顶部。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值