zuixin369 发表于 2012-2-2 18:13:30

利用TX-1C试验板,嵌入实时操作系统Small RTOS实现LED跑马灯实验

本次实验硬件平台:TX-1C实验板

实时操作系统:Small RTOS51 版本号1.12.1

编译环境:Keil C51 V9.00

实验目的:用P1接到发光二极管,依次实现从P1^0~7每个二极管循环点亮1秒,晶振采用11.0592MHz,,我们需要自己修改一下TH0和TL0的值即可。

一、在OS_CPU.H

找到:#defineIDATA_RAM_SIZE0x100 这句(256k RAM)

将其改变为#defineIDATA_RAM_SIZE0x80(128k RAM)

二,在 OS_CFG.H中做如下修改

#define OS_MAX_TASKS            1         /* 最大任务数1~16                                           */
#define OS_TICKS_PER_SEC      10          /* 声明1秒系统系统节拍数                                    */
#define EN_USER_TICK_TIMER      1         /* 禁止(0)或允许(1)系统定时中断调用用户函数UserTickTimer()*/
#define EN_OS_INT_ENTER         1         /* 禁止(0)或允许(1)中断嵌套管理                           */
#define EN_TIMER_SHARING      1         /* 禁止(0)或允许(1)定时器中断调用OSTimeTick()               */
#define TICK_TIMER_SHARING      1         /* 定义进入多少次硬件中断为一次系统定时器软中断             */


#define EN_OS_Q               0         /* 禁止(0)或允许(1)消息队列                                 */
#define EN_OS_Q_CHK             0         /* 禁止(0)或允许(1)校验消息队列指针                         */
#define OS_Q_MEM_SEL            xdata       /* 消息队列存储空间选择,keil c51有用,必须为idata、xdata   */
                                          /* 不是keil c51时它必须为空格                               */
#define EN_OS_Q_PENT            0         /* 禁止(0)或允许(1)等待队列中的消息                         */
#define EN_OS_Q_ACCEPT          0         /* 禁止(0)或允许(1)无等待的从队列中取得消息               */
#define EN_OS_Q_POST            0         /* 禁止(0)或允许(1)FIFO方式向对列发送消息                   */
#define EN_OS_Q_POST_FRONT      0         /* 禁止(0)或允许(1)LIFO方式向对列发送消息                   */
#define EN_OS_Q_INT_POST      0         /* 禁止(0)或允许(1)中断中FIFO方式相对列发送消息             */
#define EN_OS_Q_INT_POST_FRONT0         /* 禁止(0)或允许(1)中断中LIFO方式相对列发送消息             */
#define EN_OS_Q_NMsgs         0         /* 禁止(0)或允许(1)取得队列中消息数                         */
#define EN_OS_Q_SIZE            0         /* 禁止(0)或允许(1)取得队列总容量                           */
#define EN_OS_Q_FLUSH         0         /* 禁止(0)或允许(1)清空队列                                 */

#define EN_OS_SEM               0         /* 禁止(0)或允许(1)信号量                                 */
#define EN_OS_SEM_CHK         0         /* 禁止(0)或允许(1)校验信号量索引                           */
#define OS_SEM_MEM_SEL          idata       /* 信号量储空间选择,keil c51有用,必须为idata、xdata       */
                                          /* 不是keil c51时它必须为空格                               */
#define OS_MAX_SEMS             0         /* 最大信号量数目                                           */
#define EN_OS_SEM_PENT          0         /* 禁止(0)或允许(1)等待信号量                               */
#define EN_OS_SEM_ACCEPT      0         /* 禁止(0)或允许(1)无等待请求信号量                         */
#define EN_OS_SEM_INT_POST      0         /* 禁止(0)或允许(1)中断中发送信号量                         */
#define EN_OS_SEM_POST          0         /* 禁止(0)或允许(1)中发送信号量                           */
#define EN_OS_SEM_QUERY         0         /* 禁止(0)或允许(1)查询信号量                               */

//#define data                              /* 非keil c51时必须加止这一句                               */


#if EN_TIMER_SHARING == 0
#define TIME_ISR_TASK_ID   SHOW_TASK_ID   /* 定义系统定时器软中断触发的任务ID                         */
#endif


#ifdef IN_OS_CPU_C
#if EN_USER_TICK_TIMER > 0
extern void UserTickTimer(void);            /* 系统定时中断中调用的用户函数                              */
#endif
#endif

三、在config.h中做如下改变

/********************************/
/*   "以下为系统配置"         */
/********************************/
#pragma REGPARMS
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define const code

#ifndef TRUE
#define TRUE1
#endif

#ifndef FALSE
#define FALSE 0
#endif

/********************************/
/*   "操作系统定义"            */
/********************************/
#include "OS_CFG.H"
#include "OS_CPU.H"
#include "E:\Small RTOS51\单任务LED\OS\OS.H" //这里相应的修改为你的对应头文件地址即可
#include "E:\Small RTOS51\单任务LED\OS\OS_Q.h"
#include "E:\Small RTOS51\单任务LED\OS\OS_SEM.h"

/********************************/
/*   "以下为程序配置"         */
/********************************/

//任务定义
#ifdef IN_OS_CPU_C
extern void Task1(void);

void(* const TaskFuction)(void)={Task1};
//函数数组TaskFuction[]保存了各个任务初始PC指针,其按任务ID(既优先级次序)顺序保存

#endif


四、在用户程序代码中

#include <config.h>
void Init_MCU( )
{
    //系统节拍中断使用定时器0,中断频率为20Hz
        TH0 =( 65536 - (11059200 / 12) / 20) / 256;
    TL0 =( 65536 - (11059200 / 12) / 20) / 256;
    TMOD = (TMOD & 0XF0) | 0X01;
    TR0 = 1 ;
    ET0 = 1 ;
}
void main( )
{
    Init_MCU( ) ;
    OSStart( ) ;
}
void UserTickTimer(void)
{
    TH0 =( 65536 - (11059200 / 12) / 20) / 256;
    TL0 =( 65536 - (11059200 / 12) / 20) / 256;
}
void Task1(void)
{
    //让P1对应的灯从P0^0~7依次亮1s中
    uint8 i ;
    while(1)
    {
      for( i = 0 ; i < 8 ; i++ )
      {
            P1 = ~( 0x01 << i ) ;
            OSWait(K_TMO , 20 ) ;
            //P1 = 0xFF ;            
      }         
    }
}

编译、调试,上机调试,完整通过。附上源代码

点击此处下载 ourdev_715635DVP3T7.rar(文件大小:88K) (原文件名:单任务LED.rar)

ljunwen81 发表于 2013-7-3 00:45:45

请教一下,我用你的程序运行时怎么一直停在OSWait(K_TMO , 20 ) ;不动了?

dazelong 发表于 2013-9-25 22:44:52

仿真成功。
页: [1]
查看完整版本: 利用TX-1C试验板,嵌入实时操作系统Small RTOS实现LED跑马灯实验