编译一个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 */
}
}
ISP软件更新再试下:https://www.stcaimcu.com/data/download/Tools/AIapp-ISP-v6.95V.zip 还是超出限制
原来的芯片最后几个字节是配置芯片用的,STC8H64最后512字节是eeprom。 蜗牛 发表于 2025-6-25 09:31
原来的芯片最后几个字节是配置芯片用的,STC8H64最后512字节是eeprom。
那也不应该超出限制啊 其他代码一万多可以装载
程序
天宁宁 发表于 2025-6-25 09:39
那也不应该超出限制啊 其他代码一万多可以装载
原来的代码是针对Philips P89LPC932的,
这个芯片0XFFF0-0xFFFF是芯片的配置字节,
STC8H8K64的eeprom最少都需要512字节,这一块地址重叠了。
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]