Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Переменные long long
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
inventor
Как правильно использовать в IAR ?
Процессор Texas Instruments CC3200
Хочу присвоить переменной время в наносекундах или микросекундах
пишется какая то лажа - printf ничего не выводит, хотя пытаюсь и %lld и %Ld
компилятор C99 и вроде должен поддерживать все эти вещи
megajohn
Цитата(inventor @ Sep 3 2015, 15:50) *
компилятор C99 и вроде должен поддерживать все эти вещи


б-р-р, это вообще не причем.
Что стоит в General Options->LibraryOptions->Printf formatter ?
inventor
Цитата(megajohn @ Sep 3 2015, 16:32) *
б-р-р, это вообще не причем.
Что стоит в General Options->LibraryOptions->Printf formatter ?

ставил и normal и full - ничего не помогает
zltigo
QUOTE (inventor @ Sep 3 2015, 16:55) *
ставил и normal и full - ничего не помогает

1) Какая версия IAR?
2) У IAR несколько библиотек так-что нужно выбрать нужную Вашем случае Full, но кроме этого есть еще отдельные настройки полноты формата printf() - там тоже чего-нибудь типа Full
3) "пишется какая то лажа - printf ничего не выводит" - лажа и ничего, все-же разные вещи.
4) Есть докуменация на конкретный тип контрорллера+компилятора - там есть информация, что поддерживавется, что нет и в каких вариантах библиотек.
inventor
Цитата(zltigo @ Sep 3 2015, 18:53) *
1) Какая версия IAR?
2) У IAR несколько библиотек так-что нужно выбрать нужную Вашем случае Full, но кроме этого есть еще отдельные настройки полноты формата printf() - там тоже чего-нибудь типа Full
3) "пишется какая то лажа - printf ничего не выводит" - лажа и ничего, все-же разные вещи.
4) Есть докуменация на конкретный тип контрорллера+компилятора - там есть информация, что поддерживавется, что нет и в каких вариантах библиотек.

с библиотеками возица не стал - просто разбил длинное число на 2 u32 и вывожу
в 16-тиричном виде.
компилятор работает - заполняет переменные правильно.
yes
Цитата(inventor @ Sep 4 2015, 10:28) *
компилятор работает - заполняет переменные правильно.


дело не в компиляторе, а в том, какую версию pfintf из библиотеки он берет (точнее - что за библиотека) - то есть, насколько сложный "парсер" строки формата (то есть размер кода, который разбирает "%4.2f %+.0e %E" ) в этой функции реализован

в микрокотроллере памяти мало и полный формат, как в ман-е написано не всегда поддерживается


megajohn
Цитата(yes @ Sep 4 2015, 14:54) *
в микрокотроллере памяти мало и полный формат, как в ман-е написано не всегда поддерживается


сколько не смотрел код сгенерированный ИАРом, то всегда было одно:
SP минус число ( в зависимости от версии FULL LARGE etc ) а потом переход на реализацию принтфа. Никаких проверок "много памяти, мало памяти" чойта не видел.
zltigo
QUOTE (megajohn @ Sep 4 2015, 15:12) *
сколько не смотрел код сгенерированный ИАРом, то всегда было одно:
SP минус число ( в зависимости от версии FULL LARGE etc ) а потом переход на реализацию принтфа. Никаких проверок "много памяти, мало памяти" чойта не видел.

sm.gif sm.gif sm.gif Это линкер проверит sad.gif. Полная IAR библиотека совершенно невразумительного количества памяти требует - буквально килобайты. Тупо не влезает. В мелкие контроллеры даже принципиально не лезет.
yes
Цитата(megajohn @ Sep 4 2015, 15:12) *
сколько не смотрел код сгенерированный ИАРом, то всегда было одно:
SP минус число ( в зависимости от версии FULL LARGE etc ) а потом переход на реализацию принтфа. Никаких проверок "много памяти, мало памяти" чойта не видел.

речь про экономию памяти для кода

Tahoe
Цитата(inventor @ Sep 3 2015, 15:50) *
пишется какая то лажа - printf ничего не выводит, хотя пытаюсь и %lld и %Ld
компилятор C99 и вроде должен поддерживать все эти вещи

Он и поддерживает. Должно быть так:
Код
long long    ll = 100500;
printf( "ll = %" PRIu64 "\n\r", ll );


Остальное по аналогии можно найти самостоятельно. См. например тут или тут.

И лучше отойти от всех этих неопределенных short, long и т.п. В Це99 существуют более внятные типы, вроде uint32_t, uint64_t, int64_t...
zltigo
QUOTE (Tahoe @ Sep 6 2015, 06:33) *
Он и поддерживает. Должно быть так:

Находясь в твердом уме "так" писать не надо. Почему у Автора не получилсь - уже объяснили. По этой причине и использование макросов-оберток вместо явного описания формата ничего не изменит.
Tahoe
Цитата(zltigo @ Sep 6 2015, 10:04) *
Находясь в твердом уме "так" писать не надо. Почему у Автора не получилсь - уже объяснили. По этой причине и использование макросов-оберток вместо явного описания формата ничего не изменит.

Прежде чем лезть умничать, неплохо бы проверить/почитать. В IAR, даже с "правильной" библиотекой, действительно могут не работать %lld и %Ld, при этом PRIu64 работает без проблем. За давностью времени, сейчас уже не помню, на каком из IAR с этим сталкивался, возможно ARM, возможно AVR. Но это факт.

Что у автора получилось - я видел. Костыль, да еще и кривой. Мой вариант - рабочий. Причем в отличии от ворчания отдельных граждан, проверено непосредственно в IAR. Почему "так" писать надо, следует из ссылки, что я дал.

Код
#include    <inttypes.h>
#include    <stdio.h>

int        main( void )
{
    long long                ll    =    0;
    uint64_t                u64    =    0;

    while( true )
    {
        printf( "ll = %" PRIu64 "\n", ll );
        printf( "u64 = %" PRIu64 "\n", u64 );

        u64        =    u64 ? u64 << 1 : 1;
        ll        =    ll ? ll << 1 : 1;
    }
}


Терминал:
Код
u64 = 144115188075855872
ll = 288230376151711744
u64 = 288230376151711744
ll = 576460752303423488
u64 = 576460752303423488
ll = 1152921504606846976
u64 = 1152921504606846976
ll = 2305843009213693952
u64 = 2305843009213693952
ll = 4611686018427387904
u64 = 4611686018427387904
ll = 9223372036854775808
u64 = 9223372036854775808
ll = 0
u64 = 0
ll = 1
u64 = 1
ll = 2
u64 = 2
ll = 4
u64 = 4
ll = 8
u64 = 8
ll = 16
u64 = 16
ll = 32
u64 = 32
ll = 64
u64 = 64
ll = 128
u64 = 128
ll = 256
u64 = 256
ll = 512
u64 = 512
ll = 1024
u64 = 1024
ll = 2048
u64 = 2048
ll = 4096
u64 = 4096
zltigo
QUOTE (Tahoe @ Sep 6 2015, 20:37) *
Прежде чем лезть умничать, неплохо бы проверить/почитать. В IAR, даже с "правильной" библиотекой, действительно могут не работать %lld и %Ld, при этом PRIu64 работает без проблем.

А то, что муть " PRIu64 " есть ни что иное, как макрос-обертка llu это никакой мыслью в Вас в голове не отозвалось?

CODE
#define __STRINGIFY(a) #a
#define __PRI64(x) __STRINGIFY(l##x)
#define PRIu64        __PRI64(u)

Так что "проверяй" не проверяй.

QUOTE
Но это факт.

Увы, но это бред sad.gif.
QUOTE
Мой вариант - рабочий. Причем в отличии от ворчания отдельных граждан, проверено непосредственно в IAR.

Не сочтите за труд выкинуть муть " PRIu64 " и написать llu и получите точно такой-же рабочий вариант.
Tahoe
Цитата(zltigo @ Sep 6 2015, 21:54) *
Не сочтите за труд выкинуть муть " PRIu64 " и написать llu и получите точно такой-же рабочий вариант.

Вот на данной, конкретной версии EWARM? Вполне допускаю, что так оно и будет. Но это будет вариант "здесь играем, здесь не играем, здесь рыбу заворачивали"(с), в EWARM работает, в каком-нить EWAVR нет... Меня такой вариант не устраивает. Не хватало еще париться со всякой ерундой. Стандартная библиотека C99 предписывает использовать PRIxxx/SCNxxx? Значит их и буду использовать. Да, мне тоже не нравится и не привычно. Но меня никто не спрашивал.
zltigo
QUOTE (Tahoe @ Sep 6 2015, 22:09) *
Значит их и буду использовать.

Пользуйте, если их уродство глаз не режет, только не надо фантазий о их чудодейственной силе.
Tahoe
Цитата(zltigo @ Sep 6 2015, 22:14) *
Пользуйте, если их уродство глаз не режет, только не надо фантазий о их чудодейственной силе.

Я ж сказал, что глаз режет.

А вот за собственным языком лучше следить. На эти "фантазии" день-два убил, пока выяснил. А все претензии и ворчания рекомендую адресовать не мне, а тем, кто занимался стандартной билиотекой. Уверен, они с удовольствием выслушают и примут меры по мотивам этой чрезвычайно конструктивной критики.

Цитата(zltigo @ Sep 6 2015, 21:54) *
А то, что муть " PRIu64 " есть ни что иное, как макрос-обертка llu это никакой мыслью в Вас в голове не отозвалось?

Код
#define __STRINGIFY(a) #a
#define __PRI64(x) __STRINGIFY(l##x)
#define PRIu64        __PRI64(u)

Так что "проверяй" не проверяй.

Да-да, конечно-конечно. Осталось только самая малость, убедиться, что в _любом_ компилере это выглядит точно так же.
zltigo
QUOTE (Tahoe @ Sep 6 2015, 22:52) *
Да-да, конечно-конечно. Осталось только самая малость, убедиться, что в _любом_ компилере это выглядит точно так же.

Ну выглядит по разному, например, так:
CODE
#define PRIu64  "llu"

sm.gif
А знаете почему ВСЕГДА в результате такое для <64bit платформ, а для 64bit просто без ll? Потому, что все эти PRIu64 пишутся в разрыве кавычек текстовой строки. Это из-за того, что это макроподстановка текстовой строки в текстовую строку. И НИКАК иначе. Если-бы эти чудотворящие корявобуквоцифросочетания были-бы не макросами, то все выгдядело:

printf( "ll = %PRIu64\n", ll );

а не:
printf( "ll = %" PRIu64 "\n", ll );

Вот такой прикол sm.gif
Вообще это просто кое как сделанная "стандартная" заплатка для обеспечения портирования между 32 и 64bit платформами более ни для чего ненужная.
Tahoe
Цитата(zltigo @ Sep 6 2015, 23:28) *
Это из-за того, что это макроподстановка текстовой строки в текстовую строку. И НИКАК иначе.

Ага. "Я гарантирую это" (с).

А "не приходило в голову"(с) более очевидное: это для того, что бы _иметь_возможность_ реализовать в виде макроподстановки? Есть гарантия, что всегда и везде это реализовано именно в виде макроподстановки? Гарантия, разумеется, не от zltigo, а нечто более официальное.

И небольшой намек, как может быть реализовано.
scifi
Цитата(Tahoe @ Sep 7 2015, 01:03) *
Есть гарантия, что всегда и везде это реализовано именно в виде макроподстановки? Гарантия, разумеется, не от zltigo, а нечто более официальное.

О господи. Вот:
Цитата
Each of the following object-like macros expands to a character string literal
containing a conversion specifier, possibly modified by a length modifier, suitable for use
within the format argument of a formatted input/output function when converting the
corresponding integer type.

Это C99. Официальнее некуда. Советую заглядывать туда иногда прежде чем гнуть пальцы. А то как-то комично получается.
zltigo
QUOTE (Tahoe @ Sep 7 2015, 01:03) *
И небольшой намек, как может быть реализовано.

Господи sad.gif да каким боком-то здесь intrinsic функции. Уж не сочтите за труд без намеков разверуться, так сказать, во всей своей красе и показать все глубины своих представлений о языке.
Сергей Борщ
Вы можете продолжать спорить, но когда после перехода на 64-битную ОС у меня компилятор начал ругаться на printf("%lu", uint64_t_var), который прекрасно собирался на 32-битной системе (поскольку uint64_t из unsigned long превратился в unsigned int), для меня вопрос использования форматных макросов PRIxxx решился сам собой. Еще раньше я накалывался на аналогичное с uint32_t при переносе кода AVR<->PC, но поскольку на AVR я printf использую крайне редко, это не сильно напрягало. Я никого не убеждаю, каждый сам ест свой кактус.
zltigo
QUOTE (Сергей Борщ @ Sep 7 2015, 10:24) *
Вы можете продолжать спорить, но когда после перехода на 64-битную ОС у меня компилятор начал ругаться на printf("%lu", uint64_t_var), который прекрасно собирался на 32-битной системе (поскольку uint64_t из unsigned long превратился в unsigned int), для меня вопрос использования форматных макросов PRIxxx решился сам собой.

Вопрос ведь не в использовании заплатки, где надо, а в ее использовании где НЕ НАДО и о том, что работа этого чудотворящего макроса НИЧЕМ не отличается от llu в контексте 32bit ARM. Так что твоя реплика не по делу. Ну и по хорошему, а не через заплатку, такой вопрос решается через новые префиксы типа I64, но это пока отдано на откуп компилятору, хотя многие уже поддерживают.
Сергей Борщ
Цитата(zltigo @ Sep 7 2015, 10:52) *
а в ее использовании где НЕ НАДО
Можно озвучить критерии надо/не надо? Мне очень трудно заранее предугадать - будет код переноситься (хотя бы для тестирования) на другую платформу или нет. Поэтому сразу использую описанный в стандарте путь - PRIxx. Он работает всегда в отличие от. Так же как сразу использую (u)intXX_t, из "голых" типов у меня в программах остался только char для хранения символов. Это тоже описанный в стандарте путь и работает он всегда.

P.S. Я то сначала думал, что придирка к сообщению №10 пошла из-за объявления переменной long long и дальнейшего использования в строке формата PRIu64, т.е. если объявили long long, то и в строке формата надо использовать llu, а если хотим использовать PRIu64, то и переменную надо было объявлять как uint64_t ("Вы или трусы наденьте, или крестик снимите"), а потом смотрю - нет, тут оказывается сам факт использования PRIu64 объявлен ересью. С этим я согласиться не могу.
zltigo
QUOTE (Сергей Борщ @ Sep 7 2015, 11:50) *
Можно озвучить критерии надо/не надо? Мне очень трудно заранее предугадать

Ну вот если "трудно", тогда и используй. Мне пока совершенно не тудно предугадывать, что даже пренося для тестирования на 64bit платформу мне незачем компилировать, как 64bit приложение. Зато ломать глаза об эти заплатки, действительно трудно. Ну b на пути портирования printf() и других проблем, типа полноты реализаций sad.gif, хватает.
QUOTE
Так же как сразу использую (u)intXX_t, из "голых" типов у меня в программах остался только char для хранения символов.

С этим проще, чем с printf() - я тоже "голых" типов почти не использую (char и int, int полезен тем, что нативный для платформы и может использован де-факто для всего, чему достаточно от 8 до 16bit ), но и (u)intXX_t в явном виде тоже по причине того, что есть typedef sm.gif
Ведь проблемы с портированием 8->16->32->64 появилист ЗАДОЛГО до C99. Так что решал я эти проблемы уже 80-x годах и посему у меня с тех пор "свои" типы:
uchar, bint, ushort... Пишется-читается мне легче, а из "проблем" портирования редактирование одного *.h файла, тем более, что все равно часто при смене платформы меняется не только разрядность, и вот просто так ничего совсем не делая не получится. Да и новыми типами все не так радужно. При том-же портировании 8->16 большая пробоема в изобилии 8bit переменных, которых на других платформах 8bit корявы и приводят к тормознутости. Так у меня появилась 'bint', которая для все не восьмибитовых является int. C появлением C99 компиляторов я у себя в хидере заменил ее на "least" - поверил, работает, но оказалось НЕ всегда. Компилятор на свое усмотрение то 8, то 32 бита таки переменные делал. Так что сначала заменил ее на "fast", а потом и обратно на тупой int.
QUOTE
тут оказывается сам факт использования PRIu64 объявлен ересью. С этим я согласиться не могу.

Ересью НЕ объявлен. Просто назван тем, чем он является на самом деле - ЗАПЛАТКОЙ. Примитивной заплаткой для того, что-бы хоть создать какую-то видимость решения ЯВНОЙ ПРОБЛЕМЫ заложенной отцом-основателем языка. Как и ЛЮБУЮ ЗАПЛАТКУ ее надо использовать только в вынужденых случаях, а не где попало, типа на всякий случай.
Такое заплаточное "решение" лежит на поверхности и для его реализации совершенно не требуется C99 компилятора - достаточно любого голого препроцессора. Единственное нормальное решение это ОБЯЗАТЕЛЬНОЕ введение однозначных префиксов.
inventor
Цитата(Tahoe @ Sep 6 2015, 06:33) *
Он и поддерживает. Должно быть так:
Код
long long    ll = 100500;
printf( "ll = %" PRIu64 "\n\r", ll );


Остальное по аналогии можно найти самостоятельно. См. например тут или тут.

И лучше отойти от всех этих неопределенных short, long и т.п. В Це99 существуют более внятные типы, вроде uint32_t, uint64_t, int64_t...

Я СВОИ дефиниции именно так и реализовал

#define u64 int64_t

итд
zltigo
QUOTE (inventor @ Sep 8 2015, 08:08) *
Я СВОИ дефиниции именно так и реализовал

#define u64 int64_t

Вообще-то это ужасно, когда так пишут.
1) int64_t это никак не unsigned sad.gif
2) О typedef Автору слышать не приходилось sad.gif
CODE
typedef uint64_t u64



Сергей Борщ
Цитата(zltigo @ Sep 7 2015, 12:24) *
Такое заплаточное "решение" лежит на поверхности и для его реализации совершенно не требуется C99 компилятора - достаточно любого голого препроцессора.
Для его реализации необходим препроцессор. Но достаточно C99 компилятора, в котором это реализовано совершенно однозначно и одинаково у всех компиляторописателей для всех архитектур. Творить свой велосипед нет никакой необходимости - он будет ничем не лучше. Можно просто посмотреть на календарь и выкинуть уже компилятор, цепляющийся за стандарт 26-летней давности. Уже под все архитектуры существуют компиляторы, поддерживающие 16-летний стандарт.
inventor
Цитата(zltigo @ Sep 8 2015, 08:59) *
Вообще-то это ужасно, когда так пишут.
1) int64_t это никак не unsigned sad.gif
2) О typedef Автору слышать не приходилось sad.gif
Код
typedef uint64_t u64

ну да ошибся
конечно uint64_t
megajohn
хм, как то странно отработал printf c long long
Нажмите для просмотра прикрепленного файла

P.S. исправил - заработало. Стек задачи для теста забыл выровнять на 8. Топик-стартер, учел это ?
zltigo
QUOTE (Сергей Борщ @ Sep 8 2015, 09:19) *
Для его реализации необходим препроцессор.

Все с точностью до наоборот. Необходимы изменения в компиляторе.
QUOTE
Но достаточно C99 компилятора, в котором это реализовано совершенно однозначно и одинаково у всех компиляторописателей для всех архитектур.

Компилятор к этой заплатке ни сном ни духом - просто дефайны в хидере заменяющие на классические "u" и "ull". В ранее приведенном примере как раз дефайны из GCC.
Так-что латать можно абсолютно все.
QUOTE
Творить свой велосипед нет никакой необходимости - он будет ничем не лучше.

Про "свой" речь не идет, поскольку это должен быть компилятор, но лучше будет тем, что это будет поддерживаться железно, не потребует разборок и коррекций в хидере с тем, каков
сейчас размер int, ну и в конце-концов будет смотреться естественно, без дополнительный "". Минус тоже есть - разборка строки становится больше. Но я все-же за новые форматы типа %I64 и компиляторы их поддерживающие.
QUOTE
Можно просто посмотреть на календарь и выкинуть уже компилятор, цепляющийся за стандарт 26-летней давности.

К заплаткам компилятор не имеет отношения. А вот то, что за 26 лет так и не ввели в ОБЯЗАТЕЛЬНЫЙ стандарт однозначных форматов, а ограничились заплатками через препроцессор, это печально.
QUOTE
Уже под все архитектуры существуют компиляторы, поддерживающие 16-летний стандарт.

Неужели sm.gif. Увы, нет sad.gif sad.gif. Даже формальное наличие, например, GCC компилятора котрый кто-то сваял, например, под M8C не позволит мне на него перейти с какого-нибудь Image Craft. Ибо отличия в диалекте весьма велики, а в каких-нибудь Intrinsic, да и поросто ASM, просто фатальны. Такая-же история даже с казалось-бы массовыми PIC16 и Hi-Tech компиляторами. Так-что с C99 все не так благостно.
megajohn
Цитата(megajohn @ Sep 8 2015, 10:08) *
хм, как то странно отработал printf c long long
Нажмите для просмотра прикрепленного файла


P.S. исправил - заработало. Стек задачи для теста забыл выровнять на 8. Топик-стартер, учел это ?
Kabdim
Цитата(zltigo @ Sep 7 2015, 12:24) *
char и int, int полезен тем, что нативный для платформы и может использован де-факто для всего, чему достаточно от 8 до 16bit

Для этого есть не менее стандартные типы аля int_fast8_t и int_fast16_t - и сразу из текста программы ясно что было достаточно (двух)байтовой переменной в отличии от char'а / int'а на том же месте.
zltigo
QUOTE (Kabdim @ Sep 8 2015, 15:39) *
Для этого есть не менее стандартные типы аля uint_fast8_t и uint_fast16_t

Не канают. Ибо char как-бы может быть и signed. Правда за такие фокусы с char скорее руки отрывать надо sm.gif, но тем неменее. Ну а про "fast" я уже писал http://electronix.ru/forum/index.php?showt...t&p=1363201 . Да он в отличие от "least" не замечен был в неоднозначностях, но поскольку писать и читать все эти сложносочиненные типы ломает (других причин нет), то продолжаю использовать уже более 30 лет, свои typedef в специальном хидере, где задаются все нюансы платформы. Что, как уже писал, на самом деле и правильнее для embedded решений, ибо нюансов дофига и кроме разрядности. Ну а для абстракных приложений, там да - достаточно использовать такие сложносочиненные типы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.