WhiteWolf
May 22 2007, 07:32
Здравствуйте.
Я пишу программу на Keil uVision v3.23 for ARM. Программа состоит из сишных и ассемблерных модулей. Мне необходимо, чтобы определенная часть программы помещалась в начале FLASH-памяти МК, а оставшаяся - после этой части. В справке по этому поводу есть описание директив линкера SEGMENTS и CLASSES. Но когда я пытаюсь использовать эти команды, результат нулевой.
Когда я вызываю из среды окно "Options for Target ...", и на закладке LA Locate пытаюсь определить новый класс для сегментов, например так: INITIAL_LOADER (0x80000-0x804FF), то при компиляции получаю:
*** ERROR L237: INVALID CLASS NAME
Описания этой ошибки в справке нет
Когда я директивой SEGMENTS хочу установить порядок следования сегментов - один раньше, второй после, то программа компилируется, но просмотр файла ProjectName.map показывает, что линкер никак не реагирует на мою директиву.
Я что-то делаю не так?
DeadMoroz
May 22 2007, 23:27
Если Вы используете RV компилятор, то для манипуляций с сегментами можно использовать scatter (.scf) файл (указывается в свойствах линкера). В Кейле есть соответствующие примеры.
Что-то типа этого (для AT91M40800):
LOAD_FLASH 0x00400000
{
Flash 0x00400000
{
File1.o (EnterPoint1, +First)
* (+RO)
}
ExtRAM 0x01400000
{
* (+RW, +ZI)
}
}
Т.е. во флэше первым будет лежать код из модуля File1 с точкой входа EnterPoint1, а далее будет остальной код (RO), во внешней памяти будут расположены все данные (RW, ZI).
WhiteWolf
May 28 2007, 06:24
Я использую Keil компилятор.
В общем, уже разобрался - линкер управляет сегментами именно так, как написано в справке. Виновата моя невнимательность при чтении справки - там написано, что имя класса сегмента должно начинаться с CODE, CONST или DATA. Порядок сегментов тоже задается как написано в справке - я оказывается смотрел не тот Map-файл (не из той папки, идиотская ошибка конечно).
Все равно спасибо за участие.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.