Technical Support
Support Resources
Product Information
|
What's New in C51 Version 9.55
C51 Version 9.55 Release
Release Date: 14th March 2016
-
[Cx51 Compiler]
-
Corrected: WARNING
C182: pointer to different objects sometimes incorrect.
Example:
int xxx[6];
int (*ptr)[6];
void main(void) {
ptr = &xxx; /* The compiler erroneously throws the WARNING C182: pointer to different objects for this assignment. */
}
-
Corrected: constant strings may be stored in the
memory class CODE instead of CONST.. For example:
code char str1[] = "aaaaa";
code char str2[] = "bbbbb";
char * arC;
void main(void) {
arC = str1;
arC = "xxxxx";
}
Wrong storage location for "aaaaa", "bbbbb", and "xxxxx". Correct storage location for "aaaaa", "bbbbb", and "xxxxx".
?PR?main?MAIN SEGMENT CODE ?PR?main?MAIN SEGMENT CODE
?CO?MAIN SEGMENT CODE ---------+ ?CO?MAIN SEGMENT CONST ---------+
?DT?MAIN SEGMENT DATA | ?DT?MAIN SEGMENT DATA |
EXTRN CODE (?C_STARTUP) | EXTRN CODE (?C_STARTUP) |
PUBLIC arC | PUBLIC arC |
PUBLIC str2 | PUBLIC str2 |
PUBLIC str1 | PUBLIC str1 |
PUBLIC main | PUBLIC main |
| |
RSEG ?DT?MAIN | RSEG ?DT?MAIN |
arC: DS 3 | arC: DS 3 |
RSEG ?CO?MAIN <-----------------------+ Program Code RSEG ?CO?MAIN <-----------------------+ Constant
?SC_0: ?SC_0:
DB 'x' ,'x' ,'x' ,'x' ,'x' ,000H DB 'x' ,'x' ,'x' ,'x' ,'x' ,000H
str1: str1:
DB 'a' ,'a' ,'a' ,'a' ,'a' ,000H DB 'a' ,'a' ,'a' ,'a' ,'a' ,000H
str2: str2:
DB 'b' ,'b' ,'b' ,'b' ,'b' ,000H DB 'b' ,'b' ,'b' ,'b' ,'b' ,000H
-
[LX51 Linker/Locater]
-
Added: in the LX51 map file a new section LINKER CODE
PACKING CROSS-REFERENCE shows the usage of common code
blocks from the various program segments. For example:
.....
21: if (*line == '+' || *line == '-') sign = (*line++ == '+');
002593 EF MOV A,R7
002594 642B XRL A,#02BH
002596 6005 JZ ?C0009?CSAMPLE2
002598 D102 ACALL ?L?COM0001 <--------------------+
00259A B42D0D CJNE A,#02DH,?C0008?CSAMPLE2 |
00259D ?C0009?CSAMPLE2: |
00259D D131 ACALL ?L?COM0002 <--------+ |
00259F 7165 ACALL ?C?CLDPTR | |
0025A1 B42B03 CJNE A,#02BH,?C0010?CSAMPLE2 | |
..... | |
| |
----- FUNCTION ?L?COM0001 (BEGIN) ----- <--------------------+
002602 90102C MOV DPTR,#line | |
002605 E0 MOVX A,@DPTR | |
002606 FB MOV R3,A | |
002607 A3 INC DPTR | |
002608 E0 MOVX A,@DPTR | |
002609 FA MOV R2,A | |
00260A A3 INC DPTR | |
00260B E0 MOVX A,@DPTR | |
00260C F9 MOV R1,A | |
00260D 6165 AJMP ?C?CLDPTR | |
----- FUNCTION ?L?COM0001 (END) ------- | |
| |
----- FUNCTION ?L?COM0002 (BEGIN) ----- <--------+ |
002631 90102C MOV DPTR,#line | |
002634 E0 MOVX A,@DPTR | |
002635 FB MOV R3,A | |
002636 A3 INC DPTR | |
002637 E4 CLR A | |
002638 75F001 MOV B,#01H | |
00263B 71B8 ACALL ?C?ILDIX | |
00263D A9F0 MOV R1,B | |
00263F FA MOV R2,A | |
002640 22 RET | |
----- FUNCTION ?L?COM0002 (END) ------- | |
| |
| |
LINKER CODE PACKING CROSS-REFERENCE LISTING | |
| |
NAME . . . . CLASS SIZE TYPE SEGMENT NAMES(ADDR) | |
=================================================== | |
| v
?L?COM0001 . CODE 000DH PART ?L?COM0001 ?PR?_ATOI?CSAMPLE2(10025B1H) ?PR?_ATOI?CSAMPLE2(1002598H)
|
v
?L?COM0002 . CODE 0010H PART ?L?COM0002 ?PR?_ATOI?CSAMPLE2(100259DH) ?PR?_GETLINE?CSAMPLE2(100261CH)
...
...
-
Corrected: When using the SEGMENTS directive to order
segments, the order was violated (incorrect size optimization).
For example:
Assembler source:
C2 SEGMENT ECODE
RSEG C2
T2: DB 0x7F
C1 SEGMENT ECODE SEG
RSEG C1
T1: DB 0x7F
C3 SEGMENT ECODE SEG
RSEG C3
T3: DB 0x7F
defined segment order
|---------------------|
LX51.EXE T1.obj TO T1.abs PRINT CLASSES(CODE(C:0X4000-C:0X8000),ECODE (C:0X4000-C:0X28000),XDATA (X:0X0000-X:0X09FF)) SEGMENTS (C3, C1, C2)
START STOP LENGTH ALIGN RELOC MEMORY CLASS SEGMENT NAME
=========================================================================
010000H 010007H 000008H SEG UNIT ECODE C3 -----+--- Wrong segment order.
010008H 010008H 000001H BYTE UNIT ECODE C2 |
010009H 01FFFFH 00FFF7H --- --- **GAP** |
020000H 020000H 000001H SEG UNIT ECODE C1 -----+
START STOP LENGTH ALIGN RELOC MEMORY CLASS SEGMENT NAME
=========================================================================
010000H 010007H 000008H SEG UNIT ECODE C3 -----+--- Correct segment order.
010008H 01FFFFH 00FFF8H --- --- **GAP** |
020000H 020000H 000001H SEG UNIT ECODE C1 |
020001H 020001H 000001H BYTE UNIT ECODE C2 -----+
-
Corrected: Using the LAST in the SEGMENTS directive
was ignored for linker code packing segments. For example:
LX51 TC_0.obj, TC_1.obj TO T PRINT CLASSES (EDATA (0X0000-0X03FF), XDATA (X:0X0000-X:0X113F)) SEGMENTS (?PR?TEST2?TC_1,?PR?TEST?TC_1(LAST))
|
wrong: |
START STOP LENGTH ALIGN RELOC MEMORY CLASS SEGMENT NAME |
========================================================================= |
.... |
000087H 00008EH 000008H BYTE UNIT CODE ?L?COM0007 |
00008FH 000096H 000008H BYTE UNIT CODE ?PR?MAIN?TC_0 |
000097H --- 000000H BYTE UNIT CODE ?PR?TEST2?TC_1 |
000097H 0000AFH 000019H BYTE UNIT CODE ?PR?TEST?TC_1 <-----------------------------------------------+
0000B0H 00011CH 00006DH BYTE UNIT CODE ?PR?_TESTDUMMYCODE?TC_1 |
00011DH 00012CH 000010H BYTE UNIT CODE ?L?COM0002 |
00012DH 000147H 00001BH BYTE UNIT CODE ?L?COM0001 |
000148H 000149H 000002H BYTE UNIT CODE ?PR?FAIL?TC_1 |
|
correct: |
START STOP LENGTH ALIGN RELOC MEMORY CLASS SEGMENT NAME |
========================================================================= |
.... |
000081H 000088H 000008H BYTE UNIT CODE ?L?COM0006 |
000089H 000090H 000008H BYTE UNIT CODE ?L?COM0007 |
000091H 000098H 000008H BYTE UNIT CODE ?PR?MAIN?TC_0 |
000099H 00009AH 000002H BYTE UNIT CODE ?PR?FAIL?TC_1 |
00009BH 000107H 00006DH BYTE UNIT CODE ?PR?_TESTDUMMYCODE?TC_1 |
000108H 000117H 000010H BYTE UNIT CODE ?L?COM0002 |
000118H 000132H 00001BH BYTE UNIT CODE ?L?COM0001 |
000133H 00014BH 000019H BYTE UNIT CODE ?PR?TEST?TC_1 <-----------------------------------------------+
-
Corrected: CONST When using the SEGMENTS directive
to specify an address, the segment address was moved during
linker code packing. For example:
C-Code snippet:
#pragma userclass(code = XXX)
const char code xxx[30] _at_ 0x1234;
LX51 CSAMPLE2.obj TO CSample CLASSES (CODE(C:0X2000-C:0X2FFF), CONST(C:0X2000-C:0X2FFF), ECODE(C:0X2000-C:0X2FFF), HCONST(C:0X2000-C:0X2FFF))
wrong:
START STOP LENGTH ALIGN RELOC MEMORY CLASS SEGMENT NAME
=========================================================================
000000H 000002H 000003H --- OFFS.. CODE ?CO??C_STARTUP?0
000003H 000019H 000017H BYTE UNIT CODE_XXX ?PR?GETNUMBER?CSAMPLE2
00001AH 0000A3H 00008AH BYTE UNIT CODE_XXX ?PR?_ATOI?CSAMPLE2
0000A4H 0000B4H 000011H BYTE UNIT CODE_XXX ?PR?_GETLINE?CSAMPLE2
0000B5H 0000B6H 000002H --- --- **GAP**
0000B7H 0000D4H 00001EH BYTE OFFS.. CODE_XXX ?CO?CSAMPLE2?0
0000D5H 001FFFH 001F2BH --- --- **GAP**
002000H 002364H 000365H BYTE UNIT CODE ?PR?PRINTF?PRINTF
correct:
START STOP LENGTH ALIGN RELOC MEMORY CLASS SEGMENT NAME
=========================================================================
000000H 000002H 000003H --- OFFS.. CODE ?CO??C_STARTUP?0
000003H 000019H 000017H BYTE UNIT CODE_XXX ?PR?GETNUMBER?CSAMPLE2
00001AH 0000A3H 00008AH BYTE UNIT CODE_XXX ?PR?_ATOI?CSAMPLE2
0000A4H 0000B4H 000011H BYTE UNIT CODE_XXX ?PR?_GETLINE?CSAMPLE2
0000B5H 001233H 00117FH --- --- **GAP**
001234H 001251H 00001EH BYTE OFFS.. CODE_XXX ?CO?CSAMPLE2?0
001252H 001FFFH 000DAEH --- --- **GAP**
002000H 002364H 000365H BYTE UNIT CODE ?PR?PRINTF?PRINTF
-
Corrected: Do not show empty segments as overlapping. For
example:
START STOP LENGTH ALIGN RELOC MEMORY CLASS SEGMENT NAME
=========================================================================
010000H 010007H 000008H SEG UNIT ECODE C3
010008H 010008H 000001H BYTE UNIT ECODE C2
*** OVERLAP *** <--- There is no real overlap because the next segment is empty
010008H --- 000000H BYTE UNIT ECODE C1
-
[µVisionVision]
-
This C51 release comes with µVision
V5.14.2.1.
|