Перейти к содержанию
    

vsnprintf_P

коллеги, не подскажете, c какой версии IAR реализована функция vsnprintf_P в stdio.h ? В версии 6.5 увы нет.

или как можно обойти проблему через имеющийся vsnprintf ?

попробовал тупо - не сработало

void dspl_printf( char __flash* fmtP, ... )
{
    char fmt[10];
    strncpy_P( fmt, fmtP, sizeof( fmt ) );
    va_list uk_arg;
    va_start( uk_arg, fmt );

    char buff[ 10 ];    
    int len = vsnprintf( buff, sizeof( buff ), fmt, uk_arg );

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

va_start наверное надо на fmt делать ...

Изменено пользователем gridinp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 минут назад, gridinp сказал:

va_start наверное надо на fmt делать ...

 

ой да, ваша правда. Поправил. Но все равно не помогло.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, megajohn сказал:

коллеги, не подскажете, c какой версии IAR реализована функция vsnprintf_P в stdio.h ? В версии 6.5 увы нет.

или как можно обойти проблему через имеющийся vsnprintf ?

А на кой она нужна? И какую "проблему" нужно обойти?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я не то написал, дело в том, что va_start даёт доступ к параметрам в стеке с аргументами, поэтому для доступа к аргументам после fmtP, нужно указывать только fmtP, если нужно скопировать строку, то сделать это надо imho до вызова dspl_printf

17 minutes ago, jcxz said:

А на кой она нужна? И какую "проблему" нужно обойти?

да просто удобней иметь printf для вывода на свой дисплей, чем каждый раз многострочно писать через sprintf

Изменено пользователем gridinp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если надо использовать printf для разных "получателей", то можно применить fprintf, а вывод в UART или на дисплей определить в FILE * stream.

И соответственно для USRT это будет один FILE, а для дисплея - другой

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jcxz сказал:

А на кой она нужна? И какую "проблему" нужно обойти?

ну чтобы строка форматирования содержалась не в SRAM, а во FLASH ( SRAM и так маловато на этих AVR )

В опциях проекта стоит --string_literals_in_flash

решил поубирать велосипеды и некрасивости в старом проекте

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, megajohn сказал:

SRAM и так маловато на этих AVR

В микроконтроллерах есть два размера SRAM - хватило и не хватило. Какая разница сколько её занято в готовом проекте? Лучше что-нибудь новое поделать или поизучать. Глядишь на новых процах и заморочек с адресацией не будет :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, VladislavS сказал:

В микроконтроллерах есть два размера SRAM - хватило и не хватило. Какая разница сколько её занято в готовом проекте?

не хватило. Каков будет ответ на начальный топик ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В версии 7.20.2 (почти крайняя) vsnprintf_P нет.

Может стоит попробовать printf_P, урезав ему аппетиты в настройках?

Printf_P.thumb.png.1dd4ff4bf5d55cc879ac891fad4083cf.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 часов назад, VladislavS сказал:

В версии 7.20.2 (почти крайняя) vsnprintf_P нет.

да, тоже вчера навыкачивал различных версий и нифига.

Как я понимаю, финт в первом посте вообще фигня и не возможен: va_start высчитывает адрес переменных аргументов после последнего известного аргумента.

А раз у нас разные адресные пространства будь они не ладны, может по этому IAR до сих пор и не реализовало эту функцию ?

хотя в AVR Libc упоминается

ладно, попробуем через FILE* или printf_P

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 03.02.2020 в 10:56, gridinp сказал:

va_start наверное надо на fmt делать ...

 

решил ради интереса поковыряться с vsnprintf  и va_list

таки нужно работать с fmtP, так как адрес переменных аргументов высчитывается от адреса последнего аргумента, пусть хоть это указатель на FLASH

в итоге работает для %X %d %с и прочее, но для квалификатора %s нужно все строки выносить в SRAM, иначе фигня выходит =(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, megajohn сказал:

в итоге работает для %X %d %с и прочее, но для квалификатора %s нужно все строки выносить в SRAM, иначе фигня выходит =(

Может просто написать свой парсер форматной строки? Разбирать полностью не нужно. Просто выделять каждую отдельную %-команду, если нужно - корректировать аргументы для неё (перенося в нужную память), копировать эту команду (со всем хвостом) в ОЗУ и вызывать штатную vsprintf для неё?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 2/4/2020 at 8:25 PM, megajohn said:

решил ради интереса поковыряться с vsnprintf  и va_list

таки нужно работать с fmtP, так как адрес переменных аргументов высчитывается от адреса последнего аргумента, пусть хоть это указатель на FLASH

в итоге работает для %X %d %с и прочее, но для квалификатора %s нужно все строки выносить в SRAM, иначе фигня выходит =(

конечно, я же ниже написал, что неправ был

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 часов назад, gridinp сказал:

конечно, я же ниже написал, что неправ был

извините, проглядел

В 04.02.2020 в 23:02, jcxz сказал:

Может просто написать свой парсер форматной строки?

но пока разместил строки в SRAM и юзаю готовую функцию ( как и говорил VladislavS  ). Как только упрусь у ограничение придётся делать, как пишите

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...