Easyelectronics.ru

Электроника для всех
Текущее время: 18 авг 2019, 14:50

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 21 ] 
Автор Сообщение
 Заголовок сообщения: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 14:04 
Только пришел

Зарегистрирован: 23 мар 2013, 14:47
Сообщения: 21
Привет всем. У меня вопрос по IAR for MSP430. Мне необходимо в проекте на С++ использовать функцию, написанную на ассемблере. Но предварительно необходимо создать такую функцию. Изучая руководство я выяснил, что написание такой функции начинается с создания так называемого скелетного кода и вывода этого кода в ассемблерный листинг. Я создал простейшую функцию вывел ее в ассемблерный файл. Однако компиляция данного файла в машинный код не получается, так как в этот файл при его создании была помещена "неправильная" инструкция ERROR и приведен комментарий к этой инструкции.
Подскажите, как мне решить мою задачу. Свой проект прикладываю.


Вложения:
Poligon.zip [17.02 Кб]
Скачиваний: 164
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 14:11 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
Странный подход какой-то. Зачем вам скелеты в проекте?

Первое что вам надо - это прочитать главу руководства о ABI (Application binary Interface)
IAR C/C++ Compiler Reference Guide -> Part 1. Using the compiler -> Assembler language interface -> Calling convention

Ну а дальше их использовать :) А создание функции по скелету, может подарить вам много часов отладки косяков, которые можно избежать, просто прочитав главу руководства.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 14:22 
Только пришел

Зарегистрирован: 23 мар 2013, 14:47
Сообщения: 21
Я прочитал это руководство, но то ли в силу слабого знания буржуйского, то ли в силу нулевого опыта в программировании микроконтроллеров, то ли еще чего то, у меня не получается. Вот есть задача: написать на ассемблере функцию, принимающую параметр (число) и возвращающую частное от деления параметра на 2. Данную функцию необходимо вызывать в проекте на С++. Если Вас не затруднит, расскажите пошагово.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 14:23 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2295
Можно делать ассемблерные вставки - какие проблемы?
Я, когда многопоточность на msp430f149 делал, ими пользовался.
Отыщу проект - выложу.
Давно было - лет 6-7 назад.

Код:
/*****************************************************************************
* tm_delay
*
* Задержка на указанное число микросекунд.
* Прерывания могут увеличивать задержку, для точной задержки их следует
* запрещать, но на короткое время.
* Значение параметра должно быть больше двух.
*/
static void tm_delay( unsigned us ) __attribute__ ( ( naked ) );
static void tm_delay( unsigned us )
{
    /* одна микросекунда - 8 тактов
       перед выполнением цикла задержки учитываем
       mov #us, r15    2 такта
       call #tm_delay  5 тактов
       ret             3 такта
     */
    asm volatile (
        "sub #2, r15 \n\t"  /* 2 такта, до 16 (2us) осталось 4 */
        "nop \n\t"
        "nop \n\t"
        "nop \n\t"
        "nop \n"
    "1: \n\t"
        "nop \n\t"
        "nop \n\t"
        "nop \n\t"
        "nop \n\t"
        "dec r15 \n\t"      /* 2 такта */
        "jnz 1b \n\t"       /* 2 такта */
        "ret"
    );
}
       



Код:
interrupt (WDT_VECTOR) tickISR() __attribute__ ( ( naked ) );
interrupt (WDT_VECTOR) tickISR()
{
asm volatile ( \                     
        "push r4 \n\t" \
        "push r5 \n\t" \
        "push r6 \n\t" \
        "push r7 \n\t" \
        "push r8 \n\t" \
        "push r9 \n\t" \
        "push r10 \n\t" \
        "push r11 \n\t" \
        "push r12 \n\t" \
        "push r13 \n\t" \
        "push r14 \n\t" \
        "push r15 \n\t" \
             );   

asm volatile
       ("mov.w r1, pcurr_sp \n\t"\
        "mov.w pnext_sp, r1 \n \t"\
        "mov.w pwait_sp, pnext_sp \n \t"\
        "mov.w pcurr_sp, pwait_sp \n \t"\
        "pop r15 \n\t" \
        "pop r14 \n\t" \
        "pop r13 \n\t" \
        "pop r12 \n\t" \
        "pop r11 \n\t" \
        "pop r10 \n\t" \
        "pop r9 \n\t" \
        "pop r8 \n\t" \
        "pop r7 \n\t" \
        "pop r6 \n\t" \
        "pop r5 \n\t" \
        "pop r4 \n\t" \
        "reti"
       );
 

//asm volatile ("reti");
   
//   save_context();
//   if( !tick_handler() )
//      switch_context();
//   restore_context();
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 14:36 
Только пришел

Зарегистрирован: 23 мар 2013, 14:47
Сообщения: 21
Pingvin писал(а):
Можно делать ассемблерные вставки - какие проблемы?

На одном из тематических форумах мне было сказано:
Цитата:
Вообще ассемблерные вставки в Си это перманентное зло. Если вам нужно что-то особенное, оптимизированные под свои задачи, то используйте отдельные законченные функции, полностью написанные на ассемблере. О том, как правильно писать такие функции и о правилах передачи аргументов в/из asm-функций из/в Си-функции, описано в документации. А вставлять отдельные ассемблерные команды посреди Си-шного исходника бросьте сразу, еще не начиная.

Поэтому я хочу сделать сразу все правильно.


Последний раз редактировалось d7d1cd 14 ноя 2013, 14:39, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 14:37 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
А какая нужна заставляет вас писать эту функцию на ассемблере? Не доверяете оптимизатору? Чем не устраивает стандартная функция частного от деления?
Код:
int foo (int bar)
{
  return bar / 2;
}

Вот и вся ваша функция. Можно даже макросом сделать, потому, что вызов будет дольше чем обсчёт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 14:43 
Только пришел

Зарегистрирован: 23 мар 2013, 14:47
Сообщения: 21
Функция деления на 2 - это просто для примера. Кроме того, при использовании ассемблерных вставок непонятно как результат вычислений присвоить переменной, описанной в С модуле. Я ж не знаю какой там будет регистр назначен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 14:49 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2295
d7d1cd писал(а):
Pingvin писал(а):
Можно делать ассемблерные вставки - какие проблемы?

На одном из тематических форумах мне было сказано:
Цитата:
Вообще ассемблерные вставки в Си это перманентное зло. Если вам нужно что-то особенное, оптимизированные под свои задачи, то используйте отдельные законченные функции, полностью написанные на ассемблере. О том, как правильно писать такие функции и о правилах передачи аргументов в/из asm-функций из/в Си-функции, описано в документации. А вставлять отдельные ассемблерные команды посреди Си-шного исходника бросьте сразу, еще не начиная.

Поэтому я хочу сделать сразу все правильно.

Так они и получается на чистом асме!
Макросы _naked_ говорят компилятору - не надо никаких "прелюдий" и "послесловий"!
Вызывается чистый асм!
Вся функция на асме, если Вы заметили.
Ну делайте, как хотите!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 14:58 
Только пришел

Зарегистрирован: 23 мар 2013, 14:47
Сообщения: 21
Pingvin писал(а):
Так они и получается на чистом асме!
Макросы _naked_ говорят компилятору - не надо никаких "прелюдий" и "послесловий"!
Вызывается чистый асм!
Вся функция на асме, если Вы заметили.
Ну делайте, как хотите!


Попробовал написать подобие Вашего кода. Компилятор на строку
Код:
asm volatile ("mov r15, r14");

выдал "expected a "("


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 15:01 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2295
d7d1cd писал(а):
Pingvin писал(а):
Так они и получается на чистом асме!
Макросы _naked_ говорят компилятору - не надо никаких "прелюдий" и "послесловий"!
Вызывается чистый асм!
Вся функция на асме, если Вы заметили.
Ну делайте, как хотите!


Попробовал написать подобие Вашего кода. Компилятор на строку
Код:
asm volatile ("mov r15, r14");

выдал "expected a "("


Я компилировал msp430-gcc.
Исходники писал вообще в FAR.

Вот make-файл
Код:
# makfile configuration
NAME            = firmware
OBJECTS         = main.o
CPU             = msp430x148

CFLAGS          = -mmcu=${CPU} -Wall -g

#switch the compiler (for the internal make rules)
CC              = msp430-gcc

#all should be the first target. it's built when make is run without args
all: ${NAME}.elf

#confgigure the next line if you want to use the serial download

#download: download-bsl

#additional rules for files
${NAME}.elf: ${OBJECTS}
   ${CC} -mmcu=${CPU} -o $@ ${OBJECTS}


clean:
   rm -rf ${OBJECTS} ${NAME}.elf


#dummy target as dependecy if something has to be build everytime
FORCE:

#project dependencies
main.o: main.c x148_1.h


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 16:18 
Только пришел

Зарегистрирован: 23 мар 2013, 14:47
Сообщения: 21
У меня ИАР и мне надо в нем научиться работать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 16:47 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4189
Откуда: Киев
d7d1cd писал(а):
то ли в силу нулевого опыта в программировании микроконтроллеров
Ну так и начинай с простого.
Пиши на Си, наберись какого-то опыта. Делай "некашерные" (хотя та твоя ссылка - всего лишь мнение человека, не бога) вставки. Потом и станет ясно, нужны ли тебе именно функции и как к этому подойти...
Что ж так сразу-то?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 17:02 
Только пришел

Зарегистрирован: 23 мар 2013, 14:47
Сообщения: 21
Если кто-то делал подобное, расскажите. Я же не хочу сделать что-то сверхъестественное. Мне нужна функция на асме, которую я вызываю в С.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 17:11 
Старожил

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4946
Откуда: Донецк-Мариуполь
Тогда встречный вопрос - ЗАЧЕМ?
Если это лабораторная работа для института - это одно.
Если для "самому разобраться" - это другое.

Ассемблерные вставки в Си - это применяется в очень редких, нетривиальных случаях.
Это примерно также, как для обычного человека, у которого есть автомобиль, на котором он ездит на работу, пытаться освоить "полицейский разворот".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 17:38 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5613
d7d1cd писал(а):
На одном из тематических форумах мне было сказано:
...
Поэтому я хочу сделать сразу все правильно.


Вам все верно сказали , добавлю только что в IAR inline asm никакой ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 18:07 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
d7d1cd писал(а):
Поэтому я хочу сделать сразу все правильно.
Самый правильный вариант я вам уже написал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 14 ноя 2013, 18:08 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2012, 17:24
Сообщения: 525
Дык, ёшкин кот, нету такой инструкции ERROR в наборе команд MSP430 :)

Надо эту строчку закомментировать просто.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 15 ноя 2013, 02:16 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
amx писал(а):
d7d1cd писал(а):
Поэтому я хочу сделать сразу все правильно.
Самый правильный вариант я вам уже написал.
+1.

ТС, amx Вам уже дважды сказал, как организуется связь между Си и ассемблером. И регистры для передачи параметров/результатов будут вполне определённые (стандартом ABI), а не "Я ж не знаю какой там будет регистр назначен".

Недавно в ветке про эмулятор ZX-Spectrum я тоже давал ссылку на книжку (маленькую! 32 страницы) про то, как поженить ассемблер и Си в одной программе для ARM.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 15 ноя 2013, 08:41 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2295
d7d1cd писал(а):
У меня ИАР и мне надо в нем научиться работать.

Под дулом пистолета заставляют его использовать и запрещают другой инструментарий установить?!
Там же ограничение на размер кода в свободной версии?
Или у Вас поломанный?

Цитата:
Kickstart, size-limited evaluation license:

Code size limited license without any time limitation but, no MISRA C support, no power debug functionality, source code for runtime libraries is not included.


Цитата:
MSP430 v5.60 v5.60 (4/8K)


Да ещё дебаг вырезан?!!!
Да на кой он нужен?!

Добрый совет - завязывайте с этой проприетарщиной!
Есть свободные компиляторы и среды разработки.

Eclipse за пол дня настроите и получите полноценную среду с возможностью пошаговой отладки без идиотских ограничений!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 15 ноя 2013, 11:28 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
Pingvin писал(а):
Да ещё дебаг вырезан?!!!
Дебаг на месте, вырезан только power debugging. Это отладка потребления при помощи I-Jet и доступна только для платформ ARM Cortex и Renesas RX.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С++ и Ассемблер
СообщениеДобавлено: 17 ноя 2013, 15:27 
Только пришел

Зарегистрирован: 23 мар 2013, 14:47
Сообщения: 21
Спасибо всем за советы и предложения. Тему можно считать закрытой ввиду решения вопроса тут: http://electronix.ru/forum/index.php?showtopic=116670


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB