Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

возможно ли и каким образом в ассеблерных файлах использовать дефайны из С
Зависит от среды, но по-моему IAR тоже позволяет просто включить сишный заголовочник в .s-файл и использовать его дефайны. Единственно только, надо, чтобы в том заголовочнике не было непонятных для ассемблера объявлений, не заменяемых препроцессором (например, типы Си).

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

Вот, посмотрите, как это делается в AVR-GCC, идея везде одна. Только Вам надо будет найти в документации IAR'овский аналог дефайна __ASSEMBLER__.
Последний раз редактировалось YS Вс июл 28, 2013 19:55:49, всего редактировалось 1 раз.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Встал на лапы
Сообщения: 85
Зарегистрирован: Пт фев 01, 2013 17:47:26
Откуда: Украина, Луганская область

Сообщение srg320 »

YS, спасибо, буду разбираться.
Реклама
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Не за что. :beer:
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

У меня вопрос по препроцессору.
Например имеется код:

Код: Выделить всё

#define x 0.5
#define y 550.3

#define const x*y
Если где-то в коде вставлю константу const, то препроцессор заменит её на выражение "0.5*550.3". А мне нужно получить результат этого выражения без дробной части, т.е. "275". Иначе в некоторых случаях компилятор вполне обоснованно линкует float-библиотеку (avr-gcc), которая мне не нужна.

Как можно заставить препроцессор вычислять выражение до компиляции?
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 85
Зарегистрирован: Пт фев 01, 2013 17:47:26
Откуда: Украина, Луганская область

Сообщение srg320 »

а если написать так

Код: Выделить всё

#define const ((int)x*(int)y)
Реклама
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

скорее так:

Код: Выделить всё

#define x (0.5)
#define y (550.3)
#define const ((int)(x*y))
в случае #define const ((int)x*(int)y) получим ноль

PS. препроцессор ничего не вычислит, зато в теле программы будет явное обращение к целому.

PPS. "const" - зарезервированное слово.
Реклама
Встал на лапы
Сообщения: 85
Зарегистрирован: Пт фев 01, 2013 17:47:26
Откуда: Украина, Луганская область

Сообщение srg320 »

а разве при вычислении (x*y) компилятор не подключит float-библиотеку?
может x и y брать заранее умноженные на 10 а результат делить потом на 100
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

PPS. "const" - зарезервированное слово.
Я в курсе, это для примера.
PS. препроцессор ничего не вычислит, зато в теле программы будет явное обращение к целому.
То есть он вообще не может вычислять?
может x и y брать заранее умноженные на 10 а результат делить потом на 100
Да можно и на калькуляторе посчитать и задефайнить результат. Хотелось бы, чтобы за меня это сделал препроцессор.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Код: Выделить всё

int asd;
.......
.......
asd= 0.5 * 550.3;
ИМХО, при таком раскладе, компилятор не будет ничего подключать. Он вычислит это выражение на этапе компиляции, округлит его и подставит в конструкцию.
По этому, результат кода

Код: Выделить всё

#define x 0.5
#define y 550.3
.......
int asd;
.......
.......
asd= x * y;
будет таким же.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Если идёт присвоение - да. Если условие сравнения - подключает.

Код: Выделить всё

#define max_counter  frequency*max_time
...

if (counter < max_counter)  // <<< тут уже линкует и пошла пьянка
{
...
}
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

А если явно привести к типу ?

Код: Выделить всё

#define max_counter  (frequency*max_time)
...

if (counter < (unsigned int)max_counter)  // <<< тут уже линкует и пошла пьянка
{
...
}
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Препроцессор Си
http://gcc.gnu.org/onlinedocs/cpp/
СпойлерСоздаём файлик c.c следующего содержания

Код: Выделить всё

#define x (0.5)
#define y (550.3)
#define xy (x*y)

int xy_i = xy;
Запускаем препроцессор командой "cpp c.c" (без кавычек, естественно). Получаем.

Код: Выделить всё

# 1 "c.c"
# 1 "<command-line>"
# 1 "c.c"




int xy_i = ((0.5)*(550.3));
Препроцессор из комплекта GNU C Compiler. Т.е. у кого стоит WinAVR или AVR Toolchain могут тоже попробовать.
Последний раз редактировалось Kavka Ср июл 31, 2013 19:03:26, всего редактировалось 2 раза.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

А если явно привести к типу ?
Вроде работает. Но это простой тест. Попробую дома на реальном проекте.
Спасибо.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Проверил всё.
Да, при явном приведении типа, не важно, в дефайне или в коде, всё работает.

Код: Выделить всё

#define max_counter  (uint16_t)(frequency*max_time)
Достаточно убрать это приведение, как происходит линковка флоата.
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

подскажите пожалуйста, если я при определенном услови, с помощью оператора return, выхожу из ф-ции в основной цикл то как мне потом вернутся в ф-цию и продолжить с того места где я ранее прервал выполнение ?
Tell Me The Truth
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Просто так после return - никак.
Может разделить эту функцию на две - одна делает, то что до return, другая то, что после?
Можно параметр функции сделать указывающий на "продолжение".
Мало информации, деталей мало, чтобы дать более дельный совет.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Обычно, если возникает такая потребность, надо пересмотреть логику работы.
Иногда и GOTO так хочется вставить, посидишь, почешешься... и родишь что-нибудь компактное и красивое :)
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

FreshMan писал(а):подскажите пожалуйста, если я при определенном услови, с помощью оператора return, выхожу из ф-ции в основной цикл то как мне потом вернутся в ф-цию и продолжить с того места где я ранее прервал выполнение ?
http://computerlib.narod.ru/html/setjmp.htm
http://ru.wikipedia.org/wiki/Setjmp.h
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Kavka писал(а):Мало информации, деталей мало, чтобы дать более дельный совет.
в основном цикле, окромя прочих операторов есть ф-ция play()

Код: Выделить всё

whli(1)
{
.....
.....
play();
......
......
}
в данной ф-ции , окромя других команд, мне надо организовать СОБСТВЕНННУЮ задержку, я ее сделал на Т2 который срабанывает по переполнению через 2мс
так вот, когда я нахожусь в ф-ции play() и я дохожу до того места где мне надо организовать задержку то я запускаю таймер и ВЫСКАКИВАЮ с ф-ции в основной цикл......, там я занимаюсь своими делами до тех пор пока Т2 не натикает мне сколько надо и если это случится то только тогда я запрыгиваю в play() и именно в то место где я оборвал выполнение данной ф-ции до того ......, вот как-то так.

Код: Выделить всё

play()
{
.....
.......
сдесь я запускаю Т2 и выпригиваю с данной ф-ции
сюда я возвращаюсь когда Т2 отсчитает определенное время
.....
......
}
ploop писал(а):ногда и GOTO так хочется вставить, посидишь, почешешься... и родишь что-нибудь компактное и красивое
так шо без GOTO никак ?
а ведь некоторые вопиют что это дурной тон :)) :wink: :))
Tell Me The Truth
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

Нельзя запустить таймер из мейн? Разбейте плей на две части.
FreshMan писал(а):так шо без GOTO никак ?
И с goto никак, насколько помню нельзя лезть из блока в другой блок.
Ответить

Вернуться в «Разные вопросы по МК»