Агрегат ARM7 отсутствие данных в памяти

Я провел больше дня, пытаясь понять, что происходит. Я даже не могу запустить тестовый проект, считывая данные из памяти.

В этом случае мне просто нужно сохранить некоторые данные в памяти, прочитать его, а затем обработать и сохранить его обратно в память.

Вот мой код

    AREA    RESET, CODE, READONLY
    ENTRY
    LDR   r0, =SortArray ;load start address
    LDR   r1, =SortArrayEnd ; load end address
    LDR r4, [r0]
    SUB r2, r2, #1 ; r2 contains (LENGTH-1)
    MOV r6, #0 ; r6 sum set to 0
STOP B STOP
    LTORG
    AREA my_data, DATA, READWRITE 
    ALIGN
SortArray
    DCD 1,5,20,32,13,66,3,5,23,64,112,66,22 
SortArrayEnd

    END

Вот что я получаю при отладке проекта

Введите описание изображения здесь
Введите описание изображения здесь

Почему нет данных, хранящихся в памяти ??
Конечно, когда я читаю память от этого адреса ничего не ставится в реестр.

Я безуспешно пытался решить эту проблему.

Здесь некоторые дополнительные связанные вопросы.

  1. Почему адрес данных 0x40000000. Это из — за внутренней карты памяти моего MC (LPC2148) ? Начиная с этого адреса SRAMнаходится память. Я прав ?
  2. Почему данные, хранящиеся в разных областях, не могут быть переданы напрямую без =знака LDRкоманды, с аппаратной и программной точки зрения ?
  3. Вся связь осуществляется через адреса памяти, поэтому некоторые другие периферийные устройства могут быть просто сопоставлены с определенным адресом и подключены к шине памяти? Как это делается на аппаратном уровне ? Как дать RAND прибора/шины specifc адреса ?

Я был бы благодарен за любую помощь или совет.

1 ответ

  1. Это не прямой ответ; просто пример использования инструментов GNU. Даже если вы используете различные инструменты, это может помочь некоторым.

    .bss
            SortArrayEnd:   .word 0
    .data
            fmt:            .string "%d %d %d\n"
            SortArray:      .word 1,5,20,32,13,66,3,5,23,64,112,66,22
            .equ            len.SortArray,.- SortArray
    .text
            .global main
    
    main:
            nop
            ldr r9,=SortArray               // point to array
            ldr r10,=SortArrayEnd           // point to array
    
            ldr r1, [r9]                    // load array value @ element 0
            mov r2, #len.SortArray
            sub r2, r2, #4
    
            str r1, [r10]                   // store value into diff array element 0
            ldr r3, [r10]                   // load element 0 from diff array into GPR for printing
    
            bl write
    
    exit:
            mov r7, #1
            svc 0
    
    write:
            push {r1-r4,lr}
            ldr r0,=fmt
            bl printf
            pop {r1-r4,pc}
    

    Шагнув в код с GDB, вы увидите, что элементы массива присутствуют в указателе массива

    (gdb) x/16 $r9
    0x20612:        1       5       20      32      13      66      3       5
    0x2061a:        23      64      112     66      22      0       0       0
    

    Шагнув дальше, вы увидите новое загруженное значение в другой указатель массива

    (gdb) x/4 $r10
    0x20643:        1       0       0       0