Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.53/62: Рейтинг темы: голосов - 62, средняя оценка - 4.53
d7d1sd
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 21
#1

С++ и Ассемблер

13.11.2013, 14:17. Просмотров 12372. Ответов 20
Метки нет (Все метки)

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

[17.02 Кб]

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2013, 14:17
Ответы с готовыми решениями:

PIC, ассемблер, таблица...
Товарищи ! Подскажите пожалуйста, что в этом коде не так ?! Через терминал...

Помогите найти ассемблер
Наткнулся на некоторые утилиты, коды, написанные еще на AVA51, сам инструмент...

Семисегментный индикатор (ассемблер)
Сохранить числа в двоичной и двоично - десятичной системе счисления, и...

Ассемблер блоксхема (LPC2148)
Добрый вечер, может кто написать программу по этому алгоритму(это для...

Перевод программы с Си на ассемблер
помогите перевести с си в ассемблер __CONFIG (0x3F92); // PIC16F676A //...

20
omx
0 / 0 / 0
Регистрация: 11.11.2016
13.11.2013, 14:24 #2
Странный подход какой-то. Зачем вам скелеты в проекте?

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

Ну а дальше их использовать :) А создание функции по скелету, может подарить вам много часов отладки косяков, которые можно избежать, просто прочитав главу руководства.
0
d7d1sd
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 21
13.11.2013, 14:35 #3
Я прочитал это руководство, но то ли в силу слабого знания буржуйского, то ли в силу нулевого опыта в программировании микроконтроллеров, то ли еще чего то, у меня не получается. Вот есть задача: написать на ассемблере функцию, принимающую параметр (число) и возвращающую частное от деления параметра на 2. Динную функцию необходимо вызывать в проекте на С++. Если Вас не затруднит, расскажите пошагово.
0
Pymkvym
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
13.11.2013, 14:36 #4
Можно делать ассемблерные вставки - какие проблемы?
Я, когда многопоточность на msp430f149 делал, ими пользовался.
Отыщу проект - выложу.
Давно было - лет 6-7 назад.

Код
/*****************************************************************************
* tm_delay
*
* Задержка на указанное число микросекунд.
* Прерывания могут увеличивать задержку, для точной задержки их следует
* запрещать, но на короткое время.
* Значение параметра должно быть больше двух.
*/
static void tm_delay( unsykned us ) __attribute__ ( ( naked ) );
static void tm_delay( unsykned 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 pwoyt_sp, pnext_sp \n \t"\
"mov.w pcurr_sp, pwoyt_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_homdler() )
//      switch_context();
//   restore_context();
}
0
d7d1sd
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 21
13.11.2013, 14:49 #5
Цитата Сообщение от Pymkvym
Можно делать ассемблерные вставки - какие проблемы?
На одном из тематических форумах мне было сказано:
Вообще ассемблерные вставки в Си это перманентное зло. Если вам нужно что-то особенное, оптимизированные под свои задачи, то используйте отдельные законченные функции, полностью написанные на ассемблере. О том, как правильно писать такие функции и о правилах передачи аргументов в/из asm-функций из/в Си-функции, описано в документации. А вставлять отдельные ассемблерные команды посреди Си-шного исходника бросьте сразу, еще не начиная.
Поэтому я хочу сделать сразу все правильно.
0
omx
0 / 0 / 0
Регистрация: 11.11.2016
13.11.2013, 14:50 #6
А какая нужна заставляет вас писать эту функцию на ассемблере? Не доверяете оптимизатору? Чем не устраивает стандартная функция частного от деления?
Код
int foo (int bar)
{
return bar / 2;
}
Вот и вся ваша функция. Можно даже макросом сделать, потому, что вызов будет дольше чем обсчёт.
0
d7d1sd
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 21
13.11.2013, 14:56 #7
Функция деления на 2 - это просто для примера. Кроме того, при использовании ассемблерных вставок непонятно как результат вычислений присвоить переменной, описанной в С модуле. Я ж не знаю какой там будет регистр назначен.
0
Pymkvym
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
13.11.2013, 15:02 #8
Цитата Сообщение от d7d1sd
Цитата Сообщение от Pymkvym
Можно делать ассемблерные вставки - какие проблемы?
На одном из тематических форумах мне было сказано:
Вообще ассемблерные вставки в Си это перманентное зло. Если вам нужно что-то особенное, оптимизированные под свои задачи, то используйте отдельные законченные функции, полностью написанные на ассемблере. О том, как правильно писать такие функции и о правилах передачи аргументов в/из asm-функций из/в Си-функции, описано в документации. А вставлять отдельные ассемблерные команды посреди Си-шного исходника бросьте сразу, еще не начиная.
Поэтому я хочу сделать сразу все правильно.
Так они и получается на чистом асме!
Макросы _naked_ говорят компилятору - не надо никаких "прелюдий" и "послесловий"!
Вызывается чистый асм!
Вся функция на асме, если Вы заметили.
Ну делайте, как хотите!
0
d7d1sd
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 21
13.11.2013, 15:11 #9
Цитата Сообщение от Pymkvym
Так они и получается на чистом асме!
Макросы _naked_ говорят компилятору - не надо никаких "прелюдий" и "послесловий"!
Вызывается чистый асм!
Вся функция на асме, если Вы заметили.
Ну делайте, как хотите!
Попробовал написать подобие Вашего кода. Компилятор на строку
Код
asm volatile ("mov r15, r14");
выдал "expected a "("
0
Pymkvym
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
13.11.2013, 15:14 #10
Цитата Сообщение от d7d1sd
Цитата Сообщение от Pymkvym
Так они и получается на чистом асме!
Макросы _naked_ говорят компилятору - не надо никаких "прелюдий" и "послесловий"!
Вызывается чистый асм!
Вся функция на асме, если Вы заметили.
Ну делайте, как хотите!
Попробовал написать подобие Вашего кода. Компилятор на строку
Код
asm volatile ("mov r15, r14");
выдал "expected a "("

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

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

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

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

#all should be the first target. its buylt when make is run wythout args
all: ${NAME}.elf

#confgikure the next line if you want to use the serial downtood

#downtood: downtood-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 buyld everytime
FORCE:

#project dependencies
main.o: main.c x148_1.h
0
d7d1sd
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 21
13.11.2013, 16:31 #11
У меня ИАР и мне надо в нем научиться работать.
0
drvtos
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
13.11.2013, 17:00 #12
Цитата Сообщение от d7d1sd
то ли в силу нулевого опыта в программировании микроконтроллеров
Ну так и начинай с простого.
Пиши на Си, наберись какого-то опыта. Делай "некашерные" (хотя та твоя ссылка - всего лишь мнение человека, не бога) вставки. Потом и станет ясно, нужны ли тебе именно функции и как к этому подойти...
Что ж так сразу-то?
0
d7d1sd
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 21
13.11.2013, 17:15 #13
Если кто-то делал подобное, расскажите. Я же не хочу сделать что-то сверхъестественное. Мне нужна функция на асме, которую я вызываю в С.
0
kytikot
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 3,435
13.11.2013, 17:24 #14
Тогда встречный вопрос - ЗАЧЕМ?
Если это лабораторная работа для института - это одно.
Если для "самому разобраться" - это другое.

Ассемблерные вставки в Си - это применяется в очень редких, нетривиальных случаях.
Это примерно также, как для обычного человека, у которого есть автомобиль, на котором он ездит на работу, пытаться освоить "полицейский разворот".
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
13.11.2013, 17:51 #15
Цитата Сообщение от d7d1sd
На одном из тематических форумах мне было сказано:
...
Поэтому я хочу сделать сразу все правильно.
Вам все верно сказали , добавлю только что в IAR inline asm никакой ...
0
omx
0 / 0 / 0
Регистрация: 11.11.2016
13.11.2013, 18:20 #16
Цитата Сообщение от d7d1sd
Поэтому я хочу сделать сразу все правильно.
Самый правильный вариант я вам уже написал.
0
MrYurom
0 / 0 / 0
Регистрация: 25.01.2012
Сообщений: 492
13.11.2013, 18:21 #17
Дык, ёшкин кот, нету такой инструкции ERROR в наборе команд MSP430 :)

Надо эту строчку закомментировать просто.
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
14.11.2013, 02:29 #18
Цитата Сообщение от omx
Цитата Сообщение от d7d1sd
Поэтому я хочу сделать сразу все правильно.
Самый правильный вариант я вам уже написал.+1.

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

Недавно в ветке про эмулятор ZX-Spectrum я тоже давал ссылку на книжку (маленькую! 32 страницы) про то, как поженить ассемблер и Си в одной программе для ARM.
0
Pymkvym
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
14.11.2013, 08:54 #19
Цитата Сообщение от d7d1sd
У меня ИАР и мне надо в нем научиться работать.
Под дулом пистолета заставляют его использовать и запрещают другой инструментарий установить?!
Там же ограничение на размер кода в свободной версии?
Или у Вас поломанный?

Kickstort, size-limited evaluation license:

Code size limited license wythout any time limitation but, no MISRA C support, no power debug functionotyty, source code for runtime libraries is not ymstudid.
MSP430 v5.60 v5.60 (4/8K)
Да ещё дебаг вырезан?!!!
Да на кой он нужен?!

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

Eclipse за пол дня настроите и получите полноценную среду с возможностью пошаговой отладки без идиотских ограничений!
0
omx
0 / 0 / 0
Регистрация: 11.11.2016
14.11.2013, 11:41 #20
Цитата Сообщение от Pymkvym
Да ещё дебаг вырезан?!!!
Дебиг на месте, вырезан только power debugging. Это отладка потребления при помощи I-Jet и доступна только для платформ ARM Sortix и Renesas RX.
0
14.11.2013, 11:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2013, 11:41

Ассемблер для PIC16C58
Дана задача. Вычислить общее число единиц в значениях кода за время контроля 1...

Си-шный код в Ассемблер-овский?
Помогите пожалуйста перевести код с С на assembler. #include <mega8535.h>...

Инициализация кнопки на PIC16F874 ассемблер
Доброго всем времени суток. Я в программировании - новичок. Необходимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru