реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Константы линкера LINK30 (для C30), Использование констант линкера в программе
Harvester
сообщение Aug 12 2009, 12:29
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Не может ли кто подсказать, как в программе на Си использовать константы,
определенные в сценарии линкера (*.gld)?

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

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

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

все работает нормально.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
Alex B._
сообщение Aug 13 2009, 07:15
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 943
Регистрация: 6-07-04
Из: Санкт-Петербург
Пользователь №: 274



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

пишите _MY_BASE (с одним подчеркивание в начале).
Go to the top of the page
 
+Quote Post
Harvester
сообщение Aug 20 2009, 10:03
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



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


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

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

Техподдержка думает дальше smile.gif


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
testerplus
сообщение Aug 20 2009, 13:25
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 7-08-08
Из: SPb
Пользователь №: 39 471



Нужно и "extern", и "одно подчеркивание":

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


Я сам этим пользовался.

Сообщение отредактировал testerplus - Aug 20 2009, 13:26
Go to the top of the page
 
+Quote Post
testerplus
сообщение Aug 20 2009, 15:41
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 7-08-08
Из: SPb
Пользователь №: 39 471



Пардон, амперсанд пропустил:

Код
SPLIM = &_MY_BASE;
Go to the top of the page
 
+Quote Post
Harvester
сообщение Aug 21 2009, 13:01
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(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 пишется совсем не то, что хотелось бы


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
testerplus
сообщение Aug 21 2009, 13:14
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 7-08-08
Из: SPb
Пользователь №: 39 471



Ну, так она же определена как int. Определите как unsigned char, и все встанет на свои места:
Код
extern unsigned char _MY_BASE;
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 06:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016