| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
IAR AVR
15.09.2009, 00:25
|
|
|
Гражданин KAZUS.RUN
Регистрация: 08.07.2006
Сообщений: 582
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: IAR AVR
ну... хайтеч это сила! Для микрочипа компилю только на нем.
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
15.09.2009, 10:48
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: IAR AVR
Да, странно. Походу ИАР не совсем С компилятор - поддерживает стандарт не полностью. Удивительно в этом то, что ЭТО продается за деньги. В общем приношу свои извинения alberio, смеялся я зря. Итог - форматтеры %u, %i не поддерживаются ( их правда можно включить в настройках установив Library Options-›Printf formatter-›Large) , а вот с %d работает. Причем я попробовал разные варианты причин неработоспособности, в т.ч. увеличивал стеки ( данных аж до 512 байт), но не помогало. А потом попробовал другой ключик формата и заработало. Я сочувствую тем, кто пользуется ИАР - грабли вылезают на неожиданных местах.
|
|
|
|
15.09.2009, 11:58
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: IAR AVR
Ну и вдогонку. Раз уж поставил ИАР, надо и потестировать. Миф о его высокой эффективности рассеялся в пух и прах. Судите сами:
|
Код:
|
#include ‹stdio.h›
char buf[6];
unsigned int var = 1234;
volatile unsigned char i = 0;
int main(void)
{
sprintf(&buf[0],"%d",var);
while(1)
{
i++;
}
} |
Оптимизация по размеру FULL.
sprintf урезанный по максимуму - 7951 такт! 990 байт вся программа
sprintf medium - 1804 байта, 5574 такта.
sprintf полный - 5880 тактов, 3783 байт программа (странный результат, выполняется быстрее урезанного)
GCC урезанный sprintf ( все же куда больше соответствует стандарту, %i,%u работают) 1230 байт, 1550 тактов
Средний вариант - 1632 байта, 1320 тактов.
GCC - полный sprintf - 1376 тактов, 3162 байта, оптимизация также по размеру Os
Тоже странности есть со временем полного и урезанного. Хотя и не такие большие.
В принципе оптимизация не сильно и важна для библиотечный функций, они не оптимизируются в принципе ибо написаны на ассемблере. Все равно удивительно 1550 тактов против 7951...
Или для сравнения с равным функционалом - средняя функциональность
1320 тактов ГЦЦ, 5574 такта ИАР. Что то неладно в датском королевстве....
Работающие с ИАР - прокоментируйте плз, чего так медленно то? И это оптимизированные библиотечные функции???
Для желающих проверить самостоятельно использовались следующие версии:
ИАР 5.30.00
GCC 4.2.2
Последний раз редактировалось kison; 15.09.2009 в 12:09.
|
|
|
|
15.09.2009, 12:10
|
|
|
Частый гость
Регистрация: 16.08.2007
Сообщений: 13
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: IAR AVR
Добрый день или вечер!
Посмотри в include`х головной файл типа stdlib.
Там по идее должно быть следующее:
void itoa(int n,char *str);
void ltoa(long int n,char *str);
void ftoa(float n,unsigned char decimals,char *str);
void ftoe(float n,unsigned char decimals,char *str);
Ну с форматами понятно.
|
|
|
|
15.09.2009, 12:17
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: IAR AVR
Сообщение от shulgaserj
|
|
Посмотри в include`х головной файл типа stdlib.
|
Нет их там:
|
Код:
|
/* - STDLIB.H -
The ANSI-defined 'standard' functions.
$Revision: 38615 $
Copyright 1986 - 1999 IAR Systems. All rights reserved.
*/
#ifndef _STDLIB_INCLUDED
#define _STDLIB_INCLUDED
#ifndef _SYSTEM_BUILD
#pragma system_include
#endif
#include "sysmac.h"
#ifndef NULL
#define NULL ((void*) 0 )
#endif
typedef struct
{
int quot;
int rem;
} div_t;
typedef struct
{
long int quot;
long int rem;
} ldiv_t;
#define RAND_MAX 32767
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#define MB_CUR_MAX 1
#if __IAR_SYSTEMS_ICC__ ‹ 2
#if __TID__ & 0x8000
#pragma function=intrinsic(0)
#endif
#endif
#ifndef MEMORY_ATTRIBUTE
#define MEMORY_ATTRIBUTE
#endif
#ifndef PTR_ATTRIBUTE
#define PTR_ATTRIBUTE
#endif
__INTRINSIC MEMORY_ATTRIBUTE void *malloc(size_t);
__INTRINSIC MEMORY_ATTRIBUTE void free(void *);
__INTRINSIC MEMORY_ATTRIBUTE void exit(int);
__INTRINSIC MEMORY_ATTRIBUTE void *calloc(size_t, size_t);
__INTRINSIC MEMORY_ATTRIBUTE void *realloc(void *, size_t);
__INTRINSIC MEMORY_ATTRIBUTE int atoi(const char *);
__INTRINSIC MEMORY_ATTRIBUTE long atol(const char *);
__INTRINSIC MEMORY_ATTRIBUTE double atof(const char *);
__INTRINSIC MEMORY_ATTRIBUTE double strtod(const char *, char **);
__INTRINSIC MEMORY_ATTRIBUTE long int strtol(const char *, char **, int);
__INTRINSIC MEMORY_ATTRIBUTE unsigned long int strtoul(const char *, char **,
int);
__INTRINSIC MEMORY_ATTRIBUTE int rand(void);
__INTRINSIC MEMORY_ATTRIBUTE void srand(unsigned int);
__INTRINSIC MEMORY_ATTRIBUTE void abort(void);
__INTRINSIC MEMORY_ATTRIBUTE int abs(int);
__INTRINSIC MEMORY_ATTRIBUTE div_t div(int, int);
__INTRINSIC MEMORY_ATTRIBUTE long int labs(long int);
__INTRINSIC MEMORY_ATTRIBUTE ldiv_t ldiv(long int, long int);
__INTRINSIC MEMORY_ATTRIBUTE void *bsearch(const void *, const void *,
size_t, size_t,
int (*)(const void *,const void *));
__INTRINSIC MEMORY_ATTRIBUTE void qsort(void *, size_t, size_t,
int (*)(const void *, const void *));
#if __IAR_SYSTEMS_ICC__ ‹ 2
#if __TID__ & 0x8000
#pragma function=default
#endif
#endif
#endif /* _STDLIB_INCLUDED */ |
|
|
|
|
15.09.2009, 12:19
|
|
|
Частый гость
Регистрация: 16.08.2007
Сообщений: 13
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: IAR AVR
Сообщение от kison
|
Ну и вдогонку. Раз уж поставил ИАР, надо и потестировать. Миф о его высокой эффективности рассеялся в пух и прах. Судите сами:
|
Код:
|
#include ‹stdio.h›
char buf[6];
unsigned int var = 1234;
volatile unsigned char i = 0;
int main(void)
{
sprintf(&buf[0],"%d",var);
while(1)
{
i++;
}
} |
Оптимизация по размеру FULL.
sprintf урезанный по максимуму - 7951 такт! 990 байт вся программа
sprintf medium - 1804 байта, 5574 такта.
sprintf полный - 5880 тактов, 3783 байт программа (странный результат, выполняется быстрее урезанного)
GCC урезанный sprintf ( все же куда больше соответствует стандарту, %i,%u работают) 1230 байт, 1550 тактов
Средний вариант - 1632 байта, 1320 тактов.
GCC - полный sprintf - 1376 тактов, 3162 байта, оптимизация также по размеру Os
Тоже странности есть со временем полного и урезанного. Хотя и не такие большие.
В принципе оптимизация не сильно и важна для библиотечный функций, они не оптимизируются в принципе ибо написаны на ассемблере. Все равно удивительно 1550 тактов против 7951...
Или для сравнения с равным функционалом - средняя функциональность
1320 тактов ГЦЦ, 5574 такта ИАР. Что то неладно в датском королевстве....
Работающие с ИАР - прокоментируйте плз, чего так медленно то? И это оптимизированные библиотечные функции???
Для желающих проверить самостоятельно использовались следующие версии:
ИАР 5.30.00
GCC 4.2.2
|
Добрый день или вечер!
Попробуйте следующее более простое написание вместо:
sprintf(&buf[0],"%d",var);
использовать -- sprintf(&buf,"%d",var);
По умолчанию &buf - это и есть начало массива по адресу, с нулевой ячейки.
По возможности ответьте так же как ранее
"sprintf урезанный по максимуму - 7951 такт! 990 байт вся программа"
Сколько тактов и байтов прога.
|
|
|
|
15.09.2009, 12:21
|
|
|
Гражданин KAZUS.RUN
Регистрация: 08.07.2006
Сообщений: 582
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: IAR AVR
Ну пока компетентно комментировать не смогу - я еще новичок в иаре...
Но спринтф не работает, может потому он такой толстозадый?
Вы сравните ансишно написаный код...
И, действительно, хотелось бы услышать мнение опытных пользователь IAR, не обязательно AVR, "сердце" все равно практически тоже самое...
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
15.09.2009, 12:24
|
|
|
Частый гость
Регистрация: 16.08.2007
Сообщений: 13
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: IAR AVR
Сообщение от kison
|
Нет их там:
|
Код:
|
/* - STDLIB.H -
The ANSI-defined 'standard' functions.
$Revision: 38615 $
Copyright 1986 - 1999 IAR Systems. All rights reserved.
*/
#ifndef _STDLIB_INCLUDED
#define _STDLIB_INCLUDED
#ifndef _SYSTEM_BUILD
#pragma system_include
#endif
#include "sysmac.h"
#ifndef NULL
#define NULL ((void*) 0 )
#endif
typedef struct
{
int quot;
int rem;
} div_t;
typedef struct
{
long int quot;
long int rem;
} ldiv_t;
#define RAND_MAX 32767
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#define MB_CUR_MAX 1
#if __IAR_SYSTEMS_ICC__ ‹ 2
#if __TID__ & 0x8000
#pragma function=intrinsic(0)
#endif
#endif
#ifndef MEMORY_ATTRIBUTE
#define MEMORY_ATTRIBUTE
#endif
#ifndef PTR_ATTRIBUTE
#define PTR_ATTRIBUTE
#endif
__INTRINSIC MEMORY_ATTRIBUTE void *malloc(size_t);
__INTRINSIC MEMORY_ATTRIBUTE void free(void *);
__INTRINSIC MEMORY_ATTRIBUTE void exit(int);
__INTRINSIC MEMORY_ATTRIBUTE void *calloc(size_t, size_t);
__INTRINSIC MEMORY_ATTRIBUTE void *realloc(void *, size_t);
__INTRINSIC MEMORY_ATTRIBUTE int atoi(const char *);
__INTRINSIC MEMORY_ATTRIBUTE long atol(const char *);
__INTRINSIC MEMORY_ATTRIBUTE double atof(const char *);
__INTRINSIC MEMORY_ATTRIBUTE double strtod(const char *, char **);
__INTRINSIC MEMORY_ATTRIBUTE long int strtol(const char *, char **, int);
__INTRINSIC MEMORY_ATTRIBUTE unsigned long int strtoul(const char *, char **,
int);
__INTRINSIC MEMORY_ATTRIBUTE int rand(void);
__INTRINSIC MEMORY_ATTRIBUTE void srand(unsigned int);
__INTRINSIC MEMORY_ATTRIBUTE void abort(void);
__INTRINSIC MEMORY_ATTRIBUTE int abs(int);
__INTRINSIC MEMORY_ATTRIBUTE div_t div(int, int);
__INTRINSIC MEMORY_ATTRIBUTE long int labs(long int);
__INTRINSIC MEMORY_ATTRIBUTE ldiv_t ldiv(long int, long int);
__INTRINSIC MEMORY_ATTRIBUTE void *bsearch(const void *, const void *,
size_t, size_t,
int (*)(const void *,const void *));
__INTRINSIC MEMORY_ATTRIBUTE void qsort(void *, size_t, size_t,
int (*)(const void *, const void *));
#if __IAR_SYSTEMS_ICC__ ‹ 2
#if __TID__ & 0x8000
#pragma function=default
#endif
#endif
#endif /* _STDLIB_INCLUDED */ |
|
Тогда по поиску в include "ltoa" или "itoa" (перевернутая atoi)
и не понятно что у вас там включается "#include "sysmac.h"
макросы какие то?
|
|
|
|
15.09.2009, 12:24
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: IAR AVR
Сообщение от shulgaserj
|
Попробуйте следующее более простое написание вместо:
sprintf(&buf[0],"%d",var);
использовать -- sprintf(&buf,"%d",var);
|
Это поменять шило на мыло. Никакой разницы нет вообще.
Сообщение от shulgaserj
|
|
Сколько тактов и байтов прога.
|
Я вроде для всех вариантов привел. Для минимума функциональности ИАР 990 байт 7951 такт. Найти схожий урезанный вариант у GCC не удалось - там в минимуме куда больше возможностей включая беззнаковый вывод. Но минимум 1230 байт 1550 тактов.
|
|
|
|
15.09.2009, 12:31
|
|
|
Частый гость
Регистрация: 16.08.2007
Сообщений: 13
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: IAR AVR
Сообщение от kison
|
Это поменять шило на мыло. Никакой разницы нет вообще.
Я вроде для всех вариантов привел. Для минимума функциональности ИАР 990 байт 7951 такт. Найти схожий урезанный вариант у GCC не удалось - там в минимуме куда больше возможностей включая беззнаковый вывод. Но минимум 1230 байт 1550 тактов.
|
sprintf(&buf[0],"%d(u),"1234")" - Принудительно писать в buf начиная с нулевой ячейкой.
Хотя &buf - это и есть указатель адреса с нуловой ячейкой.
Ну если вам не тяжело!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:33.
|
|