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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Применение буферов больше 256 байт глючит sprintf, Камень stm32L476
aaarrr
сообщение Aug 22 2017, 21:41
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Димон Безпарольный @ Aug 23 2017, 00:36) *
Полагаю есть ограничение? Уж не 255 ли?

Локальный буфер выделяется на стеке, еще здоровый кусок от него может откусить sprintf.
Ограничение определяется размером стека и только.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Aug 22 2017, 21:43
Сообщение #17


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(aaarrr @ Aug 23 2017, 01:41) *
Локальный буфер выделяется на стеке, еще здоровый кусок от него может откусить sprintf.
Ограничение определяется размером стека и только.

Похоже. У меня в sprintf строка в 290байт. Как это ограничение обойти?

Сообщение отредактировал Димон Безпарольный - Aug 22 2017, 21:44
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 22 2017, 22:02
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Димон Безпарольный @ Aug 23 2017, 00:43) *
Похоже. У меня в sprintf строка в 290байт. Как это ограничение обойти?

1. Увеличить размер стека

И еще постараться:
2. Не держать локальные буферы по полкилобайта
3. Не формировать sprintf'ом строки по 290 байт

Это весьма расточительно, если всей памяти десятки килобайт.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Aug 22 2017, 22:11
Сообщение #19


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



1. Буду благодарен если намекнете как.

2,3 Что делать если надо сформировать строку:

Цитата
{ "d" : {"deviceid":"<deviceid>","param5":"<dw>","param6":"<fullw> ",”param7”:”<kk>”,”param8”:”<diff>”,”param9”:”<maxt>” ,”param11”:”<mint>”,”param12”:”<msisdn>”,”param13”:”<imei>”,”param14”:”<mac>”,”param15”:”<ccid>”,”param16”:”<rmod>”,”param17”:”<ssid>”,”param18”:”<lin>”,,”param19”:”<uptime>”}}


Бред конечно - но не я диктую моду...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 22 2017, 22:53
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Димон Безпарольный @ Aug 23 2017, 01:11) *
1. Буду благодарен если намекнете как.

Даже намекнуть не могу, так как это зависит от используемого инструментария,
структуры проекта и т.п., и по-хорошему должно быть известно только вам.

Посмотрите документацию на компилятор, там наверняка описан некий традиционный
способ установки размера стека. Сравните с тем, что имеете в своем проекте и
внесите коррективы.

Димон, складывается впечатление, что вы пытаетесь собрать что-то монструозное,
но при этом стараетесь обходить стороной фундаментальные основы. Не получится так sad.gif

Цитата(Димон Безпарольный @ Aug 23 2017, 01:11) *
2,3 Что делать если надо сформировать строку:

Разделить её на кучу мелких по числу param.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 22 2017, 23:00
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Димон Безпарольный @ Aug 23 2017, 01:11) *
2,3 Что делать если надо сформировать строку:

Надо начать с вопроса: "А зачем её формировать в этом буфере"? И можно ли без этого обойтись?
Я вот тоже сейчас например в текущем проекте распарсиваю и формирую "модные" JSON-сообщения в несколько кБ (а возможно вырастут до сотен кБ), обходясь буферами в десятки-сотни байт. Без каких-либо проблем.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Aug 23 2017, 05:29
Сообщение #22


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(jcxz @ Aug 23 2017, 03:00) *
Надо начать с вопроса: "А зачем её формировать в этом буфере"? И можно ли без этого обойтись?
Я вот тоже сейчас например в текущем проекте распарсиваю и формирую "модные" JSON-сообщения в несколько кБ (а возможно вырастут до сотен кБ), обходясь буферами в десятки-сотни байт. Без каких-либо проблем.

Парсить можно разбивая строку. Но это отправляемая строка. Она целиком должна быть запихнута в сериализатор и далее на отправку. Представить не могу как частями это сделать.

Заказчик очень хочет чтобы эта кишка не разбивалась.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 23 2017, 05:48
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Заполнять буфер тоже можно частями. Посмотрите, что возвращает функция sprintf.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Aug 23 2017, 06:04
Сообщение #24


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(aaarrr @ Aug 23 2017, 09:48) *
Заполнять буфер тоже можно частями. Посмотрите, что возвращает функция sprintf.

Согласен. Но буфер должен быть единым. Т.е. больше 256 байт. И локальным его не удается пока сделать. Сделал в лоб - объявил глобальным. Работает. Но не нравится нагрузка на память.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 23 2017, 06:31
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Димон Безпарольный @ Aug 23 2017, 09:04) *
...локальным его не удается пока сделать. Сделал в лоб - объявил глобальным. Работает. Но не нравится нагрузка на память.

Есть такая вещь, как динамическое выделение памяти. Но применять его пока не советую, нужно сначала со стеками разобраться.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 23 2017, 07:24
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Димон Безпарольный @ Aug 23 2017, 08:29) *
Парсить можно разбивая строку. Но это отправляемая строка. Она целиком должна быть запихнута в сериализатор и далее на отправку. Представить не могу как частями это сделать.

Вот точно так же можно и отправляемую строку по частям напечатать. Я именно так и делаю. Писал выше. У меня строки размером до десятка кБ (а будут много больше). И печатают они в Ethernet-кадры, размер которых 576 байт

Цитата(Димон Безпарольный @ Aug 23 2017, 09:04) *
Согласен. Но буфер должен быть единым. Т.е. больше 256 байт.

Нет. Если включить голову, то печатать можно окнами через тот же ..printf.
И кучу тоже не использую - печать сразу в Ethernet-кадры.
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 23 2017, 07:27
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Я правильно понял, что ТС не выяснил, сколько у него стека, и сколько его расходуется? И не планирует этим заниматься? Если так, помочь тут нечем, сушите вёсла.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Aug 23 2017, 07:39
Сообщение #28


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(scifi @ Aug 23 2017, 11:27) *
Я правильно понял, что ТС не выяснил, сколько у него стека, и сколько его расходуется? И не планирует этим заниматься? Если так, помочь тут нечем, сушите вёсла.

Ковырялся. Пока не получилось. Методику ищу, изучаю. Не факт что осилю.

й
Цитата(jcxz @ Aug 23 2017, 11:24) *
И кучу тоже не использую - печать сразу в Ethernet-кадры.

Она сериализатором по частям не обрабатывается. Т.е. можно и свой сериализатор написать. Но боюсь времени не хватит.
Go to the top of the page
 
+Quote Post
Михась
сообщение Aug 23 2017, 13:12
Сообщение #29


Частый гость
**

Группа: Участник
Сообщений: 161
Регистрация: 29-09-10
Пользователь №: 59 816



Есть полезная штука по крайней мере у Кейла:
При компиляции опасные функции обрамляются ватермарком и при его повреждении - вызывается специальная функция.

http://www.keil.com/support/man/docs/armcc...59124940593.htm
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Aug 23 2017, 15:04
Сообщение #30


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Если компилятор - IAR, то там есть встроенная функция контроля переполнения стека.


--------------------
ASB
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 Текстовая версия Сейчас: 21st July 2025 - 22:18
Рейтинг@Mail.ru


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