RTX51 Tiny的原理

RTX51 Tiny的原理,第1张

RTX51 Tiny 用于管理目标系统的资源,本章讨论RTX51 Tiny如何使用这些资源。 RTX51 Tiny 用标准8051的定时器0(模式1)生产一个周期性的中断。该中断就是RTX51 Tiny的定时滴答(Timer Tick)。库函数中的超时和时间间隔就是基于该定时滴答来测量的。

默认情况下,RTX51每10000个机器周期产生一个滴答中断,因此,对于运行于12MHZ的标准8051来说,滴答的周期是0.01秒,也即频率是100HZ(12MHz/12/10000)。该值可以在CONF_TNY.A51配置文件中修改。碧姿尘

附注:

l可以在RTX51的定时滴答中断里追加自己的代码。参见CONF_TNY.A51 配置文件。

l关于RTX51 Tiny如何使用中断可以参考概述中中断一节的叙述。 RTX51 Tiny本质上是一个任务切换器,建立一个RTX51 Tiny程序,就

是建立一个或多个任务函数的应用程序。下面的信息可以帮助你快速的理解

RTX51 。

l任务用新的关键字由C语言定义,该关键字是Keic C51 所支持的。

lRTX51 Tiny维护每个任务的正确状态(运行、就绪、等待、删除、超时)。

l某个时刻只有一个任务处于运行态。

l任务可能处于就绪态、等待态、删除态或超时态。

l空闲任务(Idle_Task)总是处于就绪态,当定义的所有任务处于阻 塞状态时,运行该任务。 每个RTX51 Tiny 任务总是处于下述状态中的一种状态中。 状态 描 述 运行 正在运行的任务处于运行态。某个时刻只能有一个任务处于该状态。

os_running_task_id 函数返回当前正在运行的任务编号。 就绪 准备运行的任务悔禅处于就绪态。一旦运行的任务完成了处理,RTX51 Tiny选择一个就绪的任务执行。一个任务可以通过用os_set_ready或os_set_ready函数设置就绪标志来使其立即就绪(即便该任务正在等待超时或信号)。 等待 正在等待一个事件的任务处于等待态。一旦事件发生,任务切换到就绪态。Os_wait函数用于将一个任务置为等待态。 删除 没有被启动或已被删除的任务处于删除态。Os-delete-task函数将一个已经启动(用os_create_task)的任务置为删除态。 超时 被超时册旦循环中断的任务处于超时态,在循环任务程序中,该状态相当于就绪态。 在实时 *** 作系统中,事件可用于控制任务的执行,一个任务可能等待一个事件,也可能向其他任务发送任务标志。

os_wait函数可以使一个任务等待一个或多个事件。

l超时是一个任务可以等待的公共事件。超时就是一些时钟滴答数, 当一个任务等待超时时,其他任务可以执行。一旦到达指定数量的滴答数,任务就可以继续执行。

l时间间隔(Interval)是一个超时(Timeout)的变种。时间间隔与超

时类似,不同的是时间间隔是相对于任务上次调用os_wait函数的指定数量的时钟滴答数。

l信号是任务间通信的方式。一个任务可以等待其他任务给它发信号(用os_send_signal和isr_send_signal函数)。

l每个任务都有一个可被其它任务设置的就绪标志(用os_set_ready和

isr_set_ready函数)。一个个等待超时、时间间隔或信号的任务可以通过设置它的就绪标志来启动。

lisr_set_ready函数)。一个等待超时、时间间隔或信号的任务可以通 过设置它的就绪标志来启动。

下表是os_wait函数等待的事件: K_IVL 等待制定的时间 隔K_SIG 等待一个信号 K_TMO 等待指定的超时 os-wait返回时,返回值表明发生了的事件: 返回值 意 义 RDY_EVENT 任务的就绪标志被置位 SIG_EVENT 收到一个信号 TMO_EVENT 超时完成或时间间隔到达。 os_wait可以等待下面的事件组合:

lK_SIG︱K_TMO:任务延迟直到有信号发给它或者指定数量的时钟滴答

到达。

lK_SIG︱K_IVL:任务延迟直到有信号到来或者指定的时间间隔到达。

附注:

lK_IVL和K_TMO事件不能组合 任务调度程序给任务分配处理器,RTX51 Tiny调度程序用下列规则确定

哪个任务要被运行:

当前任务被中断如果:

1、任务调用了os_switch_task且另一个任务正准备运行。

2、任务调用了os_wait且指定的事件没有发生。

3、任务执行了比轮转时间片更长的时间。

另一个任务启动如果:

1、无其它任务运行。

2、要启动的任务处于就绪态或超时态。 RTX51 Tiny可以配置为用循环法进行多任务处理(任务切换)。循环法允许

并行的执行若干任务。任务并非真的同时执行,而是分时间片执行的(CPU时间分

成时间片,RTX51 Tiny给每个任务分配一个时间片)。由于时间片很短(几毫秒),

看起来好象任务在同时执行。

任务在它的时间片内持续执行(除非任务的时间片用完)。然后,RTX51 Tin

g切换到下一个就绪的任务运运行。时间片的持续时间可以通过RTX51 Ting配置

定义。

下面是一个RTX51 Tiny程序的例子,用循环法多任务处理,程序中的两个任务

是计数器循环。RTX51 Tiny在启动时执行函数名为job0的任务0,该函数建立了另

一个任务job1,在job0执行完它的时间片后, RTX51 Tiny切换到job1。在job1执

行完它的时间片后,RTX51 Ting又切换到job0,该过程无限重复。

#include

int counter0

int counter1

void job0(void) _task_ 0

os_create(1) /*标记任务1为就绪*/

while(1)

﹛ /*无限循环*/

counter0++ /*更新记数器*/

}

}

void job1(void) _task_1

while(1)

﹛/*无限循环*/

counter++ /*更新记数器*/

}

}

附注:

l可以用os_wait 或os_switch_task让RTX51 Tiny切换到另一个任务而不是

等待任务的时间片用完。 os_wait函数挂起当前的任务(使之变为等待态)直

到指定的事件发生(接着任务变为就绪态)。在此期间,任意数量的其他任务

可以运行。 如果禁止了循环任务处理,就必须让任务以协作的方式运作,在每个任务

里调用os_wait或os_switch_task,以通知RTX51 Tingy切换到另一个任务。

os_wait与os_switch_task的不同是,os_wait是让任务等待一个事件,而

os_switch_task是立即切换到另一个就绪的任务。 没有任务准备运行时,RTX51 Ting执行一个空闲任务。空闲任务就是一个

无限循环。如:

SJMP$

有些8051兼容的芯片提供一种降低功耗的空闲模式,该模式停止程序的执

行,直到有中断产生。在该模式下,所有的外设包括中断系统仍在运行。

RTX51 Tiny允许在空闲任务中启动空闲模式(在没有任务准备执行时)。当

RTX51 Tiny的定时滴答中断(或其它中断)产生时,微控制器恢复程序的执行。

空闲任务执行的代码在CONF_TNY.A51配置文件中允许和配置。 RTX51 Tiny为每个任务在8051的内部RAM区(IDATA)维护一个栈。任务

运行时,将得到可能得到的最大数量的栈空间。任务切换时,先前的任务栈被

压缩并重置,当前任务的栈被扩展和重置。

下图表明一个三任务应用的内部存储器的布局。

图略…… :-)

?STACK表示栈的起始地址。该例中,位于栈下方的对象包括全局变量、寄存器和位寻址存储器,剩余的存储器用于任务栈。存储器的顶部可在配置中指定

你这个版本没破解完全 ,另陆碧外你注意下在项目target1上面右键options第二个早键举选亮稿项卡target里面 operating system里面选上rtx-51 tiny

程序中定义了3个任务:LED流水,LCD显示,蜂鸣器报警。蜂鸣器报警用到了定时器T1,现在的问题是只开定时器T1蜂鸣器报警任务,报警正常,一开其他两个任务蜂鸣器报警就不正常,但流水正常,LCD显示不正常,不开定时器T1,LED流水和LCD显示均正常。代码如下,请高手指点:

#include <rtx51tny.h>

#include <reg52.h>

#include <intrins.h>

#define LED 1

#define LCD 2

#define BEEP 3

typedef unsigned char BYTE

typedef unsigned int WORD

typedef bit BOOL

unsigned char frq

sbit SPK = P2^7

sbit rs=P3^5

sbit ep=P3^7

sbit rw=P3^6

BYTE code dis1[] = {"Hello World "}

BYTE code dis2[] = {"8051mcu"}

void timer1() interrupt 3

{

TH1 = 0xfe

TL1 = frq

SPK = ~SPK

}

delay(BYTE ms)

{ /悄没/ 延时子程序

BYTE i

while(ms--)

{

for(i = 0i<卜帆 250i++)

{

_nop_()

_nop_()

_nop_()

_nop_()

}

}

}

BOOL lcd_bz()

{ // 测试LCD忙碌状态

BOOL result

rs = 0

rw = 1

ep = 1

_nop_()

_nop_()

_nop_()

_nop_()

result = (BOOL)(P0 &0x80)

ep = 0

return result

}

lcd_wcmd(BYTE cmd)

{ // 写入指令数据到LCD

while(lcd_bz())

rs = 0

rw = 0

ep = 0

_nop_()

_nop_()

P0 = cmd

_nop_()

_nop_()

_nop_()

_nop_()

ep = 1

_nop_()

_nop_()

_nop_()

_nop_()

ep = 0

}

lcd_pos(BYTE pos)

{ //设定显示位置

lcd_wcmd(pos | 0x80)

}

lcd_wdat(BYTE dat)

{ //型运雹写入字符显示数据到LCD

while(lcd_bz())

rs = 1

rw = 0

ep = 0

P0 = dat

_nop_()

_nop_()

_nop_()

_nop_()

ep = 1

_nop_()

_nop_()

_nop_()

_nop_()

ep = 0

}

lcd_init()

{ //LCD初始化设定

lcd_wcmd(0x38) //

delay(1)

lcd_wcmd(0x0c) //

delay(1)

lcd_wcmd(0x06) //

delay(1)

lcd_wcmd(0x01) //清除LCD的显示内容

delay(1)

}

void timer1_init()

{

/********************定时器1初始化*************************/

TMOD = 0x10

frq = 0x00

TH1 = 0x00

TL1 = 0xff

TR1 = 1

IE = 0x88

}

//---------------------------------------------------------------------------------

void task0(void) _task_ 0

{

lcd_init() // 初始化LCD

timer1_init()//定时器1初始化

delay(10)

/*********************************************/

os_create_task (LCD)

os_create_task (LED)

os_create_task (BEEP)

os_delete_task(0)

}

void task1(void) _task_ LED//流水灯

{

int i

P1=0xfe//给P1赋值11111110,第1个发光二极管亮

while(1)

{

delay(1)

i++

if(i==50)

{

os_send_signal (LCD)

if(P1&0x80) //判断P1&10000000是否为真(大于0便为真)

{

P1<<=1//如果为真,P1不带进位左移1位

P1|=0x01//P1或00000001

}

else //如果P1与10000000为假

{

P1<<=1//P1不带进位左移1位

}

i=0

}

}

}

void task2(void) _task_ LCD//1602 液晶

{

BYTE i

BYTE j

while(1)

{

for(j=16j>0j--)

{

i=0

delay(200)

lcd_pos(j)

while(dis1[i] != '\0')

{

lcd_wdat(dis1[i])

i++

}

}

delay(200)

lcd_pos(0)

i=0

while(dis1[i] != '\0')

{

lcd_wdat(dis1[i])

i++

}

for(j=0j<(sizeof(dis1)-1)j++)

{

lcd_pos(0)

for(i=ji<(sizeof(dis1)-1)i++)

lcd_wdat(dis1[i])

delay(200)

}

}

}

void task3(void) _task_ BEEP//蜂鸣器报警

{

while(1)

{

frq++

delay(1)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12224758.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存