Jump to content

    
Sign in to follow this  
megajohn

vsnprintf_P

Recommended Posts

коллеги, не подскажете, 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 );

 

Share this post


Link to post
Share on other sites
3 часа назад, megajohn сказал:

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

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

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

Share this post


Link to post
Share on other sites

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

17 minutes ago, jcxz said:

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

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

Edited by gridinp

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
1 час назад, jcxz сказал:

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

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

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

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

Share this post


Link to post
Share on other sites
1 час назад, megajohn сказал:

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

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

Share this post


Link to post
Share on other sites
1 час назад, VladislavS сказал:

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

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

Share this post


Link to post
Share on other sites
16 часов назад, VladislavS сказал:

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
В 03.02.2020 в 10:56, gridinp сказал:

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

 

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

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

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

Share this post


Link to post
Share on other sites
2 часа назад, megajohn сказал:

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

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

Share this post


Link to post
Share on other sites
On 2/4/2020 at 8:25 PM, megajohn said:

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

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

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

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

Share this post


Link to post
Share on other sites
14 часов назад, gridinp сказал:

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

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

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

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

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this