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

External RAM memory tester program

Hello,
I am trying to check if addresses bus and data bus are well configured in my external RAM memory.
I have done this algorithm

#include <XC164.h>

#define         low_adress   0x400000;
#define         high_adress   0x410000;
#define         high_data   0xFF;
#define         low_data   0x00;

void    main    (void)
{
        static double    idata  j,i,k;
        int xhuge       *DIR;

        DIR  = 0x400000;

        /*      DATA BUS TEST   */

        for (j = low_adress; j <= high_adress; j++)
        {
                *DIR = 0x55;                                    // I write 0101 0101
                if (*DIR != 0x55)       P3^3 = 1;       // If what I have read is diferent to what I have written, I switch on an alarm
                *DIR = 0xAA;                                    // I write 1010 1010
                if (*DIR != 0xAA)       P3^3 = 1;       // If what I have read is diferent to what I have written, I switch on an alarm
                DIR++;
        }

        /*      ADRESSES BUS TEST       */

        DIR  = 0x400000;
        for (i = low_adress; i < high_adress; i = i + 0xFF;)
        {
                for     (k = low_data; k < high_data ; k++)
                {
                        *DIR = k;
                        DIR++;
                }
        }


but the compiler throws errors. My RAM memory is mapped from 0x400000 to 0x410000 (64kB).
Why does the compiler throw this errors?

Build target 'Target 1'
assembling START_V2.A66...
compiling PruebaRA.c...
PRUEBARA.C(17): error C25: syntax error near '='
PRUEBARA.C(17): error C25: syntax error near ';'
PRUEBARA.C(17): error C25: syntax error near ')'
PRUEBARA.C(20): error C25: syntax error near 'if'
PRUEBARA.C(20): error C25: syntax error near 'P3'
PRUEBARA.C(20): error C25: syntax error near '='
PRUEBARA.C(22): error C25: syntax error near 'if'
PRUEBARA.C(22): error C25: syntax error near 'P3'
PRUEBARA.C(22): error C25: syntax error near '='
PRUEBARA.C(24): error C25: syntax error near '}'
PRUEBARA.C(29): error C25: syntax error near 'for'
PRUEBARA.C(29): error C7: compilation aborted
Target not created

Parents Reply Children
  • Per, as it is written in Tamirs article toverify if the program writes well or not, is only needed any adress and probe that all posible datas are well written.
    Although, the program is destructive, at first the memory doesn't contain any critical data.

  • Ups, I didn't read the last post of Tamir. It seems that I donÂ't understand well the article.

  • The code a number of bit patterns, so (unless you have capacitive "memory" from a non-multiplexed memory interface) it does test that no data line is shorted to plus, to ground or to a neighbour.

    That is a good test.

    But it does not test each individual memory address of the memory. The loop in the function steps through test patterns, not memory addresses. Think about it - you specify a pointer, but not a memory size. How would the function know how many memory addresses to test?

    That loop is your responsibility. The reason for this is that it allows you to find - and be able to report - each and every memory cell that fails.

    But there are another problem that isn't tested. And that is errors with the address lines, giving aliasing between memory cells. Let's say that one address line is shorted. You think that you write to address x. But because of the short, you write to memory cell (x | pattern) or (x & pattern).

    Because of this, a full memory test should not just test individual memory cells one-by-one, but it should also try to find aliasing. An example (assuming that 'base' is the start address of the memory, and that the memory has a size 2^n and that 'base' has the n lowest bits zero:
    - Clear all memory to zero.
    - write 1 at address (base+0)
    - write 2 at (base+1)
    - write 3 at (base+2)
    - write 4 at (base+4)
    - write 5 at (base+8)
    - write 6 at (base+16)
    ...
    - walk through the memory and verify that all memory cells are zero, with the explicit exception of the addresses you wrote above.

    Each of the above writes sets one address line high, and writes a value. If an address line is shorted low, that specific write will write to the wrong address. If an address line is shorted high, all but one of the writes will write to the wrong address. If two address lines are shorted together, two of the above writes will write to the wrong address.

    But for the fourth time: If call memTestDataBus() on a memory address that stores critical data used by memTestDataBus() or by main() or by an interrupt (unless you have turned off interrupts) your program will fail badly.

    memTestDataBus() can be modified to work better by storing the original value of a data cell before testing it, and putting back the original value before returning.

    That will not help if you have interrupts enabled. And it will not work if you test the memory addresss used for the parameter 'address' or the loop variable 'pattern' or the new temp variable used to store the original value of the cell. Making sure that the temp value, 'pattern' and 'address' are stored in register variables would also be needed to make memTestDataBus() reasonably useable.