Перейти к содержанию
    

Считывание кейлом старт прошивки и ее длину

2 minutes ago, aaarrr said:

Потому что содержимое hash.o волшебным образом превратилось в RW.

объявление выше привел. Оно const. Что делаем?

3 minutes ago, aaarrr said:

Смешно, но это оно на volatile так реагирует.

убрать этот volatile?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, Метценгерштейн said:

убрать этот volatile?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, aaarrr said:

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

Почему? Кто знает что там хеш? Там конст массив. Он для программы не изменяется. Volatile не нужен программе

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

убрал volatile
image.thumb.png.1318bd6ba4cc223142473114569ac783.png

но прошивка такая же. Массив в том же месте- не уехал вниз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 minutes ago, Метценгерштейн said:

Он для программы не изменяется. Volatile не нужен программе

В том-то и дело, что компилятор считает его неизменным, и вправе провести оптимизацию на основании своих представлений о содержимом. Это тот случай, когда volatile нужен.

11 minutes ago, Метценгерштейн said:

Массив в том же месте- не уехал вниз.

Верните hash_section в конец региона загрузки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, aaarrr said:

Верните hash_section в конец региона загрузки.

можете уточнить?

в скатере?

вот сейчас он такой:

LR_IROM1 0x00000000  {    ; load region size_region
    ER_IROM1 0x00000000 {  ; load address = execution address
        *.o (NUC_INIT, +First)
        *(InRoot$$Sections)
        .ANY (+RO)
        *.o (hash_section, +last)
    }
    RW_RAM1 +0  {  ; RW_RAM1 start address is after ER_ROM1 (было + 0 в оригинале)
        .ANY (+RW +ZI)
    }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, aaarrr сказал:

В том-то и дело, что компилятор считает его неизменным, и вправе провести оптимизацию на основании своих представлений о содержимом. Это тот случай, когда volatile нужен.

Достаточно передать указатель на этот массив в ассемблерную функцию (где-нибудь вызываемую естественно) и можно не беспокоиться, что оптимизатор создаст её копии и можно обойтись без volatile. Указатель на этот массив в си-шные функции лучше тоже передавать через ассемблерную прослойку.
Костыль конечно, но не тяжёлый.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, jcxz said:

Достаточно передать указатель на этот массив в ассемблерную функцию (где-нибудь вызываемую естественно) и можно не беспокоиться, что оптимизатор создаст её копии и можно обойтись без volatile. Указатель на этот массив в си-шные функции лучше тоже передавать через ассемблерную прослойку.
Костыль конечно, но не тяжёлый.

не решает задачу. RO становится, но массив все равно не в конце бин файла расположен. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, Метценгерштейн сказал:

не решает задачу. RO становится, но массив все равно не в конце бин файла расположен. 

Я вообще-то говорил о способе избавиться от необходимости volitile, а не о размещении.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

LR_IROM1 0x00000000  {    ; load region size_region
    ER_IROM1 0x00000000 {  ; load address = execution address
        *.o (NUC_INIT, +First)
        *(InRoot$$Sections)
        .ANY (+RO)
    }
    RW_RAM1 +0  {  ; RW_RAM1 start address is after ER_ROM1 (было + 0 в оригинале)
        .ANY (+RW +ZI)
    }
    ER_IROM2 +0 {
        *.o (hash_section, +last)
    }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да, в конце:
image.thumb.png.e4b01024af3fd7d8f6b2ea9d1ed446e0.png

вот он уже в мап файле разместился после RAM сектора

image.thumb.png.c297ac47216407fa119561030d8179e3.png

 

Тогда в принципе, да, отлично.

Еще раз спасибо всем!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/29/2024 at 4:54 PM, aaarrr said:
LR_IROM1 0x00000000  {    ; load region size_region
    ER_IROM1 0x00000000 {  ; load address = execution address
        *.o (NUC_INIT, +First)
        *(InRoot$$Sections)
        .ANY (+RO)
    }
    RW_RAM1 +0  {  ; RW_RAM1 start address is after ER_ROM1 (было + 0 в оригинале)
        .ANY (+RW +ZI)
    }
    ER_IROM2 +0 {
        *.o (hash_section, +last)
    }
}

Так сработало, в конце прошивки размещен массив:
image.thumb.png.07cd99126c91bb4f4f0bfdcf6159f0d2.png

Но вот в коде я его прочитать не могу. Само содержание памяти по этому адресу содержит нули. Вся прошивка при старте загружена в ОЗУ, содержимое совпадает, кроме этого куска. Как сделать чтобы и этот массив подгружался в ОЗУ?
Сам массив объявлен так:

#include <stdio.h>

const volatile unsigned char fw_hash[32];
static unsigned char const volatile fw_hash[32] __attribute__((section("hash_section"), used)) = {94,94,94,94,95,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94};

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Метценгерштейн said:

Вся прошивка при старте загружена в ОЗУ, содержимое совпадает, кроме этого куска.

Как-то очень странно. Можете map приложить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

==============================================================================

Memory Map of the image

  Image Entry point : 0x00000000

  Load Region LR_IROM1 (Base: 0x00000000, Size: 0x0001e5dc, Max: 0xffffffff, ABSOLUTE)

    Execution Region ER_IROM1 (Exec base: 0x00000000, Load base: 0x00000000, Size: 0x0001e054, Max: 0xffffffff, ABSOLUTE)

    Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x00000000   0x00000000   0x000000fc   Code   RO          692  * NUC_INIT            startup.o
    0x000000fc   0x000000fc   0x00000008   Code   RO          977  * !!!main             c_5.l(__main.o)
    0x00000104   0x00000104   0x0000003c   Code   RO         1207    !!!scatter          c_5.l(__scatter.o)
 0x0001df2c   0x0001df2c   0x0000004f   Data   RO          323    .conststring        ehci_iso.o
    0x0001df7b   0x0001df7b   0x00000001   PAD
    0x0001df7c   0x0001df7c   0x00000095   Data   RO          434    .conststring        support.o
    0x0001e011   0x0001e011   0x00000003   PAD
    0x0001e014   0x0001e014   0x00000040   Data   RO         1203    Region$$Table       anon$$obj.o


    Execution Region RW_RAM1 (Exec base: 0x0001e054, Load base: 0x0001e054, Size: 0x00075004, Max: 0xffffffff, ABSOLUTE)

    Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x0001e054   0x0001e054   0x00000018   Data   RW            3    .data               heap_2.o
    0x0001e06c   0x0001e06c   0x00000004   Data   RW           55    .data               port.o
    0x0001e070   0x0001e070   0x0000003c   Data   RW          126    .data               tasks.o
    0x0001e0ac   0x0001e0ac   0x00000003   Data   RW          160    .data               ff.o
    0x0001e0af   0x0001e0af   0x00000001   PAD
 0x00092efc        -       0x00000018   Zero   RW          739    .bss                descriptors.o
    0x00092f14        -       0x000000e4   Zero   RW          934    .bss                c_5.l(rand.o)
    0x00092ff8        -       0x00000060   Zero   RW         1070    .bss                c_5.l(libspace.o)


    Execution Region ER_IROM2 (Exec base: 0x00093058, Load base: 0x0001e5bc, Size: 0x00000020, Max: 0xffffffff, ABSOLUTE)

    Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x00093058   0x0001e5bc   0x00000020   Data   RW          683    hash_section        hash.o


==============================================================================

Image component sizes


      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Object Name

        64          8          0          0          0        537   check_firmware.o

три куска подряд идут с мапа

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...