Всем спасибо за быстрые ответы!
Модифицировал функцию, занимающуюся разбором спецификаторов. Получилось просто, всё работает. Далее описываю подробно.
1. Цель - сделать так, чтобы под IAR работал следующий код, написанный для CodeVisionAVR:
Код
sprintf(str,"Socket type=%p",(SocketType)?("TCP"):("UDP"));
Требуется, чтобы в IAR EWAVR код минимально отличался, например, выглядел так:
Код
sprintf_P(str,"Socket type=%p",(SocketType)?("TCP"):("UDP"));
2. Открываем EWAVR_CompilerReference.pdf, раздел "Overriding library modules", подраздел "Overriding library modules using IAR Embedded Workbench" и далее выполняем пункты из этого подраздела.
3. Создаем в своем проекте папку "mysprintf", в нее копируем файл "frmwri_p.c" (это модуль с функцией _formatted_write_P(), выполняющей разбор спецификаторов и собственно формированием форматированной строки) из папки "src\lib\dlib" (там, где установлен IAR). Модифицируем файл из библиотеки DLIB, так как компилироваться будет именно с ней. Аналогично можно модифицировать файл библиотеки CLIB.
4. В начале файла добавляем строчку, чтобы компилилось с поддержкой float (можно другой дефайн, см. frmwri_p.c).
Код
#define FLOAT_SUPPORT
5. Вносим требуемые изменения - комментируем стандартную обработку спецификатора 'p' и добавляем свой код:
Код
case 'p':
if ( !(flash_pointer = VAPTR(__flash char)) )
{
flash_pointer = null_pointer_str;
ptr = buf_pointer=0;
ptr += 13;
break;
}
if (precision < 0)
precision = 10000;
for (n=0; *flash_pointer++ && n < precision; n++)
;
buf_pointer = (char *)(--flash_pointer);
ptr = buf_pointer;
buf_pointer -= n;
flash_pointer -= n;
break;
Этот код сделан на базе обработчика спецификатора 's' (см. frmwri_p.c).
6. Далее изменения в коде для REDUCED_SUPPORT:
Код
case 'p':
ptr_flash = VAPTR(__flash char);
while (format_flag = *ptr_flash++)
{
put_one_char(format_flag, secret_pointer);
nr_of_chars++;
}
continue;
Тоже сделано на базе обработчика спецификатора 's'.
7. Больше ничего изменять не требуется, новые переменные не добавляются (используются имеющиеся).
8. Добавляем в свой проект модифицированный файл "mysprintf\frmwri_p.c", имя файла обязательно должно остаться таким же, какое оно в исходной библиотеке.
9. Компилируем, пьем кофе черный, последнее время чай.
10. Хорошая мысль использовать 'S' вместо 'p'. Можно и так сделать. Мне 'p' ни к чему, поэтому оставлю, как в CV.