论文部分内容阅读
摘 要:为解决在单片机中处理实时多任务,通过在C8051F020单片机使用RTX51TINY OS操作系统,使系统能稳定运行无线模块,液晶点阵显示、数码管显示、温度芯片、时间芯片等实时任务,防止系统跑死和混乱现象的出现。
关键词:实时;多任务;RTX51TINY
中图分类号:TP315 文献标识码:A 文章编号:1006-8937(2013)06-0022-02
1 RTX51的简介
RTX51是KEIL公司开发的用于8051系列单片机的多任务实时操作系统。它有两个版本,RTX51 FULL和RTX51 Tiny。RTX51 Tiny是RTX51 FULL的子集,仅支持按时间片循环任务调度,支持任务间信号传递,最大16个任务,可以并行地利用中断。具有以下等待操作:超时、另一个任务或中断的信号。但它不能进行信息处理,不支持存储区的分配和释放,不支持占先式调度。RTX51 Tiny一个很小的内核,完全集成在 KEIL C51编译器中。更重要的是,它仅占用800字节左右的程序存储空间,可以在没有外放数据存储器的8051系统中运行,但应用程序仍然可以访问外部存储器。
2 系统简述
本系统是一个实时信息发布系统,需要显示各点的实时信息,同时也需要显示年月日和时分秒等信息。框图如图1所示,本设计包含多个从机部分,每部分都由AT89C2051单片机、JTT-433-UDI嵌入式微功率无线数传模块和HC-SR501人体红外感应模块组成。人体传感器HC-SR501检测当前空间内是否有人,如果有人则通过JTT-433-UDI嵌入式微功率无线数传模块发送数据给主机模块。主机模块主要由温度时钟部分、无线接收部分、数码管显示部分、点阵显示部分、LED灯指示部分、太阳能电池板、蓄电池、控制器8部分组成。
3 多任务模式的实现
整个程序中,采用多任务模式,但是在采用多任务模式中,程序调度多任务时数码管总会出现闪烁,虽然单片机运行频率很高,但是每一个任务中运算量都很大的,在调度任务时系统会自动的分配几个毫秒用来任务的切换,由于数码管扫描时采用动态扫描方式,每扫描一个数码管大概时间就是一毫秒的,再加上扫描时的延时,大概整个扫描过程就是20多毫秒,这个时间超过了系统分配的时间片,在系统配置文件中我们改变它的中端时间。
由于扫描数码管是由单片机的I/O引脚来控制数码管位选扫描,在由I/O送出数据到数码管上显示,扫描液晶点阵的时候使用的是4线16译码芯片74H154扫描,两个的扫描方式不一样,这样使得在程序中无论如何修改程序都会使得整个扫描时间不能缩短,从而占用其他程序运行的大量时间,使用数码显示出现闪烁,我们通过将两种扫描方式合为一种扫描方式,都改为液晶点阵的自动扫描译码,这样就节约一半的时间,任务运行起来也稳定。
3.1 创建多任务
程序如下:
void job0(void) _task_ 0 //rtx初始化任务
{
Systeminit(); //系统初始化
……
os_create_task(1);
os_create_task(2);
os_create_task(3);
os_delete_task(0); //删除
}
RTX51 Tiny程序不需要mian函数,取而代之,在初始化任务中,对系统初始化,时间芯片,无线模块,设置时间初始化。RTX51 Tiny从第0个任务开始执行,任务执行完后删除任务0。
3.2 模块任务的创建
3.2.1 任务1的创建
程序如下:
void job1(void) _task_ 1 //获取时间
{
while(1)
{
DS1302_GetTime(&CurrentTime);
……
os_wait(K_TMO,2,0); //挂起
}
}
RTX51 Tiny的任务1就是时间芯片DS1302读取时间,显示时间,扫描数码管,显示温度,RTX51 Tiny的时间片分配的时间不足以使得整个任务运行,在任务中加上挂起超时函数,单任务超时时,任务自动被挂起。
3.2.2 任务2的创建
由于液晶点阵中由于是采用4线16自动译码,它的扫描方式是自动扫描的,如果使用串口的方式来写入数据,但是我们在使用无线模块时已经占用串口URAT0,在使用串口的话,容易使得无线模块在接受数据时,是系统跑死,于是就采用向单片机内部写数据,编写一个写入内部数据的函数和内部数据清零的函数,液晶点阵的扫描方式是一行行的扫描。
任务2就是在我们按键调整时间的时候,但被选中的数码管模块闪烁的问题,采用的是延时闪烁,当选中调整的模块式,给它送低电平(数码管采用的是共阴极),计时延时自减,减为零时,再送高电平,这样来实现闪烁,实现程序如下:
if(displaydelay<=LONGTIME)
displaydelay--;
if(displaydelay==0)
{
displaydelay=LONGTIME;
display=~display;
}
3.2.3 任务3的创建
任务3包含两个程序,键盘扫描程序和无线模块接受程序,键盘扫描采用独立键盘扫描方式,共有三个按键,一个功能键,一个加键和一个减键,功能键是选择选中哪一个数码管模块,使用加减按键来实现时间,星期,校历周数的加减,设置好后数据写入DS1302内部的RAM,键盘采用延时,当我按下键盘时,如果超过5 s没有按键,将会自动退出键盘扫描功能。
在无线模块中,使用串口UART0,在无线接收的过程中主要就是对于串口的配置问题,在使用单片机中的晶振是22.1184 MHz,使用外部晶振,使用串口计算波特率的时候,由于我们采用方式3,9位自动重装,在计算串口的波特率时,当系统初始化时使用的波特率是9600进行通信,用来启动无线模块的初始值,接下连使用1 200 bit/s进行接收数据,实现程序如下:
void job4 (void) _task_ 3
{
while(1)
{
keyscan();
ES0 = 0;
if(RI0==1)
{
if(!recvdata(&buf))
{
BUTTON_OK=0;
delay(2000);
}
else
{
BUTTON_OK=1;
delay(2000);
}
}
}
os_wait(K_TMO,2,0);
}
4 结 论
由于使用了RTX51TINY多任务实时操作系统,设计的电路能够稳定运行,达到了预期的目的。
参考文献:
[1] 吴金.8051单片机实践与应用[M].北京:清华大学出版社,2002.
[2] 张友德.单片微型机原理、应用与实验[M].北京:复旦大学出版社,2003.
[3] 何小艇.电子系统设计[M].杭州:浙江大学出版社,2004.
[4] 陈明计,周立功.嵌入式实时操作系统Small RTOS51原理及应用[M].北京:北京航空航天大学出版社,2004.
[5] 徐爱钧,彭秀华.单片机高级语言C51Win-dows环境编程与应用[M].北京:电子工业出版社,2001.
作者简介:雷霞(1977-),女,四川广元人,讲师,电子技术应用专业。
关键词:实时;多任务;RTX51TINY
中图分类号:TP315 文献标识码:A 文章编号:1006-8937(2013)06-0022-02
1 RTX51的简介
RTX51是KEIL公司开发的用于8051系列单片机的多任务实时操作系统。它有两个版本,RTX51 FULL和RTX51 Tiny。RTX51 Tiny是RTX51 FULL的子集,仅支持按时间片循环任务调度,支持任务间信号传递,最大16个任务,可以并行地利用中断。具有以下等待操作:超时、另一个任务或中断的信号。但它不能进行信息处理,不支持存储区的分配和释放,不支持占先式调度。RTX51 Tiny一个很小的内核,完全集成在 KEIL C51编译器中。更重要的是,它仅占用800字节左右的程序存储空间,可以在没有外放数据存储器的8051系统中运行,但应用程序仍然可以访问外部存储器。
2 系统简述
本系统是一个实时信息发布系统,需要显示各点的实时信息,同时也需要显示年月日和时分秒等信息。框图如图1所示,本设计包含多个从机部分,每部分都由AT89C2051单片机、JTT-433-UDI嵌入式微功率无线数传模块和HC-SR501人体红外感应模块组成。人体传感器HC-SR501检测当前空间内是否有人,如果有人则通过JTT-433-UDI嵌入式微功率无线数传模块发送数据给主机模块。主机模块主要由温度时钟部分、无线接收部分、数码管显示部分、点阵显示部分、LED灯指示部分、太阳能电池板、蓄电池、控制器8部分组成。
3 多任务模式的实现
整个程序中,采用多任务模式,但是在采用多任务模式中,程序调度多任务时数码管总会出现闪烁,虽然单片机运行频率很高,但是每一个任务中运算量都很大的,在调度任务时系统会自动的分配几个毫秒用来任务的切换,由于数码管扫描时采用动态扫描方式,每扫描一个数码管大概时间就是一毫秒的,再加上扫描时的延时,大概整个扫描过程就是20多毫秒,这个时间超过了系统分配的时间片,在系统配置文件中我们改变它的中端时间。
由于扫描数码管是由单片机的I/O引脚来控制数码管位选扫描,在由I/O送出数据到数码管上显示,扫描液晶点阵的时候使用的是4线16译码芯片74H154扫描,两个的扫描方式不一样,这样使得在程序中无论如何修改程序都会使得整个扫描时间不能缩短,从而占用其他程序运行的大量时间,使用数码显示出现闪烁,我们通过将两种扫描方式合为一种扫描方式,都改为液晶点阵的自动扫描译码,这样就节约一半的时间,任务运行起来也稳定。
3.1 创建多任务
程序如下:
void job0(void) _task_ 0 //rtx初始化任务
{
Systeminit(); //系统初始化
……
os_create_task(1);
os_create_task(2);
os_create_task(3);
os_delete_task(0); //删除
}
RTX51 Tiny程序不需要mian函数,取而代之,在初始化任务中,对系统初始化,时间芯片,无线模块,设置时间初始化。RTX51 Tiny从第0个任务开始执行,任务执行完后删除任务0。
3.2 模块任务的创建
3.2.1 任务1的创建
程序如下:
void job1(void) _task_ 1 //获取时间
{
while(1)
{
DS1302_GetTime(&CurrentTime);
……
os_wait(K_TMO,2,0); //挂起
}
}
RTX51 Tiny的任务1就是时间芯片DS1302读取时间,显示时间,扫描数码管,显示温度,RTX51 Tiny的时间片分配的时间不足以使得整个任务运行,在任务中加上挂起超时函数,单任务超时时,任务自动被挂起。
3.2.2 任务2的创建
由于液晶点阵中由于是采用4线16自动译码,它的扫描方式是自动扫描的,如果使用串口的方式来写入数据,但是我们在使用无线模块时已经占用串口URAT0,在使用串口的话,容易使得无线模块在接受数据时,是系统跑死,于是就采用向单片机内部写数据,编写一个写入内部数据的函数和内部数据清零的函数,液晶点阵的扫描方式是一行行的扫描。
任务2就是在我们按键调整时间的时候,但被选中的数码管模块闪烁的问题,采用的是延时闪烁,当选中调整的模块式,给它送低电平(数码管采用的是共阴极),计时延时自减,减为零时,再送高电平,这样来实现闪烁,实现程序如下:
if(displaydelay<=LONGTIME)
displaydelay--;
if(displaydelay==0)
{
displaydelay=LONGTIME;
display=~display;
}
3.2.3 任务3的创建
任务3包含两个程序,键盘扫描程序和无线模块接受程序,键盘扫描采用独立键盘扫描方式,共有三个按键,一个功能键,一个加键和一个减键,功能键是选择选中哪一个数码管模块,使用加减按键来实现时间,星期,校历周数的加减,设置好后数据写入DS1302内部的RAM,键盘采用延时,当我按下键盘时,如果超过5 s没有按键,将会自动退出键盘扫描功能。
在无线模块中,使用串口UART0,在无线接收的过程中主要就是对于串口的配置问题,在使用单片机中的晶振是22.1184 MHz,使用外部晶振,使用串口计算波特率的时候,由于我们采用方式3,9位自动重装,在计算串口的波特率时,当系统初始化时使用的波特率是9600进行通信,用来启动无线模块的初始值,接下连使用1 200 bit/s进行接收数据,实现程序如下:
void job4 (void) _task_ 3
{
while(1)
{
keyscan();
ES0 = 0;
if(RI0==1)
{
if(!recvdata(&buf))
{
BUTTON_OK=0;
delay(2000);
}
else
{
BUTTON_OK=1;
delay(2000);
}
}
}
os_wait(K_TMO,2,0);
}
4 结 论
由于使用了RTX51TINY多任务实时操作系统,设计的电路能够稳定运行,达到了预期的目的。
参考文献:
[1] 吴金.8051单片机实践与应用[M].北京:清华大学出版社,2002.
[2] 张友德.单片微型机原理、应用与实验[M].北京:复旦大学出版社,2003.
[3] 何小艇.电子系统设计[M].杭州:浙江大学出版社,2004.
[4] 陈明计,周立功.嵌入式实时操作系统Small RTOS51原理及应用[M].北京:北京航空航天大学出版社,2004.
[5] 徐爱钧,彭秀华.单片机高级语言C51Win-dows环境编程与应用[M].北京:电子工业出版社,2001.
作者简介:雷霞(1977-),女,四川广元人,讲师,电子技术应用专业。