打印

RTX51:为啥任务之间就不能切换呢

[复制链接]
2136|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大漠孤烟|  楼主 | 2007-2-4 23:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RTX51, AN, ST, TI, TE
请大伙帮看看程序是否有问题?
unsigned char code cString1[]={"\nCommand: 1\0"};
unsigned char code cString2[]={"\nCommand: 2\0"};
unsigned char code cString3[]={"\nCommand: 3\0"};
unsigned char code cString4[]={"\nCommand: 4\0"};
unsigned char code cString5[]={"\nCommand: 5\0"};
unsigned char code cString6[]={"\nCommand: 6\0"};
unsigned char code cString7[]={"\nCommand: 7\0"};
unsigned char code cString8[]={"\nCommand: 8\0"};


/******************************************************************************/
/*        Task 0 'Initial_p': Initialize                                      */
/******************************************************************************/
void Initial_P (void) _task_ Initial_p  
{  /* program execution starts here        */
    unsigned int iCount = 0;
    
    Initial();
    C8051ConfigBaud (96,0);                /* initialize the serial interface      */
    C8051ConfigBaud (192,1);
    Printf0 (cString1);
    os_create_task (SystemMan_p);             /* start clock task                     */
    os_create_task (Uart0Man_p);              /* start command task                   */
    os_create_task (Uart1Man_p);              /* start lights task                    */
    os_create_task (RecvData_p);              /* start keyread task                   */
    os_create_task (FlashMan_p);
    os_create_task (StaDisplay_p);
    os_create_task (TimeMan_p);
    os_wait (K_TMO, 1, 0);
    os_delete_task (Initial_p);                /* stop init task (no longer needed)    */
}




/******************************************************************************/
/*        Task 1 'SystemMan_p': command processor */
/******************************************************************************/
void SystemMan_P (void) _task_ SystemMan_p  
{
    char cByte2 = ' ';
    while (1)
    {
        Printf0 (cString2);
        PRLED = ~PRLED;
        os_wait (K_TMO, 1, 0);
    }
}
/******************************************************************************/
/*        Task 2 'SystemMan_p'                                                */
/******************************************************************************/
void Uart0Man_P (void)  _task_ Uart0Man_p  {
while (1)
    {
        Printf0 (cString3);
        PGLED = ~PGLED;
        os_wait (K_TMO, 1, 0);
    }
}


/******************************************************************************/
/*        Task 3 'Uart1Man_p': runs if current time is outside start & end time */
/******************************************************************************/
void Uart1Man_P (void) _task_ Uart1Man_p  {       
  while (1)
    {
        Printf0 (cString4);
        RADRLED = ~RADRLED;
        
        os_wait (K_TMO, 1, 0);
    }
}

/******************************************************************************/
/*      Task 4 'RecvData_p': executes if current time is between start & end time */
/******************************************************************************/
void RecvData_P (void) _task_ RecvData_p  
{    
while (1)
    {
        Printf0 (cString5);
        RADGLED = ~RADGLED;
        
        os_wait (K_TMO, 1, 0);
    }
}


/******************************************************************************/
/*        Task 5 'FlashMan_p': process key stroke from pedestrian push button    */
/******************************************************************************/
void FlashMan_P (void) _task_ FlashMan_p  {

while (1)
    {
        Printf0 (cString6);
        SRLED = ~SRLED ;
        
        os_wait (K_TMO, 1, 0);
    }
}

/******************************************************************************/
/*        Task 6 'StaDisplay_p': check if ESC (escape character) was entered    */
/******************************************************************************/
void StaDisplay_P (void) _task_ StaDisplay_p  
{
while (1)
    {
        Printf0 (cString7);
        SGLED = ~SGLED;
        
        os_wait (K_TMO, 1, 0);
    }
}

/******************************************************************************/
/*        Task 7 'TimeMan_p': check if ESC (escape character) was entered    */
/******************************************************************************/
void TimeMan_P (void) _task_ TimeMan_p  {
while (1)
    {
        Printf0 (cString8);
        BLT_BLED = ~BLT_BLED;
        os_wait (K_TMO, 1, 0);
    }
}

配置如下:
  Define the register bank used for the timer interrupt.
INT_REGBANK    EQU    1    ; default is Registerbank 1
;
;  Define Hardware-Timer tick time in 8051 machine cycles.
INT_CLOCK    EQU    65535    ; default is 10000 cycles
;
;  Define Round-Robin Timeout in Hardware-Timer ticks.
TIMESHARING    EQU     5    ; default is 5 Hardware-Timer ticks.
;                        ; 0 disables Round-Robin Task Switching
;
;  Long User Interrupt Routines: set to 1 if your application contains 
;  user interrupt functions that may take longer than a hardware timer 
;  interval for execution.
LONG_USR_INTR    EQU    0    ; 0 user interrupts execute fast.
;                               ; 1 user interrupts take long execution times.
;

执行结果却只是:
Command: 1
Command: 2
Command: 3
Command: 4
Command: 5
Command: 6
Command: 7
Command: 8
Command: 2
Command: 3
Command: 4
Command: 5

到底是不是时间片设置的问题,只有修改INT_CLOCK    EQU时,打印结果会变。到底是什么缘故呢?请各位赐教!谢谢

相关帖子

沙发
lixun00| | 2007-2-5 08:30 | 只看该作者

时间基准不准,俺以前用过

使用特权

评论回复
板凳
大漠孤烟|  楼主 | 2007-2-5 22:34 | 只看该作者

请教lixun00大侠,一般时间基准设定都遵循什么原则呢,谢谢

使用特权

评论回复
地板
将军令| | 2007-2-6 08:06 | 只看该作者

EA被你关闭了吧!或者T0被你关闭了

使用特权

评论回复
5
大漠孤烟|  楼主 | 2007-2-6 21:22 | 只看该作者

T0一直在跑的,sim模式情况和加载到C8051跑的是一样的

如果把时间片加到65535,设定INTERVAL 10 TICKS,这样的话,跑出来的结果就只有:
Command: 1
Command: 2
Command: 3
Command: 4
Command: 5
Command: 6
Command: 7
Command: 8

谢谢赐教!

使用特权

评论回复
6
ayb_ice| | 2007-2-8 20:23 | 只看该作者

随便说说

将TIMESHARING设为0(禁止轮转)看看.

使用特权

评论回复
7
lixun00| | 2007-2-10 16:49 | 只看该作者

俺也是菜鸟一个,以前试验的时候用其它的定时器自动重载

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

240

帖子

1

粉丝