Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Константы линкера LINK30 (для C30)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Harvester
Не может ли кто подсказать, как в программе на Си использовать константы,
определенные в сценарии линкера (*.gld)?

Скажем, в сценарии имеется такая строчка:
Код
__MY_BASE = 0x1700

Если я пишу в программе
Код
SPLIM = __MY_BASE;

то компилятор ругается на то, что идентификатор __MY_BASE не определён.
А при использовании ассемблерных вставок
Код
asm("mov #__MY_BASE,w0");
asm("mov w0,SPLIM");

все работает нормально.
Alex B._
Цитата(Harvester @ Aug 12 2009, 16:29) *
компилятор ругается на то, что идентификатор __MY_BASE не определён.

пишите _MY_BASE (с одним подчеркивание в начале).
Harvester
Цитата(Alex B._ @ Aug 13 2009, 10:15) *
пишите _MY_BASE (с одним подчеркивание в начале).


Не, не получается, та же ошибка sad.gif
Кстати, это было первое, что мне предложили в техподдержке микрочипа.

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

Техподдержка думает дальше smile.gif
testerplus
Нужно и "extern", и "одно подчеркивание":

Код
extern int _MY_BASE;
...
SPLIM = _MY_BASE;


Я сам этим пользовался.
testerplus
Пардон, амперсанд пропустил:

Код
SPLIM = &_MY_BASE;
Harvester
Цитата(testerplus @ Aug 20 2009, 18:41) *
Пардон, амперсанд пропустил:

Код
SPLIM = &_MY_BASE;

Уже лучше! Правда все равно не универсально.
Пусть __MY_BASE = 0x172E.
Тогда строки
Код
   asm("mov #__MY_BASE - 0x08,w2");
   asm("mov w2,SPLIM");

дадут код
Код
   mov.w #0x1726,0x0004
   mov.w 0x0004,0x0020

а выражение
SPLIM = &_MY_BASE - 0x08;
даст код
Код
   mov.w #0x171e,0x0000
   mov.w 0x0000,0x0020

Как видно, в последнем случае в SPLIM пишется совсем не то, что хотелось бы
testerplus
Ну, так она же определена как int. Определите как unsigned char, и все встанет на свои места:
Код
extern unsigned char _MY_BASE;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.