|
|
  |
перезапуск программы, непонятно почему. |
|
|
|
Jan 19 2007, 11:11
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(xemul @ Jan 19 2007, 04:20)  Цитата(prottoss @ Jan 18 2007, 22:04)  Цитата(xemul @ Jan 19 2007, 01:59)  Цитата(prottoss @ Jan 18 2007, 21:43)  Канешна, это все здорово очень, объясните тада, умные сотоварищи, зачем мне указывать размер стека данных, еслиФ все равно компилятор и иже с ними, создаст массив в этом самом стекеданных, то бишь нарушит мое НЕОСПОРИМОЕ правило???
Не понял про "мое НЕОСПОРИМОЕ правило". Вы же можете среднепотолочно прикинуть требуемый размер стека с учетом вложенности подпрограмм (и их потребностей для локальных переменных) и прерываний. А у компилятора по стеку правило одно: сказали "Отсель", значит так и будет. Угу, а тада зафига мне куча в Си??? Без плюсиков... Повторюсь за всех, уже говоривших об этом: куча используется для динамического выделения памяти, автоматические переменные обычно размещаются на стеке. Цитата Цитата(xemul @ Jan 19 2007, 01:59)  Вы же можете среднепотолочно прикинуть требуемый размер стека Гон всезнайки???????????????????????? Вам не доводилось этим заниматься и установки стека по умолчанию достаточно? Ну и слава богу и разработчикам используемых Вами компиляторов. Если помните, причина возникновения этого треда крылась в некорректной работе со стеком. Подобные треды возникают достаточно регулярно, и в них неоднократно обсуждались способы контроля переполнения и оценки требуемой глубины стека. Кста, Вы в них активно участвовали. Не отложилось? И, плз, если Вы чего-то не знаете, не выставляйте это напоказ несколько агрессивным образом. Извиняюсь, был не прав
--------------------
|
|
|
|
|
Jan 19 2007, 12:06
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(SasaVitebsk @ Jan 19 2007, 01:21)  Я не путаюсь в терминах. Я пишу "В библиотеках которые я выкладывал по поводу 18b20 применено динамическое выделение памяти. Да, после приведенного кода снимаю все возражения и обвинения  Извиняюсь, не смотрел ваши библиотеки, ограничился лишь анализом приведенного куска. Подумал, что раз уж вы выложили кусочек кода, то решили облегчить мне задачу поиска исходников этих библиотек и в представленном коде есть все, что необходимо для обсуждения. Цитата(SasaVitebsk @ Jan 19 2007, 01:21)  Это было выложено в библиотеках для всеобщего 18.10.2006, что явно раньше этой дискусии. Бывает, что некоторые темы я пропускаю Цитата(SasaVitebsk @ Jan 19 2007, 01:21)  А примером по локальному массиву, я возразил что он не всегда ложится на стэк. В моём случае компилятор при оптимизации разместил его в регистрах. Это да, с этим я не спорю. Я пытался спорить с чьим-то утверждением, что компилятор может разместить его в куче. Цитата(SasaVitebsk @ Jan 19 2007, 01:21)  Вы меня не поняли. Я имел в виду следующее. Представьте что я выполнил процедуру определения датчиков OW_cnt_device() и получил указатель на свободное место в куче. После этого компилятор без моего ведома разместил там ещё какое-то колличество переменных. Где там? В куче? Зарадибога. Заметьте, вы получили указатель не "на свободное место в куче", а на свободный участок указанного вами размера. В этот участок никто больше не залезет. Но и вы не имеете права лезть за границы этого участка. Цитата(SasaVitebsk @ Jan 19 2007, 01:21)  Не зная об этом я беру и выполняю операцию OW_free(). В результате происходит крах проги. Поэтому я и высказал сомнение о реальности. Никакого краха. В кучу возвращается выделенный вам участок, на который указывал OW_Rom_Device. Остальные участки если и были выделены кому-то без вашего ведома продолжают существовать. Цитата(SasaVitebsk @ Jan 19 2007, 01:21)  Я редко высказываюсь категорично. Приведу пример. В серьёзных (во всяком случае я об этом читал) системах/компиляторах (В винде этого нет) существуют так называемые "сборщики мусора". Тут я тоже не буду утверждать категорично - изучал вопрос довольно поверхностно и для аргументированной беседы мне нужно обратиться к литературе, а литература в данный момент не доступна (она на работе, я-дома). Если есть желание - можем продолжить в понедельник, можно в отдельной ветке.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 19 2007, 12:21
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(prottoss @ Jan 18 2007, 19:39)  А в чем разница между "динамически" и "автоматически"??? "динамически" == "в куче", "автоматически" == "в стеке/регистрах", "статически" == "в специально зарезервированном линкером участке памяти, не в стеке и не в куче". Цитата(prottoss @ Jan 18 2007, 19:39)  1. Если уж говорить по русски - я считаю что "динамически" - это на этапе исполнения кода, а Вы о чем глаголите??? Пытаемся обсуждать тематический вопрос с применением принятой в этой области терминологии. Чтобы избежать несуразностей, вызванных неправильной трактовкой "пимпочек", "загогулин" и "фИгни"
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 19 2007, 12:36
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(Сергей Борщ @ Jan 19 2007, 16:21)  Цитата(prottoss @ Jan 18 2007, 19:39)  А в чем разница между "динамически" и "автоматически"???
"динамически" == "в куче", "автоматически" == "в стеке/регистрах", "статически" == "в специально зарезервированном линкером участке памяти, не в стеке и не в куче". Цитата(prottoss @ Jan 18 2007, 19:39)  1. Если уж говорить по русски - я считаю что "динамически" - это на этапе исполнения кода, а Вы о чем глаголите??? Пытаемся обсуждать тематический вопрос с применением принятой в этой области терминологии. Чтобы избежать несуразностей, вызванных неправильной трактовкой "пимпочек", "загогулин" и "фИгни" Да, я стараюсь избегать создания массивов внутри функции... Тем паче, что, посмотрев код, на самом деле убедился в том, что ИАР выделил место под массив в стеке данных - он просто в начале функции взял, и увеличил значение регистра Y на размер моего объявленного массива! В принципе, в х86 компиляторах делается то же самое, но там размер памяти 4 Gb, здесь же иногда приходится крутится в 128 байтах да еще с практически всеми возможными задействованными прерываниями НО, зачем тогда в опциях ИАРа стоит heap size для Си (без плюсиков) ? Оператор new использовать нет возможности, зачем же тогда куча?
--------------------
|
|
|
|
|
Jan 19 2007, 13:55
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(prottoss @ Jan 19 2007, 12:29)  Цитата(Сергей Борщ @ Jan 19 2007, 16:57)  Цитата(prottoss @ Jan 19 2007, 11:36)  НО, зачем тогда в опциях ИАРа стоит heap size для Си (без плюсиков) ? Оператор new использовать нет возможности, зачем же тогда куча?
Чтобы размещать в ней различные данные, используя функции malloc, calloc, free и т.д. из stdlib.h. Динамическое распределение памяти Вы сами то эти функции применяете в проектах?  Я, например, применяю. Работает.
|
|
|
|
|
Jan 19 2007, 14:12
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(IgorKossak @ Jan 19 2007, 17:55)  Цитата(prottoss @ Jan 19 2007, 12:29)  Цитата(Сергей Борщ @ Jan 19 2007, 16:57)  Цитата(prottoss @ Jan 19 2007, 11:36)  НО, зачем тогда в опциях ИАРа стоит heap size для Си (без плюсиков) ? Оператор new использовать нет возможности, зачем же тогда куча?
Чтобы размещать в ней различные данные, используя функции malloc, calloc, free и т.д. из stdlib.h. Динамическое распределение памяти Вы сами то эти функции применяете в проектах? Я, например, применяю. Работает. Интересно, что делает контроллер, когда узнает, указатель равен NULL??? наверное начинает истерично мигать лампочками
--------------------
|
|
|
|
|
Jan 20 2007, 04:48
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Prottoss последний мой проект целиком построен на динамической памяти. Именно AVR правда m640 (8к озу) Фишка в том что программа в МК - это продолжение железа. И Вы и я это понимаем. NULL не может быть получен. Это говорит о том, что у Вас в проге что-то не верно. Если даже менеджер и не полный, значит вы сами должны контролировать. Я работаю с данными типа файл. Этот файл приходит с PC. Внутри данных идут упорядоченные структуры. Они нескольких типов и разной длины. Длина файла не известна. Как можно с этим работать? Только куча и указатели. Причём Вы не поверите. Я сам не поверил. Удобно до безобразия. Наглядно и красиво. Вырву кусочек. Код KomXx = (struct AddrKomXx*) AdrActiveKom[i]; // Прочитать адрес текущей активной команды if(KomXx->TimeStart>TekTime) continue; // Если не подошло время для исполнения команды, то пропустить данную команду switch (KomXx->Name) { ......... /* Команда "OUTG" - "Вывод статической графики" */ case 'G': KomG = (struct AddrKomG*) AdrActiveKom[i]; // Прочитать адрес текущей активной команды KomG->TimeMashtabTek++; // Следующий такт if(KomG->TimeMashtabTek >= KomG->TimeMashtab)// если подошёл, то KomG->TimeMashtabTek=0; // иначе начать заново OutPict(KomG->BegX,KomG->BegY,KomG->SizeX,KomG->SizeY,&KomG->Pict[0]); // Вывести картинку if(KomG->TimeMashtabTek == 0){ // если подошёл, то KomG->TimeLife--; // Уменьшить время жизни KomG->BegX += KomG->VecX; // Сместить объект KomG->BegY += KomG->VecY; // Сместить объект } break; /* Команда "ANIMATE" - "Вывод анимированной графики" */ case 'M': KomM = (struct AddrKomM*) AdrActiveKom[i]; // Прочитать адрес текущей активной команды .....
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|