|
|
  |
Динамические переменные и массивы, Можно ли задать динамические массивы ? |
|
|
|
Sep 13 2013, 12:40
|

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

|
Цитата(Tarbal @ Sep 13 2013, 16:29)  Попытка наезда кучей вызовет ошибку компиляции и никогда не будет пропущена. Как это? Приходят пакеты из одно порта и ретранслируются в другой (по разным протоколам). И всё это гипотетически реализовано через кучу. Вдруг выходной канал отваливается, а на входе поток не прерываем (так случилось). А вы продолжаете создавать на куче пакты, пока она не закончится. Вопрос: как вам применение кучи поможет на этапе компиляции? (отвечайте пожалуйста конкретно и не юлите) Цитата По поводу алгоритмов. Алгоритмы надо улучшать. В ембеддед программировании требования покруче чем при написании апликаций на PC Только не надо меня кормить этими дежурными фразами, что не надо, а что надо...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Sep 13 2013, 13:22
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(demiurg_spb @ Sep 13 2013, 16:40)  Как это? Приходят пакеты из одно порта и ретранслируются в другой (по разным протоколам). И всё это гипотетически реализовано через кучу. Вдруг выходной канал отваливается, а на входе поток не прерываем (так случилось). А вы продолжаете создавать на куче пакты, пока она не закончится. Вопрос: как вам применение кучи поможет на этапе компиляции? (отвечайте пожалуйста конкретно и не юлите)
Только не надо меня кормить этими дежурными фразами, что не надо, а что надо... Хороший пример При использовании кучи не возникнет никаких странных багов. Просто malloc() будет возвращать ноль вместо поинтера на область памяти. Если апликация написана грамотно, то будет выдано сообщение об ошибке, ну и работа устройства будет остановлена до устранения проблемы, после которого устройство продолжит свою работу. На этапе компилляции я буду знать, что случится именно так и требуемая память не будет взята у чужого сегмента. А вот стэк в этом случае побеспредельничает до полного затыкания системы, потому как перелопатит всю память. Необходимо будет вмешательство человека, что недопустимо для ембеддед устройств. Скажите, у вас создалось впечатление, что я уклоняюсь от ответов на какие-то ваши вопросы? Укажите мне на эти вопросы и вы увидите, что ваше впечатление ошибочно. Я прадоставлю вам исчерпывающий ответ.
|
|
|
|
|
Sep 13 2013, 14:08
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(DASM @ Sep 13 2013, 17:35)  На самом деле в эмбеддед всякие alloc штука хорошая, только вот стандартный менджер не шибко хорош, можно попасть на фрагментацию памяти, в пределе до идиотизма , когда свободна половина, а два байта не выделить . Тут лучше упрощенный менеджер с аллокациями пулов фиксированного (обычно кратного степени двойки) кусками. И чего это стеку вдруг беспредельничать ? Я в подобных случаях поступал следующим образом: создавал на оставшуюся свободной области памяти массив элементов. Размер элемента равен максимально возможному сообщению. Далее создавал функции для запроса элемента и возвращения элемента. Все элементы имели заголовок для соединения их в односвязные списки. Пул свободных элементов тоже был оформлен как список. Забавная история спучилась с Микрочипом. Компилятор молча укоротил мой массив до конца страницы адреса. В Микрочипе страничная адресация это бич. За что я люблю aтмелевские процессоры -- они свободны от этого нонсенса. Цитата(DASM @ Sep 13 2013, 18:01)  Причем тут рекурсия вообще ? Данные принимаются в буфер, не важно один ли он, или два с очередью, в куче ли, на стеке ли - главное что они предсказумы. Непредсказуемая может быть рекурсия, но никак не прием информации Приведите мне сценарий решения задачи, поставленной demiurg_spb в случае с затыком выходного потока. При условии, что буферы берутся на стеке. Цитата Приходят пакеты из одно порта и ретранслируются в другой (по разным протоколам). ...... Вдруг выходной канал отваливается, а на входе поток не прерываем (так случилось).
Сообщение отредактировал Tarbal - Sep 13 2013, 14:13
|
|
|
|
|
Sep 13 2013, 14:48
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(DASM @ Sep 13 2013, 18:28)  Да не буду я ничего приводить, берете какие-то левые ситуации. Если нет места в буфере - пусть идут все лесом, берем другой контроллер. Еще раз - я спросил причем тут рекрсия, а вы пишите про привести пример. Может тогда приведете пример, как рекурсия поможет сначала ? Во-первых пример не мой, а во-вторых я не знаю как рекурсия поможет. Знаю, что она убьёт содержимое памяти. Давайте подождем автора примера. Я надеюсь у него есть сценарий. Вопрос к вам. Я правильно вас понял? Для того, чтобы с созданием массивов в стэке не было проблем надо быть аккуратным с их использованием? Или для этого надо предпринять какие-то меры? Цитата(DASM @ Sep 13 2013, 18:28)  Еще раз - я спросил причем тут рекрсия, а вы пишите про привести пример. Может тогда приведете пример, как рекурсия поможет сначала ? Посреди улицы разговаривают два одессита. К ним подходит третий. Долго молча слушает, затем резко разворачивается и, уходя, говорит: – Ой! Та не морочьте мне голову…
|
|
|
|
|
Sep 13 2013, 14:58
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(DASM @ Sep 13 2013, 18:52)  "А без рекурсии не получится. Ведь по условию задачи" Только я противоречие в ваших же словах вижу ? Вы не знаете, как она поможет, но уверены, что без нее не получится ? Нет противоречия. Я никогда не утверждал, что рекурсия поможет, но задача от обсуждения которой вы отказываетесь, поставлена так, что подразумевается рекурсия. Поскольку задачу ставил не я, то и претензии не ко мне.
|
|
|
|
|
Sep 13 2013, 15:03
|

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

|
Цитата(Tarbal @ Sep 13 2013, 17:22)  Скажите, у вас создалось впечатление, что я уклоняюсь от ответов на какие-то ваши вопросы? Укажите мне на эти вопросы и вы увидите, что ваше впечатление ошибочно. Я предоставлю вам исчерпывающий ответ. Конечно создаётся, вы ведь так и не смогли сказать, что использование кучи, в приведённом мной примере, на этапе компиляции вам никак не поможет. А про рекурсию - это уже ваши домыслы. Я не предлагал ничего подобного никогда. Извините, но с вами очень трудно разговаривать. Я об одном спрашиваю а вы всё продолжаете быть на своей волне. Разрешите откланяться! Цитата(DASM @ Sep 13 2013, 18:52)  Только я противоречие в ваших же словах вижу ? Вы не знаете, как она поможет, но уверены, что без нее не получится ? +100500 Слишком много додумываний и предположений...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Sep 13 2013, 15:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(demiurg_spb @ Sep 13 2013, 19:03)  Конечно создаётся, вы ведь так и не смогли сказать, что использование кучи, в приведённом мной примере, на этапе компиляции вам никак не поможет. А про рекурсию - это уже ваши домыслы. Я не предлагал ничего подобного никогда. Извините, но с вами очень трудно разговаривать. Я об одном спрашиваю а вы всё продолжаете быть на своей волне. Разрешите откланяться!
+100500 Слишком много додумываний и предположений... О! Вы появились. Прокоментируйте, пожалуйста мой ответ #17 на ваш #16. Цитата(demiurg_spb @ Sep 13 2013, 19:03)  Разрешите откланяться! Сливаете? Цитата(demiurg_spb @ Sep 13 2013, 19:03)  А про рекурсию - это уже ваши домыслы. Я не предлагал ничего подобного никогда. Виноват, домыслил. Тогда к вам вопрос. Приходят пакеты из одно порта и ретранслируются в другой (по разным протоколам). И всё это гипотетически реализовано через stack. Пока передается сообщение, на вход приходит следующее. Как быть?
Сообщение отредактировал Tarbal - Sep 13 2013, 15:34
|
|
|
|
|
Sep 13 2013, 15:42
|
Гуру
     
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493

|
Вобщем malloc использовать стал в микроконтролерах когда у них стало 512 метров ддр внешней. И честно говоря все равно неспокойно. Фрагментация вещь непредсказуемая, но при таких объемах можно считать вероятность отказа незначительной.Это не значит, что нужно отказывать от дин. выделения в мелких, но не родным аллокатором. Говорить о куче в контексте когда все озу килобайт — смешно имхо. Да и не надо было, это же не вебсервер непредсказуемый, да и цена отказа моих программ высоковата, поэтому только стек + статические выделенные буфер ы. Да, никаких вызовов stdlib из прерываний. Цитата(Tarbal @ Sep 13 2013, 19:24)  О! Вы появились. Прокоментируйте, пожалуйста мой ответ #17 на ваш #16.
Сливаете?
Виноват, домыслил. Тогда к вам вопрос.
Приходят пакеты из одно порта и ретранслируются в другой (по разным протоколам). И всё это гипотетически реализовано через stack. Пока передается сообщение, на вход приходит следующее. Как быть? Мне кажется Вы слово рекурсия неверно понимаете. А описанную задачу решают с помощью двойной буферизации, пока один буфер принимает — он только принимает.Как заполнен — идет его обработка, а на прием подставляется второй.Совершенно общая практика, начиная от контроллера SPI на верилоге и заканчивая V4L video for Linux.
|
|
|
|
|
Sep 13 2013, 15:58
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(DASM @ Sep 13 2013, 19:42)  Вобщем malloc использовать стал в микроконтролерах когда у них стало 512 метров ддр внешней. И честно говоря все равно неспокойно. Фрагментация вещь непредсказуемая, но при таких объемах можно считать вероятность отказа незначительной.Это не значит, что нужно отказывать от дин. выделения в мелких, но не родным аллокатором. Говорить о куче в контексте когда все озу килобайт — смешно имхо. Да и не надо было, это же не вебсервер непредсказуемый, да и цена отказа моих программ высоковата, поэтому только стек + статические выделенные буфер ы. Да, никаких вызовов stdlib из прерываний.
Мне кажется Вы слово рекурсия неверно понимаете. А описанную задачу решают с помощью двойной буферизации, пока один буфер принимает — он только принимает.Как заполнен — идет его обработка, а на прием подставляется второй.Совершенно общая практика, начиная от контроллера SPI на верилоге и заканчивая V4L video for Linux. То есть для использования двух буферов на стеке надо иметь два треда, каждый из которых берет из стека буфер? Надо синхронизировать не только рессурс выхода, но и размер буфера, чтобы не убить стэком переменные. Не слишком ли сложно? Может проще malloc() или еще проще тот метод, который я описал. Или как-то иначе можно?
Сообщение отредактировал IgorKossak - Sep 13 2013, 16:07
Причина редактирования: читайте внимательно, я выделил
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|