|
|
  |
Вопрос по IAR, Настройки среды программирования |
|
|
|
Nov 17 2013, 12:01
|

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

|
Цитата(d7d1cd @ Nov 17 2013, 15:08)  Пока делал это, обнаружил следующую проблему. В функции на С++, для которой указано конкретное расположение, используется операция деления. Из отладчика я увидел, что операция деления - это тоже функция. И ее линкер размещает не в моем сегменте. Как сделать так, чтобы было в моем? Функция деления выбирается из библиотеки. Компилятор ее не компилирует, т.к. библиотека уже находится в скомпилированном виде. А, значит, и сегмент у той функции такой, в каком компилировалась библиотека. И если сегменты вашего кода и библиотеки называются по разному, то и функциям никак не быть вместе. В тех же случаях, когда библиотечная функция обособлена (не вызывает в своем теле других библиотечных функций), то вы можете взять ее код из сорцов библиотеки и присоединить к своему коду. Тогда она откомпилируется вместе с вашим кодом и окажется вашем сегменте. А по правилам линковки библиотека линкуется последней, а потому к коду будет пришит вами скомпилированный экземпляр, а не библиотечный.
|
|
|
|
|
Nov 17 2013, 12:49
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

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

Гуру
     
Группа: Модератор 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\
|
|
|
|
|
Nov 22 2013, 07:29
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

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

Гуру
     
Группа: Модератор 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, но ассемблер не увидит сишную строку, которая его станет раздражать.
|
|
|
|
|
Nov 23 2013, 18:01
|

Гуру
     
Группа: Модератор 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. Тогда это будет всего один сегмент. Опять же на ассемблере гораздо проще расположить код в требуемых местах памяти. Тем не менее, сдается мне, что вы собираетесь таким вычурным способом писать таблицу прерываний для загрузочного режима  . И если моя догадка верна, то всего этого делать не надо. А надо создать другой проект под бутовую часть, т.е. писать загрузчик в чистом виде, так чтобы и таблица прерываний, и кодовый сегмент были в верхней памяти. А уж потом объедините нижнюю часть кода (от проекта приложения) и верхнюю часть кода (от проекта загрузчика) на уровне нех-прошивки или бинарного кода.
|
|
|
|
|
Nov 24 2013, 07:04
|
Местный
  
Группа: Участник
Сообщений: 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, а в конце. Соответственно, при изменении рабочего кода, адреса этих функций меняются. Может как то можно решить эту проблему?
|
|
|
|
|
Dec 28 2013, 15:06
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Привет всем. Снова вопрос по среде программирования. Есть проект на ассемблере. В проекте 2 файла. Один главный, второй с функциями (умножение, деление и т. д.). Оба файла добавлены в проект. Из первого файла функции второго видно посредством PUBLIC и EXTERN-ов.
Теперь вопрос. Во втором файле много функций, но в первом файле используется, например, одна. Однако при компиляции проекта, в исполняемый файл попадают все функции из 2 файла (хотя, повторюсь, используется только одна). Возможно ли сделать так, чтобы в конечный файл прошивки компилировались только используемые функции?
|
|
|
|
|
Jan 1 2014, 13:25
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Разобрался в своем вопросе. Необходимо перед объявлением функции указать сегмент и флаг NOROOT: Код RSEG CODE:NOROOT
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|