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

 
 
5 страниц V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
> Вопрос по IAR, Настройки среды программирования
Xenia
сообщение Nov 17 2013, 12:01
Сообщение #31


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(d7d1cd @ Nov 17 2013, 15:08) *
Пока делал это, обнаружил следующую проблему. В функции на С++, для которой указано конкретное расположение, используется операция деления. Из отладчика я увидел, что операция деления - это тоже функция. И ее линкер размещает не в моем сегменте. Как сделать так, чтобы было в моем?


Функция деления выбирается из библиотеки. Компилятор ее не компилирует, т.к. библиотека уже находится в скомпилированном виде. А, значит, и сегмент у той функции такой, в каком компилировалась библиотека. И если сегменты вашего кода и библиотеки называются по разному, то и функциям никак не быть вместе.

В тех же случаях, когда библиотечная функция обособлена (не вызывает в своем теле других библиотечных функций), то вы можете взять ее код из сорцов библиотеки и присоединить к своему коду. Тогда она откомпилируется вместе с вашим кодом и окажется вашем сегменте. А по правилам линковки библиотека линкуется последней, а потому к коду будет пришит вами скомпилированный экземпляр, а не библиотечный.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 17 2013, 12:49
Сообщение #32


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(Xenia @ Nov 17 2013, 16:01) *
...вы можете взять ее код из сорцов библиотеки и присоединить к своему коду. Тогда она откомпилируется вместе с вашим кодом и окажется вашем сегменте. А по правилам линковки библиотека линкуется последней, а потому к коду будет пришит вами скомпилированный экземпляр, а не библиотечный.

Как же мне это сделать (взять код из сорцов библиотеки), если, как Вы сказали, библиотека уже скомпилирована? Можно попросить привести примерчик?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 17 2013, 13:13
Сообщение #33


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(d7d1cd @ Nov 17 2013, 16:49) *
Как же мне это сделать (взять код из сорцов библиотеки), если, как Вы сказали, библиотека уже скомпилирована? Можно попросить привести примерчик?

Если у вас полная версия, то исходники библиотек она тоже должна включать. Лежат тут:
\IAR Systems\Embedded Workbench X.x\430\src\lib\
Только сам компиятор в эти исходники не лазает, а пользуется уже скомпилированным вариантом под конкретно ваш МК:
\IAR Systems\Embedded Workbench X.x\430\lib\
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 22 2013, 07:29
Сообщение #34


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



И снова здравствуйте. Подскажите, пожалуйста, как в одном заголовочном файле объявить константы и для модуля С++ и для модуля на ассемблере? Пытался разместить в таком файле следующие константы:
Код
#define VAR (0x0200)
__no_init volatile int Variable @ VAR;

Если такой заголовочный файл добавить в модуль на С++, то компиляция ошибок не вызывает. А вот в модуле на ассемблере происходит ругань на вторую строку.

Стандартные заголовочные файлы при их инклуде к модулю на любом языке при компиляции ошибок не создают. Я так же хочу сделать свой модуль...
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 22 2013, 11:23
Сообщение #35


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(d7d1cd @ Nov 22 2013, 11:29) *
Подскажите, пожалуйста, как в одном заголовочном файле объявить константы и для модуля С++ и для модуля на ассемблере? Пытался разместить в таком файле следующие константы:
Код
#define VAR (0x0200)
__no_init volatile int Variable @ VAR;

Если такой заголовочный файл добавить в модуль на С++, то компиляция ошибок не вызывает. А вот в модуле на ассемблере происходит ругань на вторую строку.
Стандартные заголовочные файлы при их инклуде к модулю на любом языке при компиляции ошибок не создают. Я так же хочу сделать свой модуль...


Стандартные заголовочные файлы только потому "интернациональны", что содержат в себе условную компиляцию:
Код
#ifdef  __IAR_SYSTEMS_ICC__
   для C/C++ компилятора
#endif

#ifndef __IAR_SYSTEMS_ASM__
   для ассемблера
#endif

Тогда как определения констант через #define оба компилятора понимают одинаково хорошо (через один и тот же препроцессор текст проходит).
Отсюда и рекомендация: определять общие константы через #define в начале хидера, а если приходится что-то добавлять специфическое, отчего у одного из компиляторов возникает несварение желудка, то ставите это под условие __IAR_SYSTEMS_ICC__или __IAR_SYSTEMS_ASM__.

Поэтому ваш пример будет выглядеть как-то так:
Код
  #define VAR  0x0200
#ifdef  __IAR_SYSTEMS_ICC__
  __no_init volatile int Variable @ VAR;
#endif

Тогда оба компилятора получат одинаковые знания про константу VAR, но ассемблер не увидит сишную строку, которая его станет раздражать.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 22 2013, 16:36
Сообщение #36


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Спасибо, Xenia. Я пока не пробовал в компиляторе, но уже полностью Вам доверяю.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 23 2013, 16:53
Сообщение #37


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Все получилось. Спасибо. Есть еще вопрос по расположению кода. Есть 2 функции. Мне необходимо чтобы точки входа в эти функции располагались строго по определенным адресам (например, точка входа в первую функцию по адресу 0xFC60, во вторую - по адресу 0xFC64). Возможно ли такое?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 23 2013, 18:01
Сообщение #38


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(d7d1cd @ Nov 23 2013, 20:53) *
Спасибо. Есть еще вопрос по расположению кода. Есть 2 функции. Мне необходимо чтобы точки входа в эти функции располагались строго по определенным адресам (например, точка входа в первую функцию по адресу 0xFC60, во вторую - по адресу 0xFC64). Возможно ли такое?


За чем дело стало? Повторите снова тот же приём. Вы же уже раньше определяли сегмент
-Z(CODE)BOOT=F002-F0FF
и у вас всё получилось. Так определите теперь две таких штуки. С разными именами сегментов, конечно.

Вот только если точки входа так близко расположены: 0xFC60 и 0xFC64, вы врядли запихаете первую из функций в 4 байта. Следовательно у вас там есть место только для jmp-перехода. На C такого кода не написать, а на ассемблере - вполне. Напишите на ассемблере два джампа и вставьте пустые байты данных между ними, если это потребуется, чтобы второй джамп пришелся на 0xFC64. Тогда это будет всего один сегмент. Опять же на ассемблере гораздо проще расположить код в требуемых местах памяти.

Тем не менее, сдается мне, что вы собираетесь таким вычурным способом писать таблицу прерываний для загрузочного режима sm.gif. И если моя догадка верна, то всего этого делать не надо. А надо создать другой проект под бутовую часть, т.е. писать загрузчик в чистом виде, так чтобы и таблица прерываний, и кодовый сегмент были в верхней памяти. А уж потом объедините нижнюю часть кода (от проекта приложения) и верхнюю часть кода (от проекта загрузчика) на уровне нех-прошивки или бинарного кода.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 24 2013, 07:04
Сообщение #39


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Я пытался свою задачу выполнить следующим образом. В проекте на С++ в файле main я создал 2 функции. Для этих функций я задал сегмент расположения, который начинался с адреса 0xFC60. В телах этих функций я вызываю по 1 функции, которые содержат нужный рабочий код, и больше ничего. Сами эти функции я по порядку вызываю в функции main(). Выглядит это так:
Код
// Сегмент CODEPLACE начинается с адреса 0xFC60

#pragma location = "CODEPLACE"
void _Function1()
{
  Function1();      // Часть рабочего кода расположена в этой функции
}

#pragma location = "CODEPLACE"
void _Function2()
{
  Function2();      // Часть рабочего кода расположена в этой функции
}

int main()
{
  _Function1();      // У этой функции адрес вызова всегда должен быть 0xFC60
  _Function2();      // У этой функции адрес вызова всегда должен быть 0xFC64
}

Все задуманное работает... но только в конфигурации Debug. В конфигурации Release линкер располагает мои функции _Function1() и _Function2() не в начале сегмента CODEPLACE, а в конце. Соответственно, при изменении рабочего кода, адреса этих функций меняются. Может как то можно решить эту проблему?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 24 2013, 17:58
Сообщение #40


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(d7d1cd @ Nov 24 2013, 11:04) *
Все задуманное работает... но только в конфигурации Debug. В конфигурации Release линкер располагает мои функции _Function1() и _Function2() не в начале сегмента CODEPLACE, а в конце. Соответственно, при изменении рабочего кода, адреса этих функций меняются. Может как то можно решить эту проблему?


Проблема решается просто: ... так и оставайтесь в конфигурации Debug, если она вас устраивает sm.gif. Лично я именно так всегда и пишу. Или сравните между собой обе конфигурации по каждому из параметров и найдите разницу, которая дает этот эффект.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 25 2013, 15:21
Сообщение #41


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



А чем, собственно, отличаются конфигурации Debug и Release? Только опциями проекта?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 25 2013, 21:12
Сообщение #42


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(d7d1cd @ Nov 25 2013, 19:21) *
А чем, собственно, отличаются конфигурации Debug и Release? Только опциями проекта?


Полагаю, что да. Ведь один же компилятор это компилит. Значит, либо в опциях разница или файл конфигурации другой (последний тоже в опциях задается, но по умолчанию может оказаться разным).
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Dec 28 2013, 15:06
Сообщение #43


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Привет всем. Снова вопрос по среде программирования. Есть проект на ассемблере. В проекте 2 файла. Один главный, второй с функциями (умножение, деление и т. д.). Оба файла добавлены в проект. Из первого файла функции второго видно посредством PUBLIC и EXTERN-ов.

Теперь вопрос. Во втором файле много функций, но в первом файле используется, например, одна. Однако при компиляции проекта, в исполняемый файл попадают все функции из 2 файла (хотя, повторюсь, используется только одна). Возможно ли сделать так, чтобы в конечный файл прошивки компилировались только используемые функции?
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jan 1 2014, 13:25
Сообщение #44


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Разобрался в своем вопросе. Необходимо перед объявлением функции указать сегмент и флаг NOROOT:
Код
RSEG     CODE:NOROOT
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jan 4 2014, 09:09
Сообщение #45


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Решил один вопрос, появился другой. Задам тут, может так быстрее сам решу или знающие люди подскажут.
Итак, вопрос. Есть директива ассемблера RSEG. Она указывает в каком сегменте памяти должен располагаться код, который идет после директивы. Имя сегмента и его "область действия" я могу задать либо в опциях линкера либо в конфигурационном файле .xcl. Если под код не будет хватать места, то при сборке линкер выдаст ошибку. А нельзя ли как то указать линкеру два сегмента для размещения кода? Когда в одном сегменте закончится место, линкер будет располагать оставшийся код во втором сегменте.

Сообщение отредактировал d7d1cd - Jan 4 2014, 09:10
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 09:13
Рейтинг@Mail.ru


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