Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

Результаты опроса: Я пользуюсь компилятором для AVR ...
WinAVR 17 27.42%
IAR 15 24.19%
CodeVision 22 35.48%
Другой компилятор С 1 1.61%
Я пишу не на С 7 11.29%
Голосовавшие: 62. Вы ещё не голосовали в этом опросе

 
Опции темы

IAR AVR

Непрочитано 15.09.2009, 12:33  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: IAR AVR

Сообщение от shulgaserj Посмотреть сообщение
и не понятно что у вас там включается "#include "sysmac.h"
макросы какие то?
У меня??? Это у ИАР. Там внутри:
Код:
#if defined(__IAR_SYSTEMS_ICC) && !defined(__IAR_SYSTEMS_ICC__)
#define __IAR_SYSTEMS_ICC__ 1
#endif

#if __IAR_SYSTEMS_ICC__ ‹ 7
#error The compiler is too old for this library!
#endif

#if __IAR_SYSTEMS_ICC__ › 7
#error This library is too old for this compiler!
#endif

#ifndef __CHAR_SIZE__
#define __CHAR_SIZE__ sizeof(char)
#endif

#ifndef __SHORT_SIZE__
#define __SHORT_SIZE__ sizeof(short)
#endif
// и т.д. и т.п.
Сообщение от alberio Посмотреть сообщение
Но спринтф не работает, может потому он такой толстозадый?
Да все там работает. Просто или добавьте ему функционала в настройках, либо пользуйтесь ключем %d и учитывайте что int знаковый, т.е. максимум +32767.
Реклама:
kison вне форума  
Непрочитано 15.09.2009, 12:34  
shulgaserj
Частый гость
 
Регистрация: 16.08.2007
Сообщений: 13
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
shulgaserj на пути к лучшему
По умолчанию Re: IAR AVR

И ещё один вопрос!
А где находится atoi?
в каком головнике?
Может там и есть itoa!
shulgaserj вне форума  
Непрочитано 15.09.2009, 12:37  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: IAR AVR

Сообщение от shulgaserj Посмотреть сообщение
Ну если вам не тяжело!
Мне не тяжело. Изменил. Не изменилось НИЧЕГО - ни размер ни быстродействие. Собственно другого и не ожидал. buf и &buf[0] - это указатель указывающий на один и тот же адрес.
kison вне форума  
Непрочитано 15.09.2009, 12:41  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: IAR AVR

Сообщение от shulgaserj Посмотреть сообщение
И ещё один вопрос!
А где находится atoi?
А посмотреть на предыдущей странице? Я весь файл привел - atoi там есть.
kison вне форума  
Непрочитано 15.09.2009, 13:02  
shulgaserj
Частый гость
 
Регистрация: 16.08.2007
Сообщений: 13
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
shulgaserj на пути к лучшему
По умолчанию Re: IAR AVR

Сообщение от kison Посмотреть сообщение
А посмотреть на предыдущей странице? Я весь файл привел - atoi там есть.
Отлично.

Ну тогда обратимся к первоисточникам:

/**
* Ansi C "itoa" based on Kernighan & Ritchie's "Ansi C"
* with slight modification to optimize for specific architecture:
*/
void strreverse(char* begin, char* end) {
char aux;

while(end›begin)
aux=*end, *end--=*begin, *begin++=aux;
}

void itoa(int value, char* str, int base) {
static char num[] = "0123456789abcdefghijklmnopqrstuvwxyz";
char* wstr=str;
int sign;
div_t res;

// Validate base
if (base‹2 || base›35){ *wstr='\0'; return; }

// Take care of sign
if ((sign=value) ‹ 0) value = -value;

// Conversion. Number is reversed.
do {
res = div(value,base);
*wstr++ = num[res.rem];
}while(value=res.quot);

if(sign‹0) *wstr++='-';

*wstr='\0';

// Reverse string
strreverse(str,wstr-1);
}

Ну и соответственно добавить описание в головняк типа stdlib.h следующее:

void strreverse(char* begin, char* end);
void itoa(int value, char* str, int base);
shulgaserj вне форума  
Непрочитано 15.09.2009, 13:09  
shulgaserj
Частый гость
 
Регистрация: 16.08.2007
Сообщений: 13
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
shulgaserj на пути к лучшему
По умолчанию Re: IAR AVR

Или чуть по лучше:

char* itoa(int value, char* result, int base) {
// check that the base if valid
if (base ‹ 2 || base › 36) {
*result = '\0';
return result;
}

char* ptr = result, *ptr1 = result, tmp_char;
int tmp_value;

do {
tmp_value = value;
value /= base;
*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789 \
abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];

} while ( value );

// Apply negative sign
if (tmp_value ‹ 0)
*ptr++ = '-';
*ptr-- = '\0';

while(ptr1 ‹ ptr) {
tmp_char = *ptr;
*ptr--= *ptr1;
*ptr1++ = tmp_char;
}

return result;
}
shulgaserj вне форума  
Непрочитано 15.09.2009, 13:34  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: IAR AVR

Сообщение от shulgaserj Посмотреть сообщение
Или чуть по лучше:
Попробовал это чуть получше. По размеру стало действительно лучше - всего 500 байт.
По тактам функция 1110 тактов при аргументе 1234 и базе 10.
Чисто стандартная библиотечная GCC-ная функция при тех же аргументах 940 тактов и 262 байта вся программа. Я это к чему - не всегда платно значит хорошо. Где то у ИАР конечно эффективность будет выше, но где то ниже. Удобство работы сомнительное. А есть бесплатный удобный инструмент - GCC. Вполне эффективный, мощный и в некоторых отношениях превосходящий ИАР. Зачем воровать то?
kison вне форума  
Непрочитано 15.09.2009, 14:55  
shulgaserj
Частый гость
 
Регистрация: 16.08.2007
Сообщений: 13
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
shulgaserj на пути к лучшему
По умолчанию Re: IAR AVR

Сообщение от kison Посмотреть сообщение
Попробовал это чуть получше. По размеру стало действительно лучше - всего 500 байт.
По тактам функция 1110 тактов при аргументе 1234 и базе 10.
Чисто стандартная библиотечная GCC-ная функция при тех же аргументах 940 тактов и 262 байта вся программа. Я это к чему - не всегда платно значит хорошо. Где то у ИАР конечно эффективность будет выше, но где то ниже. Удобство работы сомнительное. А есть бесплатный удобный инструмент - GCC. Вполне эффективный, мощный и в некоторых отношениях превосходящий ИАР. Зачем воровать то?

Возможно ещё упростить! Ну примерно так:

char* itoa(int val, int base){
static char buf[32] = {0};
int i = 30;

for(; val && i ; --i, val /= base)
buf[i] = "0123456789abcdef"[val % base];

return &buf[i+1];
}
shulgaserj вне форума  
Непрочитано 15.09.2009, 15:15  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: IAR AVR

Сообщение от shulgaserj Посмотреть сообщение
Возможно ещё упростить!
Это черезчур экстремальное упрощение. В итоге получается уже не itoa, мы теряем знак. Функция пересает быть реентерабельной и ее нельзя будет использовать ни в прерываниях, но в ОС с вытесняющей многозадачностью типа FreeRtos. Ну и уменьшился только размер - 366 байт. А время исполнения подросло - 1872 такта.
Тут как ни пыжься, а выше клотика не влезешь - достичь эффективность GNU ASM на компиляторе С не получится.
kison вне форума  
Непрочитано 15.09.2009, 15:28  
shulgaserj
Частый гость
 
Регистрация: 16.08.2007
Сообщений: 13
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
shulgaserj на пути к лучшему
По умолчанию Re: IAR AVR

Сообщение от kison Посмотреть сообщение
Это черезчур экстремальное упрощение. В итоге получается уже не itoa, мы теряем знак. Функция пересает быть реентерабельной и ее нельзя будет использовать ни в прерываниях, но в ОС с вытесняющей многозадачностью типа FreeRtos. Ну и уменьшился только размер - 366 байт. А время исполнения подросло - 1872 такта.
Тут как ни пыжься, а выше клотика не влезешь - достичь эффективность GNU ASM на компиляторе С не получится.
Ну в прерывания я конечно бы не стал пользоваться itoa. Хотя размер уменьшился. Где то находим, а где то теряем! Хотя такую ф-ю моно и на асме написать! С-ASM-C нормальная компановка. Ну если так стоит вопрос - то всю прогу моно на ASMе написать.
shulgaserj вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IAR for AVR kassiopay Микроконтроллеры, АЦП, память и т.д 5 27.03.2009 17:20
Глюк IAR C/EC++ Compiler for AVR 3.20 paha1956 Коллекция глюков 0 01.11.2006 17:31
IAR for AVR vasilij-kursikov Микроконтроллеры, АЦП, память и т.д 29 28.09.2006 18:14
IAR EW for Atmel AVR 4.12A Nikolajx Микроконтроллеры, АЦП, память и т.д 6 09.01.2006 15:18
[Решено] Ошибка в IAR C for AVR Lean Коллекция глюков 0 15.05.2003 11:34


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


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