This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Far Memory

In the new update pakage there is a subdirectory ..\c51\examples\farmemroy\4MB variable on clasic 8051, the project file "Far 8051" in this DIR can be compiled correct without any error,but when I use the uv2 DEBUG to test the result,
the following phrases and sentences can not work properly:
for (i = 0; i < sizeof (large_array0); i++) {
large_array0[i] = (unsigned char) i; // just an example
large_array1[i] = (unsigned char) i+0x80; // just an example
}
for (i = 0; i < 20; i++) {
printf ("\nRead large_array1[0x%X]=%bX", i, large_array1[i]);
}

can not printf any infomation on the serial window, please tell me what's the matter? are this a BUG?

  • For a start, please use the &ltpre&gt and &lt/pre&gt tags, so taht we can follow the code you post:

    for (i = 0; i < sizeof (large_array0); i++) 
    {
       large_array0[i] = (unsigned char) i;      // just an example
       large_array1[i] = (unsigned char) i+0x80; // just an example
    }
    for (i = 0; i < 20; i++) 
    {
       printf ("\nRead large_array1[0x%X]=%bX", i, large_array1[i]);
    }

    Putting aside the Far memory, can you get printf to work at all?
    If you just use "ordinary" memory, does it work?

    What data type is i?
    Do you need to add a size specifier; eg, 'L' for long?
    (search this forum for printf problems - and see Appendix F in the manual)

  • these sentence are quoted from examples of keil C51 update pakage, I mean only in this example printf can not work properly, other wise it really works well

    the "main.c" file is as follows:


    #include <REG320.H> // SFR definition header file
    #include <stdio.h> // prototype declarations for I/O functions

    #ifdef MONITOR51 // Debugging with Monitor-51 needs
    char code reserve [3] _at_ 0x23; // space for serial interrupt if
    #endif // Stop Exection with Serial Intr.


    /*
    * this large arrays are stored 'banked' xdata and code memory
    */
    unsigned char far large_array0[0x8000];
    extern unsigned char far large_array1[0x8000];
    const unsigned char far large_carray[0x8000] = { 1, 2, 3, 4, 5 };

    /*
    * the following timer interrupt routine uses a variable in xdata space
    */
    #define PERIOD -250 // 250 usec interrupt period
    unsigned char xdata timer_tick; // xdata variable

    void timer0 (void) interrupt 1 using 1 { // Int Vector at 000BH, Reg Bank 1
    timer_tick++; // increment xdata variable
    }

    /*------------------------------------------------
    The main C function. Program execution starts
    here after stack initialization.
    ------------------------------------------------*/

    void main (void) {
    unsigned int i;
    /*------------------------------------------------
    Setup the serial port for 1200 baud at 16MHz.
    ------------------------------------------------*/
    #ifndef MONITOR51
    SCON0 = 0x50; // SCON: mode 1, 8-bit UART, enable rcvr
    TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload
    TH1 = 221; // TH1: reload value for 1200 baud @ 16MHz
    TR1 = 1; // TR1: timer 1 run
    TI = 1; // TI: set TI to send first char of UART
    #endif

    /* setup the timer 0 interrupt */
    TH0 = (unsigned char) PERIOD; // set timer period
    TL0 = (unsigned char) PERIOD;
    TMOD = TMOD | 0x02; // select mode 2
    TR0 = 1; // start timer 0
    ET0 = 1; // enable timer 0 interrupt
    EA = 1; // global interrupt enable

    for (i = 0; i < sizeof (large_array0); i++) {
    large_array0[i] = (unsigned char) i; // just an example
    large_array1[i] = (unsigned char) i+0x80; // just an example
    }
    for (i = 0; i < 20; i++) {
    printf ("\nRead large_array1[0x%X]=%bX", i, large_array1[i]);
    }
    for (i = 0; i < 20; i++) {
    printf ("\nRead large_array2[0x%X]=%bX", i, large_array1[i]);
    }
    for (i = 0; i < 20; i++) {
    printf ("\nRead large const array[0x%X]=%bX", i, large_carray[i]);
    }
    while (1);
    }




  • To get the serial to print:

    Add a "setb TI" to the code, or click TI in Peripherals/serial/irq in UV2 debugger.

  • will keil surport kindly to investigate the far memory example of 4MB varibales on classic 8051? this example is included in the new update package(keil\c51\examples\farmemory\4MB variables on classic 8051),I tried it several times,it still can not work!

  • Please send your problem to an official support email address and provide us with your serial number.