Встраивание константы в определенную ячейку памяти - PullRequest
0 голосов
/ 13 февраля 2019

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

Я попытался объявить константы в начале раздела #pragma, чтобы я знал, с чего он начался.

#pragma CODE_SEG SHADOW_ROM
const UINT8 VER_MAJOR = 0xFE;
const UINT8 VER_MINOR = 0xED;
const UINT16 VER_BUILD = 0xCEFA;

S12 является прямым порядком байтов, поэтому я ожидал, что смогу найти в сгенерированном файле .sx FEEDFACE, но не смог найти даже FEED или FACE.У меня отключена оптимизация, поэтому компилятор не должен удалять неиспользуемые константы.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Прежде всего, определение глобального значения const позволяет компилятору использовать только значение (в качестве значения r, поскольку вы обычно не ссылаетесь на адрес MATH_PI) и использовать значение в каждом месте, где ономожет быть необходимо.Если вы хотите, чтобы константа была размещена на фиксированном сайте, лучший способ указать это на ассемблере.

Когда я был молодым, я использовал команду Unix whatis, чтобы увидеть префикс #(@)строка, в которой обычно хранится информация о версии в системе ревизий SCCS.Когда мне пришлось переключиться на cvs, я использовал эту идею для определения констант в каждом исходном файле и поиска (это легко сделать с помощью grep(1) или некоторой программы-фильтра) для сканирования двоичного файла (да, двоичного кода программы) для строк, которые начинались в $Id:, поэтому я встраивал такие строки, как:

static const char CVS_id[] = "\n$Id$\n";

в исходные файлы, и когда grep(1) пропинговал двоичный файл, я получал полную ревизию для каждого модуля, связанного в исполняемом файле.

Git не помещает строку версии сама по себе, но лучшее (потому что ему не нужно помещать вещи в абсолютные адреса) - это поместить информацию о версии в строку с определенным шаблоном (git позволяетпоставить его для себя с помощью git hook ), чтобы его не перепутал со сканером код.Таким образом, вы можете получать информацию о версии каждого включенного исходного файла, просто сканируя двоичные файлы.

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

0 голосов
/ 13 марта 2019

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

0 голосов
/ 13 февраля 2019

Да, можно найти константу по определенному адресу памяти.Есть разные способы сделать это, и детали того, как это сделать, варьируются от одной цепочки инструментов к другой.Одним из способов является использование специфичного для компилятора оператора #pragma или _attribute_ в определении исходного кода, чтобы указать адрес памяти, где должна находиться константа.Другой способ - настроить файл директивы компоновщика (он же сценарий компоновщика или Scatter Load), создав специальный раздел памяти по нужному адресу памяти.Затем используйте #pragma в коде или другую инструкцию компоновщика, чтобы поместить константу в секцию пользовательской памяти.Подробности смотрите в документации по цепочке инструментов.

...