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

 
 
> Вопрос по IAR, Настройки среды программирования
d7d1cd
сообщение Nov 8 2013, 18:19
Сообщение #1


Местный
***

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



Привет всем. Подскажите, возможно ли настроить IAR так, чтобы он сделал компиляцию кода (например какой-то отдельной функции или всего кода) строго в определенный участок флешь памяти (от сих до сих, так сказать)?
Go to the top of the page
 
+Quote Post
5 страниц V  < 1 2 3 4 > »   
Start new topic
Ответов (15 - 29)
d7d1cd
сообщение Nov 12 2013, 05:02
Сообщение #16


Местный
***

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



Уважаемый rezident, объяснения как всегда на высоте! Спасибо!
Хочется подробнее узнать про функции, написанные полностью на ассемблере. Как я полагаю в этих функциях для переменных можно будет использовать любые РОН, а не только R4 и R5. Подскажите ссылку на документацию (если возможно - на русском языке).
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 12 2013, 09:33
Сообщение #17


Гуру
******

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



Цитата(d7d1cd @ Nov 12 2013, 09:02) *
Хочется подробнее узнать про функции, написанные полностью на ассемблере. Как я полагаю в этих функциях для переменных можно будет использовать любые РОН, а не только R4 и R5. Подскажите ссылку на документацию (если возможно - на русском языке).

IAR поддерживает сборку проекта, состоящего из C/C++ и ассеблерных файлов/модулей, различая их по расширению.

Книжек о том, как програмировать на этих языках для MSP430, можно легко надыбать в интернете, но мой совет будет простой: написать на языке C функцию, нуждающуюся в переложении на ассемблер, в отдельном файле, откомпилировать проект с установкой, чтобы выдавало ассемблерный листинг. После чего редактируешь листинг по своему вкусу, использя те регистры, какие хочется, а затем подменяешь в проекте второй файл на асемблерный.

Я, кстати, сама так МК-шному ассемблеру училась - книг не читала, а писала по образу и подобию того, как компилятор компилирует сишные образцы. Правда, к этому времени я на других ассемблерах уже умела программировать - это, видимо, тоже помогало. А из книг было достаточно таблицы инструкций и IAR-ского руководства EW430_AssemblerReference.pdf

Думаю, что самая большая тут трудность не в том, чтобы на ассемблеру выучиться, а в том, чтобы соблюсти условности, позволяющие линкеру связывать объектные модули от двух разных языков. Т.к. проблема чаще возникает в том, что на ассемблере порой приходится искать доступ к глобальным переменным и массивам, определенным в сишной части проекта.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 12 2013, 10:01
Сообщение #18


Местный
***

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



Цитата(Xenia @ Nov 12 2013, 13:33) *
...написать на языке C функцию, нуждающуюся в переложении на ассемблер, в отдельном файле, откомпилировать проект с установкой, чтобы выдавало ассемблерный листинг. После чего редактируешь листинг по своему вкусу, используя те регистры, какие хочется, а затем подменяешь в проекте второй файл на ассемблерный.

Если Вас не затруднит, можете сделать пошаговое описание выше сказанного? Просто я в IAR совсем новичок. Ранее программировал только на C++Builder.
Например, на С написать функцию, которая принимает 2 параметра и возвращает сумму квадратов этих параметров. Как потом реализацию этой функции вывести в ассемблерный листинг?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 13 2013, 06:34
Сообщение #19


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(d7d1cd @ Nov 12 2013, 14:01) *
Как потом реализацию этой функции вывести в ассемблерный листинг?

Поставить в настройках галочку (вкладка compiler output или что-то в этом роде), будет формироваться .lst

Прикрепленное изображение


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 13 2013, 09:09
Сообщение #20


Местный
***

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



Создал я проект, добавил в него файл. В этом файле создал функцию. Сделал компиляцию этого файла при установленной галочке Output assembler file. В итоге я получил файл с реализацией моей функции на ассемблере. Как я понимаю, я могу теперь отредактировать этот файл по своему усмотрению, поменять алгоритм реализации функции, использовать любые регистры.
Пока я с этим файлом ничего делать не буду. Подскажите, как мне из кода на С++ вызвать мою функцию, расположенную теперь в ассемблерном файле?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 13 2013, 09:26
Сообщение #21


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Прямо так и вызывать, предварительно объявив прототип.
Цитата
поменять алгоритм реализации функции, использовать любые регистры.

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 13 2013, 10:19
Сообщение #22


Местный
***

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



Попробовал следовать Вашему совету. Файл с функцией на ассемблере поместил в отдельную папку. Далее добавил этот файл в проект. Перед функцией main поместил прототип функции, которая находится в ассемблерном виде. При попытке запуска, компилятор выдает ошибку компиляции ассемблерного файла, хотя я в нем абсолютно ничего не менял. Скажите, что я не так делаю?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 13 2013, 10:53
Сообщение #23


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(d7d1cd @ Nov 13 2013, 14:19) *
Скажите, что я не так делаю?

Видимо, что-то не так sm.gif
А что за ошибка?

Я в ассемблере не слишком шарился, обычно си хватало.
Есть пара проектов, но сейчас времени нет искать.
Может, как-нибудь эту функцию надо глобально расшарить директивами? Типа паблик или что-то в этом роде
РТФМ, там много интересного


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 13 2013, 11:02
Сообщение #24


Местный
***

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



Ошибка Bad instruction. Возникает в строке ассемблерного файла с якобы инструкцией ERROR. Кто знает, подскажите. пожалуйста, как осуществить желаемое...

P.S. В полученном ассемблерном файле есть комментарий (после этой непонятной инструкции ERROR). Там написано, что-то типа "Этот модуль использует возможности С++ не совместимые с кодом ассемблера..."

Сообщение отредактировал d7d1cd - Nov 13 2013, 11:53
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 14 2013, 07:48
Сообщение #25


Местный
***

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



Сделал я проект. Прикладываю его сюда. В этом проекте я получаю ассемблерный листинг, который потом не компилируется. Люди добрые, посмотрите, подскажите...
Прикрепленные файлы
Прикрепленный файл  Poligon.zip ( 17.02 килобайт ) Кол-во скачиваний: 21
 
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 14 2013, 15:20
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(d7d1cd @ Nov 14 2013, 12:48) *
Сделал я проект. Прикладываю его сюда. В этом проекте я получаю ассемблерный листинг, который потом не компилируется. Люди добрые, посмотрите, подскажите...

В мнемонике ассемблера MSP430 нет команды ERROR. Она вставляется в листинг видимо как раз специально с той целью, чтобы этот asm потом не компилировали biggrin.gif
Я не знаю ни C++, ни как вставлять в проект для С++ ASM-функции. Специально только для этого курить документацию IAR мне лениво sm.gif
Но вот мой вариант вашего проекта без каких-либо "плюсов", pure C т.с. Функция DivisionOnTwo вырезана из вашего листинга и оформлена как законченная самостоятельная ASM-функция, которая вызывается из Си-шного модуля. Проект компилируется без ошибок и даже работает (в симуляторе).
Обратите внимание, что прототип функции DivisionOnTwo описан с квалификатором external.
Прикрепленные файлы
Прикрепленный файл  Poligon_c.zip ( 248.15 килобайт ) Кол-во скачиваний: 22
 
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 14 2013, 17:28
Сообщение #27


Местный
***

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



Спасибо всем за помощь! Наконец то я победил компилятор. Как мне подсказал rezident, необходимо функцию, которую надо переложить на ассемблер, написать в проекте на С (но не на С++). Тогда получается пригодный для компиляции ассемблерный листинг. Его я правлю как мне необходимо и добавляю к проекту на С++. Прототип функции, которая находится в ассемблере, необходимо объявить с квалификатором extern "C".
Почитав руководство к компилятору, я узнал, что при передаче в функцию параметров, всегда используются конкретные регистры, так же, как и при возврате функциями каких-либо значений.

Сообщение отредактировал d7d1cd - Nov 15 2013, 07:49
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 17 2013, 09:56
Сообщение #28


Местный
***

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



И снова здравствуйте. Теперь я умею в одном проекте использовать код на С++ и на ассемблере. Но вот возник вопрос...
У меня в проекте 3 функции, написанные на С++. Все они не принимают параметров и не возвращают их (работают с глобальными переменными). Вызываются они одна за другой. Настроив линкер, я указал, что функции у меня расположены в определенной области памяти. В отладчике я вижу, что мои функции расположились в указанной мной области памяти в таком же порядке, как происходит их вызов.
Далее я самую первую функцию пишу на ассемблере, так же указав сегмент расположения этой функции. Порядок вызова функций я не меняю, однако после всего этого я вижу, что функция, написанная на ассемблере, расположилась в памяти после функций, написанных на С++ (хотя вызывается первая).
Подскажите, почему эта функция на С++ была первая в памяти, а на ассемблере стала последней? И еще: конечно это не особо критично, но подскажите, возможно ли указать линкеру не только расположение функций, но и порядок их размещения в памяти?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 17 2013, 10:47
Сообщение #29


Гуру
******

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



Цитата(d7d1cd @ Nov 17 2013, 13:56) *
Подскажите, почему эта функция на С++ была первая в памяти, а на ассемблере стала последней? И еще: конечно это не особо критично, но подскажите, возможно ли указать линкеру не только расположение функций, но и порядок их размещения в памяти?


У IAR компиляторы языка С/С++ и языка ассемблера раздельные! В вашем случае это icc430.exe и a430.exe. Поэтому сишные функции окажутся откомпилированными в одном объектном модуле, а ассемблерные функции в другом. А дальше все зависит от того, в каком порядке их соберет линкер. Видимо у него make такой, что первыми в очереди на сборку идут сишные модули, а ассемблерные за ними.

Впрочем, попробуйте переставить порядок следования сишного и ассемблерного модулей в проекте. Если это у вас получится, то, вероятно, и порядок следования функций тоже изменится.

P.S. А не все ли вам равно, в каком порядке функции следуют внутри сегмента кода? Зарекаться на этот порядок в проектах, в общем-то, неприлично.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 17 2013, 11:08
Сообщение #30


Местный
***

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



Цитата(Xenia @ Nov 17 2013, 14:47) *
У IAR компиляторы языка С/С++ и языка ассемблера раздельные! В вашем случае это icc430.exe и a430.exe. Поэтому сишные функции окажутся откомпилированными в одном объектном модуле, а ассемблерные функции в другом. А дальше все зависит от того, в каком порядке их соберет линкер. Видимо у него make такой, что первыми в очереди на сборку идут сишные модули, а ассемблерные за ними.

Впрочем, попробуйте переставить порядок следования сишного и ассемблерного модулей в проекте. Если это у вас получится, то, вероятно, и порядок следования функций тоже изменится.

P.S. А не все ли вам равно, в каком порядке функции следуют внутри сегмента кода? Зарекаться на этот порядок в проектах, в общем-то, неприлично.

Ну во поводу постскриптума: мне все равно, по сути... А поменяв порядок следования в Workspace, все получилось! Спасибо за совет.
Пока делал это, обнаружил следующую проблему. В функции на С++, для которой указано конкретное расположение, используется операция деления. Из отладчика я увидел, что операция деления - это тоже функция. И ее линкер размещает не в моем сегменте. Как сделать так, чтобы было в моем?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 21:31
Рейтинг@Mail.ru


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