天宁宁 发表于 3 天前

编译一个RtxTiny2文件 data=124.1 xdata=0 code=5469 代码超出程序区范围

Build target 'Demo - Simulator'
compiling TRAFFIC.C...
compiling SERIAL.C...
compiling GETLINE.C...
assembling Conf_tny.A51...
assembling START900.A51...
linking...
Program Size: data=124.1 xdata=0 code=5469
creating hex file from "traffic"...
"traffic" - 0 Error(s), 0 Warning(s).

STC8H8K64U 芯片

/*“+*****使用C51和RTX-51微型交通灯控制器******+\n”
“|此程序是一个简单的交通灯控制器
“|系统控制红绿灯的开始时间和结束时间          |\n”
“|使用行人自助服务。超出此时间范围            |\n”
“|黄色警告灯闪烁。                            |\n”
“+命令-+语法-----+函数------------------+   |\n”
“|显示|D|显示时间                           |\n”
“|时间|T hh:mm:ss|设置时钟时间                |\n”
“|开始|S hh:mm:ss|设置开始时间                |\n”
“|结束|E hh:mm:ss|设置结束时间                |\*/

char code menu[] =
   "\n"
   "+***** TRAFFIC LIGHT CONTROLLER using C51 and RTX-51 tiny *****|\n"
   "| This program is a simple Traffic Light Controller.Between|\n"
   "| start time and end time the system controls a traffic light|\n"
   "| with pedestrian self-service.Outside of this time range    |\n"
   "| the yellow caution lamp is blinking.                         |\n"
   "+ command -+ syntax -----+ function ---------------------------+\n"
   "| Display| D         | display times                     |\n"
   "| Time   | T hh:mm:ss| set clock time                      |\n"
   "| Start    | S hh:mm:ss| set start time                      |\n"
   "| End      | E hh:mm:ss| set end time                        |\n"
   "+----------+-------------+-------------------------------------+\n";

#include <REG52.H>                   /* special function registers 8052      */
#include <rtx51tny.h>               /* RTX-51 tiny functions & defines      */
#include <stdio.h>                  /* standard I/O .h-file               */
#include <ctype.h>                  /* character functions                  */
#include <string.h>                   /* string and memory functions          */

#include "traffic.h"                  /* project specific header file         */

struct time ctime = { 12,0,0 };   /* storage for clock time values      */
struct time start = {7, 30,0 };   /* storage for start time values      */
struct time end   = { 18, 30,0 };   /* storage for end   time values      */

sbitred    = P2^2;                  /* I/O Pin:red    lamp output         */
sbityellow = P2^1;                  /* I/O Pin:yellow lamp output         */
sbitgreen= P2^0;                  /* I/O Pin:greenlamp output         */
sbitstop   = P2^3;                  /* I/O Pin:stop   lamp output         */
sbitwalk   = P2^4;                  /* I/O Pin:walk   lamp output         */
sbitkey    = P2^5;                  /* I/O Pin:self-service key input   */

char idata inline;                /* storage for command input line       */


/******************************************************************************/
/*      Task 0 'init': Initialize                                           */
/******************************************************************************/
void init (void) _task_ INIT{       /* program execution starts here      */
serial_init ();                     /* initialize the serial interface      */
                                    /* configure I/O port                   */
P2M1 = 0x1F;                        /* P2.0-P.2.4 output, P2.5-P2.7 input   */

os_create_task (CLOCK);             /* start clock task                     */
os_create_task (COMMAND);         /* start command task                   */
os_create_task (LIGHTS);            /* start lights task                  */
os_create_task (KEYREAD);         /* start keyread task                   */
os_delete_task (INIT);            /* stop init task (no longer needed)    */
}


bit display_time = 0;               /* flag:signal cmd state display_time */

/******************************************************************************/
/*      Task 2 'clock'                                                      */
/******************************************************************************/
void clock (void)_task_ CLOCK{
while (1){                        /* clock is an endless loop             */
    if (++ctime.sec == 60){         /* calculate the second               */
      ctime.sec = 0;
      if (++ctime.min == 60){       /* calculate the minute               */
      ctime.min = 0;
      if (++ctime.hour == 24){    /* calculate the hour                   */
          ctime.hour = 0;
      }
      }
    }
    if (display_time){            /* if command_status == display_time    */
      os_send_signal (COMMAND);       /* signal to task command: time changed */
    }
    os_wait (K_IVL, 100, 0);          /* wait interval:1 second             */
}
}


struct time rtime;                  /* temporary storage for entry time   */

/******************************************************************************/
/*      readtime: convert line input to time values & store in rtime      */
/******************************************************************************/
bit readtime (char idata *buffer){
unsigned char args;                        /* number of arguments         */

rtime.sec = 0;                               /* preset second               */
args = sscanf (buffer, "%bd:%bd:%bd",      /* scan input line for         */
               &rtime.hour,                  /* hour, minute and second   */
               &rtime.min,
               &rtime.sec);

if (rtime.hour > 23||rtime.min > 59||/* check for valid inputs      */
      rtime.sec > 59   ||args < 2      ||args == EOF){
    printf ("\n*** ERROR: INVALID TIME FORMAT\n");
    return (0);
}
return (1);
}



#define ESC0x1B                     /* ESCAPE character code                */

static bit   escape;                  /* flag: mark ESCAPE character entered*/

/******************************************************************************/
/*      Task 6 'get_escape': check if ESC (escape character) was entered    */
/******************************************************************************/
void get_escape (void) _task_ GET_ESC{
while (1){                                 /* endless loop                */
    if (_getkey () == ESC)escape = 1;      /* set flag if ESC entered   */
    if (escape){                           /* if escape flag send signal*/
      os_send_signal (COMMAND);                /* to task 'command'         */
    }
}
}


/******************************************************************************/
/*      Task 1 'command': command processor */
/******************************************************************************/
void command (void) _task_ COMMAND{
unsigned char i;

printf (menu);                               /* display command menu      */
while (1){                                 /* endless loop                */
    printf ("\nCommand: ");                  /* display prompt            */
    getline (&inline, sizeof (inline));      /* get command line input      */

    for (i = 0; inline != 0; i++){      /* convert to uppercase      */
      inline = toupper(inline);
    }

    for (i = 0; inline == ' '; i++);      /* skip blanks               */

    switch (inline){                      /* proceed to command function */
      case 'D':                              /* Display Time Command      */
      printf ("Start Time: %02bd:%02bd:%02bd    "
                "End Time: %02bd:%02bd:%02bd\n",
               start.hour, start.min, start.sec,
               end.hour,   end.min,   end.sec);
      printf ("                        type ESC to abort\r");

      os_create_task (GET_ESC);            /* ESC check in display loop   */
      escape = 0;                            /* clear escape flag         */
      display_time = 1;                      /* set display time flag       */
      os_clear_signal (COMMAND);             /* clear pending signals       */

      while (!escape){                     /* while no ESC entered      */
          printf ("Clock Time: %02bd:%02bd:%02bd\r",      /* display time   */
                   ctime.hour, ctime.min, ctime.sec);
          os_wait (K_SIG, 0, 0);               /* wait for time change or ESC */
      }

      os_delete_task (GET_ESC);            /* ESC check not longer needed */
      display_time = 0;                      /* clear display time flag   */
      printf ("\n\n");
      break;

      case 'T':                              /* Set Time Command            */
      if (readtime (&inline)){      /* read time input and         */
          ctime.hour = rtime.hour;             /* store in 'ctime'            */
          ctime.min= rtime.min;
          ctime.sec= rtime.sec;
      }
      break;

      case 'E':                              /* Set End Time Command      */
      if (readtime (&inline)){      /* read time input and         */
          end.hour = rtime.hour;               /* store in 'end'            */
          end.min= rtime.min;
          end.sec= rtime.sec;
      }
      break;

      case 'S':                              /* Set Start Time Command */
      if (readtime (&inline)){      /* read time input and         */
          start.hour = rtime.hour;             /* store in 'start'            */
          start.min= rtime.min;
          start.sec= rtime.sec;
      }
      break;

      default:                                 /* Error Handling            */
      printf (menu);                         /* display command menu      */
      break;
    }   
}
}


/******************************************************************************/
/*      signalon: check if clock time is between start and end            */
/******************************************************************************/
static bit signalon (void)   {
if (memcmp (&start, &end, sizeof (struct time)) < 0){
    if (memcmp (&start, &ctime, sizeof (struct time)) < 0&&
      memcmp (&ctime, &end,   sizeof (struct time)) < 0)return (1);
}
                                                
else{
    if (memcmp (&end,   &ctime, sizeof (start)) > 0&&
      memcmp (&ctime, &start, sizeof (start)) > 0)return (1);
}
return (0);                                  /* signal off, blinking on   */
}


/******************************************************************************/
/*      Task 3 'blinking': runs if current time is outside start & end time */
/******************************************************************************/
void blinking (void) _task_ BLINKING{      /* blink yellow light          */
red    = 0;                                  /* all lights off            */
yellow = 0;
green= 0;
stop   = 0;
walk   = 0;

while (1){                                 /* endless loop                */
    yellow = 1;                              /* yellow light on             */
    os_wait (K_TMO, 150, 0);                   /* wait for timeout: 150 ticks*/
    yellow = 0;                              /* yellow light off            */
    os_wait (K_TMO, 150, 0);                   /* wait for timeout: 150 ticks*/
    if (signalon ()){                        /* if blinking time over       */
      os_create_task (LIGHTS);               /* start lights                */
      os_delete_task (BLINKING);               /* and stop blinking         */
    }
}
}


/******************************************************************************/
/*      Task 4 'lights': executes if current time is between start & end time */
/******************************************************************************/
void lights (void) _task_ LIGHTS{            /* traffic light operation   */
red    = 1;                                  /* red & stop lights on      */
yellow = 0;
green= 0;
stop   = 1;
walk   = 0;
while (1){                                 /* endless loop                */
    os_wait (K_TMO, 150, 0);                   /* wait for timeout: 150 ticks */
    if (!signalon ()){                     /* if traffic signal time over */
      os_create_task (BLINKING);               /* start blinking            */
      os_delete_task (LIGHTS);               /* stop lights               */
    }
    yellow = 1;
    os_wait (K_TMO, 150, 0);                   /* wait for timeout: 150 ticks */
    red    = 0;                              /* green light for cars      */
    yellow = 0;
    green= 1;
    os_clear_signal (LIGHTS);
    os_wait (K_TMO, 200, 0);                   /* wait for timeout: 200 ticks */
    os_wait (K_TMO + K_SIG, 250, 0);         /* wait for timeout & signal   */
    yellow = 1;
    green= 0;
    os_wait (K_TMO, 150, 0);                   /* wait for timeout: 150 ticks */
    red    = 1;                              /* red light for cars          */
    yellow = 0;
    os_wait (K_TMO, 150, 0);                   /* wait for timeout: 150 ticks */
    stop   = 0;                              /* green light for walkers   */   
    walk   = 1;
    os_wait (K_TMO, 250, 0);                   /* wait for timeout: 250 ticks */
    os_wait (K_TMO, 250, 0);                   /* wait for timeout: 250 ticks */
    stop   = 1;                              /* red light for walkers       */      
    walk   = 0;
}
}


/******************************************************************************/
/*      Task 5 'keyread': process key stroke from pedestrian push button    */
/******************************************************************************/
void keyread (void) _task_ KEYREAD{
while (1){                                 /* endless loop                */
    if (key){                              /* if key pressed            */
      os_send_signal (LIGHTS);               /* send signal to task lights*/
    }
    os_wait (K_TMO, 2, 0);                     /* wait for timeout: 2 ticks   */
}
}



AI芯 发表于 3 天前

ISP软件更新再试下:https://www.stcaimcu.com/data/download/Tools/AIapp-ISP-v6.95V.zip

天宁宁 发表于 3 天前

还是超出限制

蜗牛 发表于 3 天前

原来的芯片最后几个字节是配置芯片用的,STC8H64最后512字节是eeprom。

天宁宁 发表于 3 天前

蜗牛 发表于 2025-6-25 09:31
原来的芯片最后几个字节是配置芯片用的,STC8H64最后512字节是eeprom。

那也不应该超出限制啊 其他代码一万多可以装载

天宁宁 发表于 3 天前


程序

蜗牛 发表于 前天 07:41

天宁宁 发表于 2025-6-25 09:39
那也不应该超出限制啊 其他代码一万多可以装载
原来的代码是针对Philips P89LPC932的,
这个芯片0XFFF0-0xFFFF是芯片的配置字节,

STC8H8K64的eeprom最少都需要512字节,这一块地址重叠了。

天宁宁 发表于 昨天 05:39

               

                CSEG    AT      1E00H
                DB      UCFG1         ; place UCFG Bytes in hex file
                DB      UCFG2         ; reserved for future use
                DB      BOOTVEC
                DB      BOOTSTAT
                CSEG    AT      2000H      
页: [1]
查看完整版本: 编译一个RtxTiny2文件 data=124.1 xdata=0 code=5469 代码超出程序区范围