8-900-374-94-44
[email protected]
Slide Image
Меню

Iar sprintf: IAR EWB ARM: форматированный вывод printf библиотеки DLIB | arm

Есть ли в среде IAR функции перевода из десятичного числа в строку и наоборот?

caxapa.ru :: Есть ли в среде IAR функции перевода из десятичного числа в строку и наоборот?

ВходНаше всё Теги codebook PARTS Поиск Опросы Закон Воскресенье
30 апреля

О смысле всего сущего0xFF Средства и методы разработки Мобильная и беспроводная связь Блошиный рынокОбъявления

МикроконтроллерыPLD, FPGA, DSP AVRPICARM, RISC-VТехнологии Кибернетика, автоматика, протоколы Схемы, платы, компоненты

450542

sierra (04.10.2013 10:23, просмотров: 7728)

Есть ли в среде IAR функции перевода из десятичного числа в строку и наоборот? При написании Hex2Dec или Dec2Hex пишет что функция не определена. Где можно найти исходный код для этих функций?

Ответить

    • У IAR в либах есть стандартные функции sprintf() и sscanf(), которые справятся с этим делом, если задать формат числа «%X».  —
      Ксения
      (04.10.2013 18:03)
      • Нельзя ли узнать, сколько ROM уходит на sprintf() ? — AndreasW(12.10.2013 20:05)
        • Обычно расход ROM — ерунда, а вот затраты RAM на типовой *printf поначалу весьма удивляют. — vmp(12.10.2013 21:12)
        • Много, к сожалению. И еще зависит от того, заказываете ли плавающую арифметику (это галочка в проекте). Чем считать, проще проверить, сравнив размер программы занимаемый в ROM, с функцией sprintf и без нее. — Ксения(12.10.2013 20:52)
          • красота требует ЖЕРТВ 🙂 — RED_DRAGON(12.10.2013 20:54)
        • Можно — закоментируйте вызов sprintf и сравните размеры до и после. — Apтём
          (12. 10.2013 20:45)
      • спасибо — sierra(08.10.2013 09:35)
    • вывод в буфер LCD:  zeleny(1034 знак., 04.10.2013 16:26)
      • Спасибо!! — sierra(08.10.2013 09:37)
    • Вот например вот такая либа. хотите пользуйте, хотите пишите свое, как пример нормальная себе такая либа  RED_DRAGON(04.10.2013 15:16)
      • спасибо — sierra(08.10.2013 09:37)
    • itoa, atoi? — MBedder(04.10.2013 11:32)
      • «Ёжики плакали, кололись, но продолжали жрать кактус» (с). Это я про игнорирование логичных советов и нежелания читать RTFM по языкам и компиляторам.
        Применение своих функций вместо стандартных должно быть обосновано. — VVB(09.10.2013 06:30)
        • обоснование обычно простое: «эти ваши библиотеки написаны криворукими индусами/финскими студентами, я свои лучше напишу!». — Snaky(09.10.2013 06:42)
          • Не менее криворукие? Индокод хоть протестирован, как-то работает. — fk0(09.10.2013 08:49)
    • Использую самодельные функции… Принцип прост- делим на десять и берём остаток. Можно (если нужно, но мне не нужно) доработать и оценивать размерность. Понятно, что данный пример, созданный для вывода на ЖКИ, не преобразует
      именно
      в  KLIM83(452 знак., 04.10.2013 10:31 — 10:39)
      • За такой код при Сталине — расстреливали. Особенно за деление int на 10000000. На процессоре без аппаратного деления (это даже армы) это тысячи тактов и киловат-часы (если через эту штуку выпечатывается достаточно много — очень быстро начинаешь  fk0(364 знак., 04.10.2013 15:10)
        • Перфекционизм использую при разводке плат и когда в один килобайт надо разместить неразмещаемое. Нужен ли он всегда, особенно если нет погони за производительностью/ киловаттами? Моё мнение- нет. —
          KLIM83
          (04.10.2013 15:37)
          • Согласен. Поэтому там должен быть sprintf. — SciFi(04.10.2013 15:42)
            • proof of concept… хотя, боюсь, тут не поймут.  fk0(1320 знак., 04.10.2013 21:10)
      • +1 — lexxx-lexxx(04. 10.2013 11:39)
    • Это наверное мои функции? ;-))  FDA(408 знак., 04.10.2013 10:29)
      • хе-хе  SciFi(270 знак., 04.10.2013 12:27 — 12:32)
        • int2hex(0x1234) —> нарушение границ, ядро свалено. hex2int(‘z’) — бредовый результат. При всём при том, sscanf/strtoul и sprintf шансов облажаться практически не оставляют и позволяют минимальную валидацию ввода. —
          fk0
          (04.10.2013 15:03)
          • Я просто не хотел пугать оптимизаторщиков ассертами 🙂  SciFi(333 знак., 04.10.2013 15:14)
        • Библиотечные функции для новичков и ламиров. Учись размазывать 3-строчный код на две страницы, будь профессионалом. — fk0(04. 10.2013 12:41)
      • Да, конечно Ваши..все еще пытаюсь разобраться с GPS модулем) спасибо, заработало — sierra(04.10.2013 12:14)
      • Для использование функции toupper нужно подключить стандартную библиотеку:  FDA(33 знак., 04.10.2013 10:31)
        • Сначала использовала Ваши функции, только она делает сдвиг на 4 у первого числа. У меня для правильности результата а нужно умножить на 10 и прибавить b. Тогда работает) — sierra(08.10.2013 09:39)
          • Hex2Dec и должна именно сдвигать первое число. Это же перевод из 16-ричной системы в 10-ую — FDA(08.10.2013 09:42)

c — Перенаправить printf на консольный ввод-вывод в IAR Embedded Workbench

Я закодировал свой проект на C на компьютере с Windows в программном обеспечении IAR Embedded Workbench IDE .

Проект компилируется и работает нормально. У меня есть пара функций printf в моем коде. Но все дело в том, что проект рассчитан на микроконтроллер AT91SAM7X256. Я успешно создал свое приложение для работы на оперативной памяти микроконтроллера, и приложение было успешно загружено. Но 9Функция 0003 printf направляется на порт USART контроллера (я могу только предположить), и поэтому я хотел бы перенаправить printf для отображения текста на моем терминале ввода-вывода. Кто-нибудь знает, как я могу это сделать?

  • c
  • windows
  • встроенный
  • printf
  • микроконтроллер

1

Я использую версии процессоров ARM, AVR32 и MSP430 набора инструментов IAR. В каждом из них вы должны реализовать свою собственную низкоуровневую функциональность для обработки потоков stdin и stdout. В руководстве по компилятору ARM есть раздел «Стандартные потоки для ввода и вывода», в котором говорится, что вам нужно написать собственную версию функции __write(), и приводится пример версии, в которой данные записываются на светодиодный дисплей с отображением памяти.

.

Зная IAR, я ожидаю, что у них будет аналогичный пример для вашей комбинации процессор/тулчейн.

6

Я не знаю, почему ваш printf перенаправляется, но чтобы сделать то, что вы хотите, я сделал следующее: Сначала покажите окно консоли. (во время отладки перейдите в меню View-> Terminal I/O затем остановив приложение, перейдите в Project->Options и в Linker->Library установите флажок Включить поддержку отладки C-SPY

Имейте в виду, что это делает работу программы значительно медленнее, чем должна быть. Закомментируйте все printfs позже, когда закончите отладку

Стандартный ответ — выбрать «Semihosted» и «через полухостинг» (или через SWO — но я использовал другой вариант). И «буферизованный вывод терминала» для скорости в библиотеке варианты 1.

Тем не менее, я ковыряюсь здесь, потому что у меня есть демо-программа от ST, которая не выводит на консоль печать, и я не знаю, почему — есть много приложений, которые работают. Так что, если кто-то может вспомнить какую-то деталь, которая не входит в стандартную информацию, не стесняйтесь сказать что-нибудь…

все, что вам нужно сделать, это #include и использовать printf() в вашем коде. Чтобы это работало с консолью отладчика, вам нужно будет перейти в «Параметры проекта» -> «Компоновщик» -> «Вывод» (вкладка) и в разделе «Формат», где вы выбрали «Отладочная информация для C-SPY», вам нужно иметь «С Модули эмуляции ввода-вывода» отмечены (для этого требуется «с модулями управления во время выполнения»). Это заставит компоновщик использовать свои специальные низкоуровневые процедуры ввода-вывода (putchar(), getchar()), которые будут направлять его в/из консоли ввода-вывода отладочного терминала.

При входе в режим отладки вы можете открыть окно консоли отладки, выбрав View -> Terminal I/O в верхнем меню. Вы, вероятно, заметите, что если вы попытаетесь напечатать слишком много текста, это приведет к некоторой задержке вывода. Но в любом случае это может быть удобным инструментом для отладки вашего приложения.

(Для любопытных, вы можете увидеть в дизассемблере, что функции putchar() / getchar(), связанные с кодом при использовании эмуляции ввода-вывода, являются просто фиктивными функциями инструкций NOP. Отладчик C-SPY установит аппаратную точку останова в этой функции, и всякий раз, когда эта точка останова будет достигнута, он будет считывать регистр для чтения/записи символа. Накладные расходы связи вызывают небольшую задержку для каждого символа. Побочным эффектом использования эмуляции ввода-вывода является то, что отладчик резервирует по одной аппаратной точке останова для каждой из этих двух функций (если вы их используете), поэтому вы получите меньше аппаратных точек останова, доступных для использования при отладке других приложений.)

Дополнительную информацию о модулях эмуляции ввода/вывода можно найти в руководстве пользователя IAR: Справка -> Руководство пользователя 8051 Embedded Workbench.

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

[AVR]IAR에서 sprintf 소수점 사용하기

xcl 파일을 수정해야한다. .

atmega128 기준..

/*                     — lnkm128.xcl —
 *
 *   Командный файл XLINK для C-компилятора ICCAVR с параметрами —cpu=m128, -ms
 *  . Сегменты определены для ATmega128 без внешней памяти
 *  . Также можно «добавить» внешнюю SRAM, EPROM и EEPROM.
 *
 *   Использование: xlink your_file(s) -f lnkm128
 *
 *   Версия файла: $Revision: 1.9 $
 */

/*================== ===================================*/
/*
 * Константы, используемые ниже,
 * Не изменять эти строки,
 * если не указано иное
 */

/* Сегменты кода (flash) */
-D_..X_INTVEC_SIZE=8C   /* 4 байта * 35 векторов */
-D_ ..X_FLASH_TEND=FF    /* Конец маленькой флэш-памяти */
-D_..X_FLASH_NEND=FFFF  /* Конец ближней флэш-памяти */
-D_..X_FLASH_END=1FFFF  /* Конец флэш-памяти */
/* Внутренняя память данных */

/*
 * Измените две строки ниже на 60(BASE) и FF(TEND)
 * если вы работаете в «режиме mega103»
 */
-D_. .X_SRAM_BASE=100    /* Начало оперативной памяти */
-D_..X_SRAM_TEND=100    /* Конец маленькой оперативной памяти */

-D_..X_SRAM_END=10FF    /* Конец оперативной памяти memory */
/* Внутренняя EEPROM */
-D_..X_EEPROM_END=FFF   /* Конец памяти eeprom */
/*===================== ===============================*/


/*
 * Измените строки ниже, чтобы изменить размер RSTACK, CSTACK и HEAP
 * сегментов. Они должны быть точно настроены в соответствии с вашим конкретным приложением.
 * Префикс ‘_..X_’ используется C-SPY как указание на то, что
 * метка не должна отображаться в окне разборки.
 */
-D_..X_CSTACK_SIZE=200  /* 512 байт для автоматических переменных и сохраненных регистров. */
-D_..X_RSTACK_SIZE=40   /* 64 байта для адресов возврата, что эквивалентно 32 */
                       /* уровни вызовов, включая прерывания. */
-D_..X_HEAP_SIZE=100    /* 256 байт кучи. */
-D_..X_NEAR_HEAP_SIZE=100    /* 256 байт кучи. */

/*
 * Измените эти строки, если к системе подключена внешняя SRAM.
 *
 * Примечание. Не забудьте включить внешние шины данных и адреса в
 *       __low_level_init, если используется внешняя память.
 */
-D_..X_EXT_SRAM_BASE=_..X_SRAM_BASE
-D_..X_EXT_SRAM_END=_..X_SRAM_END

/*
 * Измените эти строки, если к системе подключено внешнее СППЗУ.
 *
 * Примечание. Не забудьте включить внешние шины данных и адреса в
 *       __low_level_init, если используется внешняя память.
 */
-D_..X_EXT_EPROM_BASE=_..X_SRAM_BASE
-D_..X_EXT_EPROM_END=_..X_SRAM_END

/*
 * Измените эти строки, если к системе подключена внешняя EEPROM.
 *
 * Примечание. Не забудьте включить внешние шины данных и адреса в
 *       __low_level_init, если используется внешняя память.
 */
-D_..X_EXT_EEPROM_BASE=_..X_SRAM_BASE
-D_..X_EXT_EEPROM_END=_..X_SRAM_END


/*
 * Следующие сегменты расположены во внутренней памяти
 * ATmega128. Не изменяйте эти строки.
 */

/* Определить ЦП */
-ca90

/* Память кода */
-Z(CODE)INTVEC=0-(_..X_INTVEC_SIZE-1)

/* Заполнить неиспользуемые векторы прерываний RETI */
-h2895
-h(CODE)0-_..X_INTVEC_SIZE

-Z(CODE)TINY_F=_..X_INTVEC_SIZE-_..X_FLASH_TEND
-Z(CODE)NEAR_F,SWITCH,DIFUNCT=_.. X_INTVEC_SIZE-_..X_FLASH_NEND
-Z(CODE)CODE=_..X_INTVEC_SIZE-_..X_FLASH_END
-Z(FARCODE)FAR_F=_..X_INTVEC_SIZE-_..X_FLASH_END
-Z(CODE)HUGE_F,INITTAB=_..X_INTVEC_SIZE-_ ..X_FLASH_END
-Z(CODE)TINY_ID,NEAR_ID=_..X_INTVEC_SIZE-_..X_FLASH_END
-Z(CODE)CHECKSUM#_..X_FLASH_END

/* Внутренняя память данных */
-Z(DATA)TINY_I ,TINY_Z,TINY_N=_..X_SRAM_BASE-_..X_SRAM_TEND
-Z(DATA)NEAR_I,NEAR_Z=_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END

/*
 * Если доступна внешняя SRAM, там можно размещать стеки.
 * Однако внешняя память работает медленнее внутренней, поэтому перенос
 * стеков во внешнюю память снизит производительность системы.
 */
-Z(DATA)RSTACK+_..X_RSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END /* ,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END */
-Z(DATA)CSTACK+_.. X_CSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END /* ,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END */

/*
 * Если доступна внешняя SRAM, было бы неплохо переместить туда сегмент кучи
 * , то есть удалить диапазон _..X_SRAM_BASE-_..X_SRAM_END.
 */
-Z(DATA)HEAP+_..X_HEAP_SIZE=_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END
-Z(DATA)IOSTREAM_N#_..X_SRAM_BASE-_. .X_SRAM_END,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END
-Z(DATA)NEAR_HEAP+_..X_NEAR_HEAP_SIZE=_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END

/* Внутренняя память EEPROM память */
-Z(XDATA)EEPROM_I,EEPROM_N=0-_..X_EEPROM_END

/*
 * Следующие определения сегментов используются только в том случае, если внешняя память
 * подключена к контроллеру AVR.
*/

/*Внешний eprom*/
-z (const) neal_c = _ .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *