Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

Помощь в WinAvr

Непрочитано 09.06.2011, 20:02  
WartKert
Частый гость
 
Регистрация: 12.07.2009
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
WartKert на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Я хочу чтобы при сборки проекта, в зависимости от переменной Data_port(она имеет известное, постоянное значение), подключались разные блоки кода.
Реклама:
WartKert вне форума  
Непрочитано 09.06.2011, 20:59  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Тогда разберитесь с директивами условной компиляции...
st_1 вне форума  
Непрочитано 09.06.2011, 21:06  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию 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
kison вне форума  
Непрочитано 14.06.2011, 19:28  
WartKert
Частый гость
 
Регистрация: 12.07.2009
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
WartKert на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Можно ли сказать компилятору, чтобы он встраивал вызываемую функцию непосредственно в код, где вызывается, а не прыгал на эту функцию?
Например, я создал библиотеку (.с и .h), где соответственно описана функция. В main.c я вызываю эту функцию в разных местах. Так мне надо чтобы он, непосредственно, каждый раз, включал эту функцию.
WartKert вне форума  
Непрочитано 14.06.2011, 19:41  
RY723
Заблокирован
 
Регистрация: 08.08.2007
Сообщений: 2,820
Сказал спасибо: 375
Сказали Спасибо 1,364 раз(а) в 744 сообщении(ях)
RY723 на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Сообщение от WartKert Посмотреть сообщение
Можно ли сказать компилятору, чтобы он встраивал вызываемую функцию непосредственно в код, где вызывается, а не прыгал на эту функцию?
Тогда макрос надо писать, а не функцию. Но может я что-то не знаю.
RY723 вне форума  
Непрочитано 15.06.2011, 08:42  
ELayer
Частый гость
 
Аватар для ELayer
 
Регистрация: 11.11.2008
Адрес: Ekaterinburg
Сообщений: 14
Сказал спасибо: 8
Сказали Спасибо 5 раз(а) в 4 сообщении(ях)
ELayer на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Сообщение от WartKert Посмотреть сообщение
Можно ли сказать компилятору, чтобы он встраивал вызываемую функцию непосредственно в код, где вызывается, а не прыгал на эту функцию?
можете использовать __inline__ функции.
__________________
http://soft-ee.com Наша электроника и программы. Разработка встроенных (embedded) решений
ELayer вне форума  
Непрочитано 15.06.2011, 22:28  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию 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);
...
}
Учтите некоторые особенности - такие функции не допускают взятие адреса, т.е. указатель на функцию с ними работать не будет. Они полностью вставляют себя каждый раз при использовании - размер растет вместе с быстродействием. Впрочем Вам походу именно это и нужно.
kison вне форума  
Непрочитано 25.05.2012, 07:03  
AGAT0365
Прописка
 
Регистрация: 17.02.2009
Сообщений: 154
Сказал спасибо: 14
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
AGAT0365 на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Доброго всем. А, что означает ключевые слова типа static,extern, встречаются при объявлении функций и переменных.
AGAT0365 вне форума  
Непрочитано 25.05.2012, 09:19  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Помощь в WinAvr

static при объявлении функции означает, что вызов этой функции возможен только внутри этого файла. Снаружи до нее не достучаться, она просто не видна. Очень полезно - не используемые статические функции компилятор обычно выбрасывает без проблем. Если static не укзывать - все функции будут скомпилированы. Не используемые все равно можно выкинуть, но уже на этапе линковки.
static для глобальной переменной - то же что и для функции. Ограничивает видимость переменной только в пределах файла. static для локальной переменной, т.е. объявленной внутри функции заставляет компилятор выделять под такую переменную память. Без этого она создавалась бы в прологе функции на стеке или в регистрах. И соответственно переставала бы существовать после выхода из функции. Статическая же существует постоянно, и соответственно ее значение сохраняется между вызовами функции в которой она объявлена. По сути она становится глобальной, только видимость ограничена функцией.
extern для функции используется только в прототипах. Необязателен, ни на что не влияет.
Для переменной указывает, что под переменную память выделять не надо - она объявлена в другом файле и именно там под нее выделена память. Простой пример - если с одной переменной надо работать из двух си файлов, то объявлять ее надо только в одном. А в другом она объявляется через extern - внешняя. И соответственно если объявлена через extern переменную нельзя инициализировать при объявлении.
kison вне форума  
Непрочитано 25.05.2012, 17:51  
AGAT0365
Прописка
 
Регистрация: 17.02.2009
Сообщений: 154
Сказал спасибо: 14
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
AGAT0365 на пути к лучшему
По умолчанию Re: Помощь в WinAvr

kison-Спасибо, за подробное описание.
AGAT0365 вне форума  
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подниму тему WinAVR vs IAR oleg110592 Микроконтроллеры, АЦП, память и т.д 5 24.10.2015 14:06
На WinAVR + AVR Studio c CVAVR Vetal-soft Embedd С 87 03.03.2013 20:31
WinAVR: Cи vs C++ vovan_zh Микроконтроллеры, АЦП, память и т.д 3 08.10.2010 23:06
WinAVR не нравится символ '\' vovan_zh Микроконтроллеры, АЦП, память и т.д 10 10.09.2010 20:48
помогите начинающему по WinAVR umkamaks Микроконтроллеры, АЦП, память и т.д 4 05.05.2010 21:01


Часовой пояс GMT +4, время: 02:35.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.