Помощь в WinAvr
09.06.2011, 20:02
|
|
|
Частый гость
Регистрация: 12.07.2009
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помощь в WinAvr
Я хочу чтобы при сборки проекта, в зависимости от переменной Data_port(она имеет известное, постоянное значение), подключались разные блоки кода.
|
|
|
|
09.06.2011, 20:59
|
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
|
Re: Помощь в WinAvr
Тогда разберитесь с директивами условной компиляции...
|
|
|
|
09.06.2011, 21:06
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Помощь в WinAvr
Сообщение от WartKert
|
|
Я хочу чтобы при сборки проекта, в зависимости от переменной Data_port(она имеет известное, постоянное значение), подключались разные блоки кода.
|
Ну так с этим просто.
Data_port тоже должна быть дефайном.
|
Код:
|
#define VARIANT_A (0x7F)
#define VARIANT_B (0xBF)
#define DATA_PORT VARIANT_A // править тут. От этой строки зависит какой вариант пойдет в прошивку
#if (DATA_PORT==VARIANT_A)
// здесь код для варианта А
#endif
#if (DATA_PORT==VARIANT_B)
// здесь код для варианта B
#endif |
|
|
|
|
14.06.2011, 19:28
|
|
|
Частый гость
Регистрация: 12.07.2009
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помощь в WinAvr
Можно ли сказать компилятору, чтобы он встраивал вызываемую функцию непосредственно в код, где вызывается, а не прыгал на эту функцию?
Например, я создал библиотеку (.с и .h), где соответственно описана функция. В main.c я вызываю эту функцию в разных местах. Так мне надо чтобы он, непосредственно, каждый раз, включал эту функцию.
|
|
|
|
14.06.2011, 19:41
|
|
|
Заблокирован
Регистрация: 08.08.2007
Сообщений: 2,820
Сказал спасибо: 375
Сказали Спасибо 1,364 раз(а) в 744 сообщении(ях)
|
Re: Помощь в WinAvr
Сообщение от WartKert
|
|
Можно ли сказать компилятору, чтобы он встраивал вызываемую функцию непосредственно в код, где вызывается, а не прыгал на эту функцию?
|
Тогда макрос надо писать, а не функцию. Но может я что-то не знаю.
|
|
|
|
15.06.2011, 08:42
|
|
|
Частый гость
Регистрация: 11.11.2008
Адрес: Ekaterinburg
Сообщений: 14
Сказал спасибо: 8
Сказали Спасибо 5 раз(а) в 4 сообщении(ях)
|
Re: Помощь в WinAvr
Сообщение от WartKert
|
|
Можно ли сказать компилятору, чтобы он встраивал вызываемую функцию непосредственно в код, где вызывается, а не прыгал на эту функцию?
|
можете использовать __inline__ функции.
__________________
http://soft-ee.com Наша электроника и программы. Разработка встроенных (embedded) решений
|
|
|
|
15.06.2011, 22:28
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Помощь в WinAvr
Сообщение от WartKert
|
Можно ли сказать компилятору, чтобы он встраивал вызываемую функцию непосредственно в код, где вызывается, а не прыгал на эту функцию?
Например, я создал библиотеку (.с и .h), где соответственно описана функция. В main.c я вызываю эту функцию в разных местах. Так мне надо чтобы он, непосредственно, каждый раз, включал эту функцию.
|
Функции для встраивания пишутся прямо в заголовочном файле.
В GCC есть мощный механизм подсказок компилятору о том, чего хозяин желает - атрибуты.
Ваш случай:
|
Код:
|
// заголовочник file.h
#ifndef FILE_H
#define FILE_H
#include ‹stdint.h›
// прототип с атрибутами!
static inline uint16_t summa(uint8_t a,b) __attribute__((always_inline));
static inline uint16_t summa(uint8_t a,b)
{
return a+b;
}
#endif // #ifndef FILE_H
// main.c
#include "file.h"
uint8_t volatile var1,var2,result;
int main(void)
{
....
result = summa(var1,var2);
...
} |
Учтите некоторые особенности - такие функции не допускают взятие адреса, т.е. указатель на функцию с ними работать не будет. Они полностью вставляют себя каждый раз при использовании - размер растет вместе с быстродействием. Впрочем Вам походу именно это и нужно.
|
|
|
|
25.05.2012, 07:03
|
|
|
Прописка
Регистрация: 17.02.2009
Сообщений: 154
Сказал спасибо: 14
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Помощь в WinAvr
Доброго всем. А, что означает ключевые слова типа static,extern, встречаются при объявлении функций и переменных.
|
|
|
|
25.05.2012, 09:19
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Помощь в WinAvr
static при объявлении функции означает, что вызов этой функции возможен только внутри этого файла. Снаружи до нее не достучаться, она просто не видна. Очень полезно - не используемые статические функции компилятор обычно выбрасывает без проблем. Если static не укзывать - все функции будут скомпилированы. Не используемые все равно можно выкинуть, но уже на этапе линковки.
static для глобальной переменной - то же что и для функции. Ограничивает видимость переменной только в пределах файла. static для локальной переменной, т.е. объявленной внутри функции заставляет компилятор выделять под такую переменную память. Без этого она создавалась бы в прологе функции на стеке или в регистрах. И соответственно переставала бы существовать после выхода из функции. Статическая же существует постоянно, и соответственно ее значение сохраняется между вызовами функции в которой она объявлена. По сути она становится глобальной, только видимость ограничена функцией.
extern для функции используется только в прототипах. Необязателен, ни на что не влияет.
Для переменной указывает, что под переменную память выделять не надо - она объявлена в другом файле и именно там под нее выделена память. Простой пример - если с одной переменной надо работать из двух си файлов, то объявлять ее надо только в одном. А в другом она объявляется через extern - внешняя. И соответственно если объявлена через extern переменную нельзя инициализировать при объявлении.
|
|
|
|
25.05.2012, 17:51
|
|
|
Прописка
Регистрация: 17.02.2009
Сообщений: 154
Сказал спасибо: 14
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Помощь в WinAvr
kison-Спасибо, за подробное описание.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:35.
|
|