Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Re: Как пользоваться переменными в ld-cкрипте?

Чт окт 28, 2021 17:06:54

UM10360, страница 620 мне говорит, что на LPC17xx всё, о чём я говорил выше применительно к СТМ32, точно также работает для LPC17хх.
Значит вам надо ещё раз перечитать этот мануал.
Программирование флешь в LPC осуществляется через IAP-API. И ни какое автоматическое перепрограммирование флеша, размещением там переменных - не будет работать.

Добавлено after 2 minutes 33 seconds:
А вот как в эти сегменты размещаются данные:
Спойлер
Код:
...

const uint8 __PLC_params[ SIZE_BYTE_PARAMS ] \
    __attribute__ ( (section( ".plc_params" ), used ) ) =
{
    MAX_STEP / 1000, 0x00,  // 00 0x0000 -- SIZE IN STEP 16000
    0x00, 0x00,             // 02        --
    0x00, 0x00,             // 04        --
    0x00, 0x00,             // 06        --

    0x20, 0x20,             // 08 0x0008 -- PASSWORD 0
    0x20, 0x20,             // 10        -- PASSWORD 1
    0x20, 0x20,             // 12        -- PASSWORD 2
    0x20, 0x20,             // 14        -- PASSWORD 3

    'S', 'K',               // 16 0x0010 -- PLC NAME 0
    '2', 'N',               // 18        -- PLC NAME 1
    '-', 'F',               // 20        -- PLC NAME 2
    '4', '1',               // 22        -- PLC NAME 3
    '1', 'R',               // 24        -- PLC NAME 4
    'E', '-',               // 26        -- PLC NAME 5
    'B', 'o',               // 28        -- PLC NAME 6
    'k', 'r',               // 30        -- PLC NAME 7
    'a',  0,                // 32        -- PLC NAME 8
     0,   0,                // 34        -- PLC NAME 9
     0,   0,                // 36        -- PLC NAME A
     0,   0,                // 38        -- PLC NAME B
     0,   0,                // 40        -- PLC NAME C
     0,   0,                // 42        -- PLC NAME D
     0,   0,                // 44        -- PLC NAME E
     0,   0,                // 46        -- PLC NAME F
    ...
};
const uint16 __PLC_prog[ MAX_STEP ] \
    __attribute__ ( (section( ".plc_prog" ), used ) ) =
{
    0x2800, 0xC801, 0x001C, // -|M0|-(M1)-
    0xFFFF,                 // ----[FEND]-
    0x000F                  // -----[END]-
};

const uint16 __PLC_D8XXX[ 256 ] \
    __attribute__ ( (section( ".plc_D8xxx" ), used ) ) =
{
    0x00C8,             // D8000 - WDT 200ms
   ...
};


const uint16 __PLC_storredRegisters[ STORRED_REGS_NUM ] \
    __attribute__ ( (section( ".plc_data_regs" ), used ) ) =
{
   0
};

...

И где же там хоть одна переменная? Вы разницу между переменной и константой понимаете???
Знаете что такое "переменная"?

Re: Как пользоваться переменными в ld-cкрипте?

Чт окт 28, 2021 17:58:24

С флэш во всех МК работают по одной и той же схеме: разблокировали, стёрли сегмент/страницу, записали, заблокировали. Тем более оба на ARM.

Вот передо мной лежат два ПЛК, мой на STM32F411 и китайский на LPC1768. Я пишу программы и загружаю их во флэш МК. И запускаю.

jcxz писал(а):Знаете что такое "переменная"?

Я- да. Если я могу в процессе работы программы изменить содержимое какой-либо области памяти, то эта область, естественно, называться "переменной".
Видимо, jcxz смутило слово "const" из арсенала С++. Его я использовал, чтобы компилятор блокировал явную запись в эти области. Даже если я уберу "const", линковщик всё равно уложит эти переменные во флэш и выдаст мне адреса, по которым он их разместил, чтобы я мог в процессе работы своей программы писать в эти области, предварительно сняв с них блокировку и очистив страницу, в которой эти переменные размещены.

Re: Как пользоваться переменными в ld-cкрипте?

Чт окт 28, 2021 22:31:02

Переменные константы флеш ld-скрипты, все собрали.

Создаете структуру, в ней переменные, выравнивание по границе 1024, размер куска для стирания,
эти 1024 байта будут зарезервированы под структуру, и линковщик не помещает туда программный код, уж всяко проверил.
Кроме всего прочего, начало этой таблицы всегда с начало страницы.
Адрес первого элемента структуры и будет, начало страницы.

Re: Как пользоваться переменными в ld-cкрипте?

Чт окт 28, 2021 23:19:30

выравнивание по границе 1024

У структуры-то? Жесть какая! И куча флеша коту под хвост. И МК сдохнет намного быстрей.
Советую-таки почитать, как правильно организовывать эмуляцию EEPROM во FLASH!
Записываешь первую структуру. Дальше, если надо поменять настройки, по следующему адресу пишешь вторую. И так далее, пока вся флеш-память не кончится. Как кончилась, стираешь все нафиг и пишешь сначала. Получается очень приличная экономия по сравнению с "записали 10 раз структуру, флешь кончилась, стерли и пишем заново", а размер структуры — байт 40!..
Для того, чтобы при старте МК не тупить несколько секунд в линейном поиске, нужно использовать поиск бинарный. Все легко и просто.
А для того, чтобы знать, откуда ж начинается "хранилище", и нужна секция, выровненная на размер блока сразу после прошивки.

Re: Как пользоваться переменными в ld-cкрипте?

Пт окт 29, 2021 08:38:20

Eddy_Em писал(а):И так далее, пока вся флеш-память не кончится.
Это если у тебя куча памяти, а если нет, а если ты ограничен, а если у тебя всего 16к, и программный код занимает 12-14к, тогда как?
Eddy_Em писал(а):а размер структуры — байт 40!
Вот если каждый раз сдвигать в пределах одной страницы памяти эти 40 байт, тогда да, я с тобой соглашусь.
Я зря наверное написал "переменная", надо было "const".

СпойлерПомню одно оборудование, не важно какое, так там ресурс флеш микросхемы был 10к циклов, в инструкции к оборудованию это было написано, так мы тыкали тыкали, потом в город отправили, тот тыкал тыкал, потом из города приехало опять к нам, и опять мы тыкали тыкали, а оно, оборудование, все работало и работало, я имею ввиду сохраняла настройки.

Так что для сохранения настроек ресурса в 10к хватит.
А если тебя это смущает, то можно явно указать адрес последней страницы флеш.

Кстати Eddy_Em, твой алгоритм uart-dma-tx на f0 плохо работает, капризничает, я тебе потом оставлю это в коде, на доработку.

Re: Как пользоваться переменными в ld-cкрипте?

Пт окт 29, 2021 08:47:24

На каких скоростях плохо работает? Тестировал до мегабода, проблем не было.
Да и фотометр с двумя платами на F030 уже который год исправно работает... А на всех других железках у меня подключение по USB или CAN. 232 или 485 уже давно не использовал.
Ответить