Я вже писав про метод додавання зовнішніх файлів в прошивку мікроконтролера, навіть написав для цієї мети онлайн-конвертер бінарного файлу в c-хедер. Однак є більш простий і зручний спосіб, який надає IAR, та й строго кажучи, будь-який линкер зобов'язаний вміти так робити.
Звичайно, ви вже зрозуміли - ми готові до десантування в параметри линкера.
Одна з найбільш частих моїх завдань за останній час - це збірка прошивки основного девайса, в яку вкомпілена прошивка дочірньої плати. Основний девайс при запуску перевіряє версію прошивки додаткової плати, і якщо вона молодша - оновлює її до свіжої. Тому я повинен включити в основну прошивку бінарний файл з дочірньою прошивкою.
Відкриваємо вікно Options -> Linker -> Input:
Внизу бачимо опції «Raw binary image». Це саме те, що нам потрібно, вказуємо файл.
Що позначають інші опції?
- Symbol - глобальний символ коду, це те ім'я, яке буде присвоєно масиву з вмістом файла. Я написав тут batp_fw, тому що це прошивка (firmware) плати BATP.
- Section - секція линкера, в якій файл буде розміщений. Напишемо тут «fw_section», тільки ще треба буде створити і розмістити цю секцію.
- Align - вирівнювання по межі байт, півслів або слів. Зазвичай я ставлю тут 4 (вирівняти по межі слів).
Вкажіть ім'я символу в віконці «Keep symbols», інакше символ (і весь масив) буде викинуть лінкером при складанні.
Збережіть зміни, і підемо правити скрипт линкера. Він лежить в папці проекту, щось на зразок stm32f4xx_flash.icf.
Я додав рядок
Ну і вишенька на торті, використання цього шматка пам'яті, як масив в програмі - це дуже ... ні, вкрай просто!
Звичайно, тип даних може бути будь-який зручний вам. Хочете звертатися побайтово - використовуйте char або краще uint8_t, хочете прискорити читання - звертайтеся пословно за допомогою unsigned int або краще uint32_t.
Однак, цей спосіб дає включити тільки один файл, якщо потрібно включити несколько- потрібно ручна правка командного рядка линкера.