megajohn 3 3 февраля, 2020 Опубликовано 3 февраля, 2020 · Жалоба коллеги, не подскажете, 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 ); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gridinp 2 3 февраля, 2020 Опубликовано 3 февраля, 2020 (изменено) · Жалоба va_start наверное надо на fmt делать ... Изменено 3 февраля, 2020 пользователем gridinp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 3 февраля, 2020 Опубликовано 3 февраля, 2020 · Жалоба 14 минут назад, gridinp сказал: va_start наверное надо на fmt делать ... ой да, ваша правда. Поправил. Но все равно не помогло. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 3 февраля, 2020 Опубликовано 3 февраля, 2020 · Жалоба 3 часа назад, megajohn сказал: коллеги, не подскажете, c какой версии IAR реализована функция vsnprintf_P в stdio.h ? В версии 6.5 увы нет. или как можно обойти проблему через имеющийся vsnprintf ? А на кой она нужна? И какую "проблему" нужно обойти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gridinp 2 3 февраля, 2020 Опубликовано 3 февраля, 2020 (изменено) · Жалоба я не то написал, дело в том, что va_start даёт доступ к параметрам в стеке с аргументами, поэтому для доступа к аргументам после fmtP, нужно указывать только fmtP, если нужно скопировать строку, то сделать это надо imho до вызова dspl_printf 17 minutes ago, jcxz said: А на кой она нужна? И какую "проблему" нужно обойти? да просто удобней иметь printf для вывода на свой дисплей, чем каждый раз многострочно писать через sprintf Изменено 3 февраля, 2020 пользователем gridinp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 44 3 февраля, 2020 Опубликовано 3 февраля, 2020 · Жалоба Если надо использовать printf для разных "получателей", то можно применить fprintf, а вывод в UART или на дисплей определить в FILE * stream. И соответственно для USRT это будет один FILE, а для дисплея - другой Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 3 февраля, 2020 Опубликовано 3 февраля, 2020 · Жалоба 1 час назад, jcxz сказал: А на кой она нужна? И какую "проблему" нужно обойти? ну чтобы строка форматирования содержалась не в SRAM, а во FLASH ( SRAM и так маловато на этих AVR ) В опциях проекта стоит --string_literals_in_flash решил поубирать велосипеды и некрасивости в старом проекте Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 36 3 февраля, 2020 Опубликовано 3 февраля, 2020 · Жалоба 1 час назад, megajohn сказал: SRAM и так маловато на этих AVR В микроконтроллерах есть два размера SRAM - хватило и не хватило. Какая разница сколько её занято в готовом проекте? Лучше что-нибудь новое поделать или поизучать. Глядишь на новых процах и заморочек с адресацией не будет :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 3 февраля, 2020 Опубликовано 3 февраля, 2020 · Жалоба 1 час назад, VladislavS сказал: В микроконтроллерах есть два размера SRAM - хватило и не хватило. Какая разница сколько её занято в готовом проекте? не хватило. Каков будет ответ на начальный топик ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 36 3 февраля, 2020 Опубликовано 3 февраля, 2020 · Жалоба В версии 7.20.2 (почти крайняя) vsnprintf_P нет. Может стоит попробовать printf_P, урезав ему аппетиты в настройках? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 4 февраля, 2020 Опубликовано 4 февраля, 2020 · Жалоба 16 часов назад, VladislavS сказал: В версии 7.20.2 (почти крайняя) vsnprintf_P нет. да, тоже вчера навыкачивал различных версий и нифига. Как я понимаю, финт в первом посте вообще фигня и не возможен: va_start высчитывает адрес переменных аргументов после последнего известного аргумента. А раз у нас разные адресные пространства будь они не ладны, может по этому IAR до сих пор и не реализовало эту функцию ? хотя в AVR Libc упоминается ладно, попробуем через FILE* или printf_P Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 4 февраля, 2020 Опубликовано 4 февраля, 2020 · Жалоба В 03.02.2020 в 10:56, gridinp сказал: va_start наверное надо на fmt делать ... решил ради интереса поковыряться с vsnprintf и va_list таки нужно работать с fmtP, так как адрес переменных аргументов высчитывается от адреса последнего аргумента, пусть хоть это указатель на FLASH в итоге работает для %X %d %с и прочее, но для квалификатора %s нужно все строки выносить в SRAM, иначе фигня выходит =( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 4 февраля, 2020 Опубликовано 4 февраля, 2020 · Жалоба 2 часа назад, megajohn сказал: в итоге работает для %X %d %с и прочее, но для квалификатора %s нужно все строки выносить в SRAM, иначе фигня выходит =( Может просто написать свой парсер форматной строки? Разбирать полностью не нужно. Просто выделять каждую отдельную %-команду, если нужно - корректировать аргументы для неё (перенося в нужную память), копировать эту команду (со всем хвостом) в ОЗУ и вызывать штатную vsprintf для неё? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gridinp 2 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба On 2/4/2020 at 8:25 PM, megajohn said: решил ради интереса поковыряться с vsnprintf и va_list таки нужно работать с fmtP, так как адрес переменных аргументов высчитывается от адреса последнего аргумента, пусть хоть это указатель на FLASH в итоге работает для %X %d %с и прочее, но для квалификатора %s нужно все строки выносить в SRAM, иначе фигня выходит =( конечно, я же ниже написал, что неправ был Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба 14 часов назад, gridinp сказал: конечно, я же ниже написал, что неправ был извините, проглядел В 04.02.2020 в 23:02, jcxz сказал: Может просто написать свой парсер форматной строки? но пока разместил строки в SRAM и юзаю готовую функцию ( как и говорил VladislavS ). Как только упрусь у ограничение придётся делать, как пишите Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться