Вопросы по С/С++ (СИ)
- Сообщения: 791
- Зарегистрирован: Вт июн 17, 2014 00:34:26
Добрый день, подскажите пожалуйста в каких случаях при программировании МК используется куча.
- Реклама
когда ОЗУ немеряно, а думать лень.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Сейчас в МК ОЗУ относительно не мало. В МК за 1.8$ может быть 64 КБ ОЗУ и больше (зависит от модели). Или можно подключить внешнюю микросхему ОЗУ на несколько десятков мегабайт.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
[uquote="ARV",url="/forum/viewtopic.php?p=3392667#p3392667"]когда ОЗУ немеряно, а думать лень.[/uquote]
Ну как же, оси сделаны для лохов а ARV д'артаньян...
Ну как же, оси сделаны для лохов а ARV д'артаньян...
- Сообщения: 791
- Зарегистрирован: Вт июн 17, 2014 00:34:26
А по сути, то что в осях выделяется память из кучи вкурсе, не в курсе какие преимущества.
- Реклама
ну букварь же. Вот прям по первой ссылке из гугла
если говорим про контроллеры, то еще стоит помнить, что malloc штука достаточно дорогая.
что-то перевести?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
[uquote="baghear",url="/forum/viewtopic.php?p=3392483#p3392483"]Добрый день, подскажите пожалуйста в каких случаях при программировании МК используется куча.[/uquote]
Меня интересует в каких случаях???
Меня интересует в каких случаях???
когда:
а) неизвестно заранее, сколько памяти понадобится
б) но понадобится точно и сравнительно много
а) неизвестно заранее, сколько памяти понадобится
б) но понадобится точно и сравнительно много
1) Если хочется сделать "смотри, как я умею".Меня интересует в каких случаях???
2) Если возникло острое желание применить stl (тут на хабре Си++ 11 (хотя именно 11 я чего-то в коде не углядел) на stm32 запускали, так что, желание запустить stl тоже не будет противоестественным).
3) Хочется неопределённости работы программы в условиях ограниченных ресурсов (может, иногда хватит памяти и программа не упадёт?).
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Мои программки: 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
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3393324#p3393324"]
Ох рассказать-бы им про alloca.
Ресайз из него, конечно небесспорный, но таки и далеко не всякий realloc вернёт тот-же участок памяти при нарастании аппетита.
[/uquote]Stack
[...]
variables cannot be resized
Ох рассказать-бы им про alloca.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3393612#p3393612"]далеко не всякий realloc вернёт тот-же участок памяти при нарастании аппетита.[/uquote]
он хотя бы освободит старый - или можно то же сделать руками, malloc-memcpy/memmove-free. С alloca я чеснговоря затруднюсь сказать, чего будет после free. В лучшем случае имхо предыдущий выделенный участок так и будет занимать стек.
он хотя бы освободит старый - или можно то же сделать руками, malloc-memcpy/memmove-free. С alloca я чеснговоря затруднюсь сказать, чего будет после free. В лучшем случае имхо предыдущий выделенный участок так и будет занимать стек.
Только этой функции нет в стандарте.alloca
Ну что будет... упадёт программа.С alloca я чеснговоря затруднюсь сказать, чего будет после free.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Мои программки: 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
Есть структура в IAR FLASH (ARM) с конфигурацией(+калибровка) объемом в 300 байт, надо сделать считывание и перезапись её.
Это надо для того что после калибровки, решили добавить новую фичу, или нашелся мелкий баг. И так как после исправления прошивки, калибровочные значения слетят, надо их сохранить и потом восстановить.
Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
а то я боюсь что после исправления бага(без изменения структуры), компилятор может её выровнять чуть по другому, и восстановление произойдет не правильно, даже если CRC совпадет.
Это надо для того что после калибровки, решили добавить новую фичу, или нашелся мелкий баг. И так как после исправления прошивки, калибровочные значения слетят, надо их сохранить и потом восстановить.
Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
а то я боюсь что после исправления бага(без изменения структуры), компилятор может её выровнять чуть по другому, и восстановление произойдет не правильно, даже если CRC совпадет.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Как же вы с такой кашей в голове живёте? Вы не знаете как расположить структуру по фиксированному адресу в памяти? В чём вопрос то?
В IAR это делается так. В программе
В .icf
В IAR это делается так. В программе
Код: Выделить всё
#pragma location = ".ethernet"
uint8_t rx0_frames[ETH_RX_FRAME_SIZE*ETH_RX_FRAMES_NB] @ ".ethernet";
Код: Выделить всё
define block ETHERNET with alignment = 0x100000, size = 0x100000 { section .ethernet};
place at address mem:0x27F00000 { block ETHERNET };
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
Что бы после повторной компиляции, порядок остался точно такой же и не каких, лишних( новых байтов), между полями не добавилось и не убралось.Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
(естественно что изменения над структурой не происходило)
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
А чего бы ему, порядку, поменяться, если изменений структуры не происходило? Для надёжности #pragma pack(1) сделайте и спите спокойно.
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
На #pragma pack(1) IAR ARM ругается что не оптимальная работа со структурой идет 
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
pokk, задачу опишите более внятно, а не отрывками мыслей. Ничего не понятно. Калибровки, фичи, баги, ...
Из Вашего поста понятно лишь одно - Вы боитесь, что компилятор, при очередном перекомпилированияя, испортит структуру. С какой стати ему это делать, если Вы не меняли эту структуру ?
Из Вашего поста понятно лишь одно - Вы боитесь, что компилятор, при очередном перекомпилированияя, испортит структуру. С какой стати ему это делать, если Вы не меняли эту структуру ?


