Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Добрый день, подскажите пожалуйста в каких случаях при программировании МК используется куча.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

когда ОЗУ немеряно, а думать лень.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Сейчас в МК ОЗУ относительно не мало. В МК за 1.8$ может быть 64 КБ ОЗУ и больше (зависит от модели). Или можно подключить внешнюю микросхему ОЗУ на несколько десятков мегабайт.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

[uquote="ARV",url="/forum/viewtopic.php?p=3392667#p3392667"]когда ОЗУ немеряно, а думать лень.[/uquote]

Ну как же, оси сделаны для лохов а ARV д'артаньян...
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

А по сути, то что в осях выделяется память из кучи вкурсе, не в курсе какие преимущества.
Реклама
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

ну букварь же. Вот прям по первой ссылке из гугла
Stack
very fast access
don't have to explicitly de-allocate variables
space is managed efficiently by CPU, memory will not become fragmented
local variables only
limit on stack size (OS-dependent)
variables cannot be resized

Heap
variables can be accessed globally
no limit on memory size
(relatively) slower access
no guaranteed efficient use of space, memory may become fragmented over time as blocks of memory are allocated, then freed
you must manage memory (you're in charge of allocating and freeing variables)
variables can be resized using realloc()
что-то перевести?
если говорим про контроллеры, то еще стоит помнить, что malloc штука достаточно дорогая.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

[uquote="baghear",url="/forum/viewtopic.php?p=3392483#p3392483"]Добрый день, подскажите пожалуйста в каких случаях при программировании МК используется куча.[/uquote]
Меня интересует в каких случаях???
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

когда:
а) неизвестно заранее, сколько памяти понадобится
б) но понадобится точно и сравнительно много
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

Меня интересует в каких случаях???
1) Если хочется сделать "смотри, как я умею".
2) Если возникло острое желание применить stl (тут на хабре Си++ 11 (хотя именно 11 я чего-то в коде не углядел) на stm32 запускали, так что, желание запустить stl тоже не будет противоестественным).
3) Хочется неопределённости работы программы в условиях ограниченных ресурсов (может, иногда хватит памяти и программа не упадёт?).

8) :)) Пожалуй, всё. :)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3393324#p3393324"]
Stack
[...]
variables cannot be resized
[/uquote]
Ох рассказать-бы им про alloca. :-) Ресайз из него, конечно небесспорный, но таки и далеко не всякий realloc вернёт тот-же участок памяти при нарастании аппетита.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3393612#p3393612"]далеко не всякий realloc вернёт тот-же участок памяти при нарастании аппетита.[/uquote]
он хотя бы освободит старый - или можно то же сделать руками, malloc-memcpy/memmove-free. С alloca я чеснговоря затруднюсь сказать, чего будет после free. В лучшем случае имхо предыдущий выделенный участок так и будет занимать стек.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

alloca
Только этой функции нет в стандарте. :) Лучше не использовать.
С alloca я чеснговоря затруднюсь сказать, чего будет после free.
Ну что будет... упадёт программа. :)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Есть структура в IAR FLASH (ARM) с конфигурацией(+калибровка) объемом в 300 байт, надо сделать считывание и перезапись её.
Это надо для того что после калибровки, решили добавить новую фичу, или нашелся мелкий баг. И так как после исправления прошивки, калибровочные значения слетят, надо их сохранить и потом восстановить.
Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
а то я боюсь что после исправления бага(без изменения структуры), компилятор может её выровнять чуть по другому, и восстановление произойдет не правильно, даже если CRC совпадет.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Как же вы с такой кашей в голове живёте? Вы не знаете как расположить структуру по фиксированному адресу в памяти? В чём вопрос то?

В IAR это делается так. В программе

Код: Выделить всё

  #pragma location = ".ethernet"
  uint8_t rx0_frames[ETH_RX_FRAME_SIZE*ETH_RX_FRAMES_NB] @ ".ethernet";
В .icf

Код: Выделить всё

define block ETHERNET with alignment = 0x100000, size = 0x100000 { section .ethernet};

place at address mem:0x27F00000 { block ETHERNET };
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
Что бы после повторной компиляции, порядок остался точно такой же и не каких, лишних( новых байтов), между полями не добавилось и не убралось.
(естественно что изменения над структурой не происходило)
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

А чего бы ему, порядку, поменяться, если изменений структуры не происходило? Для надёжности #pragma pack(1) сделайте и спите спокойно.
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

На #pragma pack(1) IAR ARM ругается что не оптимальная работа со структурой идет :(
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Вам шашечки или ехать?
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

И то и то :)
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

pokk, задачу опишите более внятно, а не отрывками мыслей. Ничего не понятно. Калибровки, фичи, баги, ...
Из Вашего поста понятно лишь одно - Вы боитесь, что компилятор, при очередном перекомпилированияя, испортит структуру. С какой стати ему это делать, если Вы не меняли эту структуру ?
Ответить

Вернуться в «Разные вопросы по МК»