реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> sprintf
defunct
сообщение Jun 16 2010, 03:12
Сообщение #31


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(rezident @ Jun 16 2010, 03:54) *
Наползание стека на данные это одна из самых трудновылавливаемых ошибок при программировании МК.

Дык возникает она потому что
Цитата
делают маленький стек

В отличие от Heap'а и его проблем фрагментации, для стека где фрагментация впринципе невозможна (по природе LIFO) - объем можно оценить еще до run-time.
Помножить это число на два, и будет щастье. Если посчитать заранее тяжело - заполнение стек памяти патерном, прогон программы с последующим дампом памяти для оценки использования стека в run-time тоже никто не отменял.

Много ли толку от менеджера, когда в heap нет блока требуемого объема и менеджер возвращает NULL? А "гениальный программист" привыкший, что на PC память есть всегда, даже не соизволит проверить что вернул этот malloc, и сразу начинает туда что-то писать?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 16 2010, 09:18
Сообщение #32


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(defunct @ Jun 16 2010, 07:12) *
А "гениальный программист" привыкший, что на PC память есть всегда, даже не соизволит проверить что вернул этот malloc, и сразу начинает туда что-то писать?
Да, да. Я читал где-то что по современным веяниям проверять на NULL malloc и иже с ним - моветон.
Причём и с аргументациеё всё вроде как чики-поки... Но всё это естественно в контексте ПО под ПК.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 16 2010, 19:54
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



defunct, было бы хорошо, если все было бы так просто. Только в топике речь шла вроде про embedded-программирование, где априори ОЗУ маловато, мало или совсем мало. laughing.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 16 2010, 23:19
Сообщение #34


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(rezident @ Jun 16 2010, 22:54) *
defunct, было бы хорошо, если все было бы так просто. Только в топике речь шла вроде про embedded-программирование, где априори ОЗУ маловато, мало или совсем мало. laughing.gif

Дык, куда уж проще, чем совсем без heap'а, когда ОЗУ априори маловато, мало или совсем мало ;>
Heap на мой взгляд, имеет хоть какой-то маломальский смысл когда в наличии есть хотя бы 32KB ОЗУ, и то только для объектов с большИм и очень большИм временем жизни.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 17 2010, 05:38
Сообщение #35


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(sergey sva @ Apr 19 2010, 00:27) *
Спасибо, теперь работает float и строки и целые числа, и места много не занимает smile.gif smile.gif
Может кому пригодится [attachment=43158:uselib.zip]

Интересно, и как же флоат выводится, если там вот что:
Код
case 'f':
    
    break;

Вчера коллега пыхтел весь день.
Пытался в mspgcc полномерный флоат вывести.
Попробовал ваш вариант, потом от Сергея Борща, потом ещё что-то...
Я ещё глянул было в avr-libc, но там своя специфика, макросы доступа к флеши на асме написаны.
Хотя конечно можно переопределить..
В конце концов установили из закромов IAR и начали потрошить его либы

Цитата(_Макс @ Jun 16 2010, 02:41) *
Float вообще в IAR не выводит, после обработки в массиве пусто

Там есть "переключатель скоростей", поищите галочку в настройках.
По умолчанию printf обрезанный.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
skripach
сообщение Jun 17 2010, 07:01
Сообщение #36


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



IAR float32 без проблем.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
fox1
сообщение Jul 7 2010, 12:00
Сообщение #37


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 3-05-06
Из: Нижний Новгород
Пользователь №: 16 725



Добрый день ! Кто нибудь использует sprintf с выводом float с MSPGCC ???
В IARе все работает ...
Но не в MSPGCC .......

потрошу либы IARа .....
Код огромный ....
Куча definов .....
И все равно на выходе нули .... хотя и в формате ......
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 7 2010, 14:24
Сообщение #38


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Включите в makefile поддержку расширенной printf.
Примерно так:
Код
# Floating point printf version (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
# If this is left blank, then it will use the Standard printf version.
PRINTF_LIB = $(PRINTF_LIB_FLOAT)
MATH_LIB = -lm



--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
fox1
сообщение Jul 8 2010, 04:49
Сообщение #39


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 3-05-06
Из: Нижний Новгород
Пользователь №: 16 725



Цитата(demiurg_spb @ Jul 7 2010, 18:24) *
Включите в makefile поддержку расширенной printf.
Примерно так:
Код
# Floating point printf version (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
# If this is left blank, then it will use the Standard printf version.
PRINTF_LIB = $(PRINTF_LIB_FLOAT)
MATH_LIB = -lm


Не поможет ....
В исходниках нет поддержки sprintf для float ....

http://mspgcc.bzr.sf.net/bzr/mspgcc/mspgcc...tf.c?remember=3

ch=='f' нет .....
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 8 2010, 08:47
Сообщение #40


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Понятно.
Тогда поищите по форуму.
Недавно тут кто-то искал/предлагал подходящие Вам исходники, было вроде как в ветке про ARM, точно не помню.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Wano
сообщение Jul 9 2010, 08:32
Сообщение #41


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737



Малость не в тему. Смотрю человек работает с текстовым LCD. МЭЛТ я не использовал, но пробовал 3 других типа от разных производителей. Стандартная либа в codevision-е рано или поздно повисала. Писал сам. Через пару годиков в Keil-е использовал их примерчик, аналогичная проблема. Неясно почему , но через некоторое время(минуты-часы) busy флага можно ждать пока свет закончится. Может шум, может ещё чего, спасает реинит. А когда sprintf идёт прям перед выводом на экран, всегда кажется, что косяк в sprintf - экран же работает (так было у меня на avr-е).

p.s. Сейчас ,наверно, посыпятся сообщения типа : да у меня годами работает и ничего и тд...
Go to the top of the page
 
+Quote Post
fox1
сообщение Jul 22 2010, 12:13
Сообщение #42


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 3-05-06
Из: Нижний Новгород
Пользователь №: 16 725



Ну вобщем ... взломался printf с float от IARа ... даже работает с mspgcc ... полный набор ... тяжеловат конечно ...
жаль получился не совместим со стандартным printf от mspgcc ...
Go to the top of the page
 
+Quote Post
koluna
сообщение Jan 2 2014, 07:53
Сообщение #43


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Столкнулся с определенными проблемами, используя маленький и слабенький процессор.
Немного поковырялся, обобщил результаты и решил вставить свои 5 копеек sm.gif

При сборке проекта (процессор STM32F100C4), содержащего вызов стандартной библиотечной функции sprintf() линковка не удается по двум причинам:
- Отсутствуют некоторые системные функции (ошибка ”undefined reference to `_sbrk'” или ей подобные).
- Код не помещается во FLASH.

Первая проблема обусловлена тем, что в тулчейнах для встраиваемых систем отсутствуют требуемые системные функции ( https://sourceware.org/newlib/libc.html#Syscalls ), которые необходимы для работы библиотеки newlib (эти функции обеспечиваются полноценной ОС). Их необходимо реализовать самостоятельно или взять готовый вариант ( http://electronix.ru/forum/index.php?showt...mp;#entry651990 ).

Вторая проблема обусловлена нехваткой FLASH памяти выбранного микроконтроллера, ”объемной” реализацией функции sprinft() и всего, что с ней связано. Поэтому оптимальное решение в сложившейся ситуации - поиск менее ”объемного” варианта этой функции.

Протестировал несколько вариантов функций sprintf() от различного производителя sm.gif
Тестирование проводилось с помощью простого приложения, написанного на языке C с использованием библиотеки SPL. Приложение осуществляет циклический вывод форматированной строки через USART микроконтроллера. Результаты тестирования приведены ниже (перечислены не все секции выходного файла). В итоге было установлено, что наиболее ”легкий” вариант реализации функции sprintf() от ChaN.

Функции sprintf() в стандартных библиотеках тулчейнов бывают в нескольких вариантах (или просто разные функции или разные библиотеки, часто с ограниченным функционалом). Часто функции, реализованные в стандартной библиотеке, требуют приличного количества ОЗУ, поэтому при их использовании необходимо обеспечить достаточный объем для стека (кучи).

ПО с использованием стандартной библиотечной функции sprintf().
Чтобы проект собрался пришлось увеличить в скрипте линкера размер региона FLASH до 32 кБ.
.text 27048
.ARM.exidx 8
.data 1436
.bss 80

ПО с использованием стандартной библиотечной функции sniprintf().
Это облегченный вариант sprintf(), работающий только с целыми числами.
.text 12092
.ARM.exidx 8
.text.align 4
.data 1436
.bss 80

ПО без использования форматированного вывода (без каких-либо функций sprintf()).
.text 1604
.text.align 4
.data 20
.bss 16

Реализация от ChaN (целые числа).
http://elm-chan.org/fsw/strf/xprintf.html
.text 2368
.data 20
.bss 28

Реализация от Georges Menie (целые числа).
http://www.menie.org/georges/embedded/index.html
.text 7656
.data 1308
.bss 80

Доработанный вариант от Сергея Борща (оригинал неизвестен)
http://electronix.ru/forum/index.php?showt...mp;#entry746084
.text 7952
.data 24
.bss 16

Вариант от sergey_sva
http://electronix.ru/forum/index.php?s=&am...st&p=746563
.text 13600
.ARM.exidx 8
.data 268
.bss 16

makefile и скрипт линкера использовался из комплекта scmRTOS. Тулчейн - Sourcery CodeBench Lite ARM EABI.

А, с Новым Годом всех! sm.gif

Сообщение отредактировал koluna - Jan 2 2014, 07:55


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 18:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01472 секунд с 7
ELECTRONIX ©2004-2016