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

 
 
> перезапуск программы, непонятно почему.
simsim
сообщение Jan 16 2007, 21:13
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801



есть программа, состоит из 2-х подпрограмм А и Б, выполняемых бесконечно в while (1) {} и real-time clock по timer0.
1-я выводит массив led[32] в порт D, 2-я обновляет led[32]. Проблема - два раза цикл вывода и обновления led[32] проходит нормально, в начале 3-го происходит перезапуск контроллера, замечаю по обнулению времени и led. watchdog выключен, да и время до сброса не одно, зависит от времени выполнения циклов в А и Б, и 2 сек, и 15 сек и больше, а происходит в одной и той же точке выполнения А и Б. в чем может быть дело ? как уйти от этого сброса ?
p.s. попробую отследить в AVR Studio, поможет ? там вроде нет шагов назад.

Сообщение отредактировал simsim - Jan 16 2007, 21:17
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Jan 18 2007, 00:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(SasaVitebsk @ Jan 17 2007, 20:10) *
Для IAR даже если массив объявлен внутри ф-ции, то он всё равно будет создан "на этапе запуска стартап-кода". Даже если он и будет создан динамически (не программистом а компилятором), то он будет создан за счёт памяти выделенной под это на этапе линковки. А куча полностью предоставлена программисту. (Как в С++ не знаю). Я могу выделить память и освободить её. М/у моими действиями ничего происходить с кучей не должно. Ничего без моего участия.
Таким образом учитывая, что парень не слышал о таком слове smile.gif - куча не занята, и она явно к этому не имеет никакого отношения.


2 defunct поясни пожалуйста, что я сказал неправильно. Я не для спора, а для своего понимания. Смею предположить, что неверна лишь выдержка из поста Prottoss "на этапе запуска стартап-кода". Но я её просто как выдержку привёл, а имелл ввиду что сама прога полностью сгенерирована к моменту запуска. И место под переменные уже выделены. Это так не только в Си. С динамической памятью работать приходилось. Посмотри пожалуйста следующую за вырванной фразу. Я пишу, "Даже если он и будет создан динамически (не программистом а компилятором), то он будет создан за счёт памяти выделенной под это на этапе линковки." То есть я как раз и описываю этот вариант. В моём сообщении не это главное. Опишу чуть ниже.

2 Сергей Борщ по поводу первого раздела, именно это я и хотел сказать но у меня не получилось. smile.gif Но я говорю немного уклончиво потому, что полностью компилятор не знает никто кроме разработчиков, а в полной мере проверить не удаётся. А в документах, можно кое что упустить. Пример специально для Вас Сергей Борщ. smile.gif В библиотеках которые я выкладывал по поводу 18b20 применено динамическое распределение памяти. И там же использован массив локальный. приведу текст для понимания.
Код
//Чтение температуры
int8_t    read_scratchpad(uint8_t tip)
{
uint8_t    scratchpad[8];
uint8_t    crc    = 0;

OW_write_byte(READ_SCRATCHPAD);                // читаем scratchpad 0xBE
for    (uint8_t c1    = 0; c1    < 8; c1++)
{
    scratchpad[c1] = OW_read_byte();            // Принять данные с    1 Wire шины
    crc    =  OW_crc8(crc, scratchpad[c1]);        // Посчитать CRC8  для 1 Wire шины
}
crc=OW_crc8(crc, OW_read_byte());
OW_reset();
if (crc == 0)                                    // Проверить CRC8  для 1 Wire шины
{
   if(tip==DS18B20TIP)
     return ((scratchpad[1] << 4) | ((scratchpad[0]+8) >> 4));
   else    
     return ((scratchpad[1] & 0x80) |    ((scratchpad[0]+1) >> 1));
}
else return ( ERROR_CRC);                        // Message -80
}

Возможно Вы будете удивлены, но IAR данный массив размещает в регистрах. (Оптимизирует)


2 defunct. Главное, о чём я писал в своём сообщении, что если бы компилятор произвольно использовал бы кучу, то как с ней работать? А если я её освобождаю ниже занятого уровня? Я уверен, что она не занята. Потому, что мной она не занята. Он меня ещё может контролировать. Я его - нет. Поэтому я и высказал сомнение. Этого нет даже на PC.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 18 2007, 18:56
Сообщение #3


Гуру
******

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



Цитата(SasaVitebsk @ Jan 17 2007, 23:49) *
Но я говорю немного уклончиво потому, что полностью компилятор не знает никто кроме разработчиков, а в полной мере проверить не удаётся.
Для того и существуют стандарты, чтобы точно описывать "как оно должно быть","как оно не должно быть" и "а вот это хз". Последнее отдано на откуп разработчикам компиляторов. Не больше.
Цитата(SasaVitebsk @ Jan 17 2007, 23:49) *
Пример специально для Вас Сергей Борщ. smile.gif В библиотеках которые я выкладывал по поводу 18b20 применено динамическое распределение памяти. И там же использован массив локальный.
Здесь вы путаетесь в терминах. В языке С динамическим распределением памяти называется именно работа с кучей. Локальные переменные, под которые память выделяется на стеке, в терминах С называются автоматическими. Переменные, под которые память выделяется на этапе запуска программы, называются статическими. К статическим относятся глобальные переменные и локальные переменные, объявленные с квалификатором static. В вашем примере динамического распределения я не увидел.
Цитата(SasaVitebsk @ Jan 17 2007, 23:49) *
Возможно Вы будете удивлены, но IAR данный массив размещает в регистрах. (Оптимизирует)
Ненаказуемо smile.gif Но если вы попытаетесь взять адрес такой переменной и передать куда-либо указатель на нее, она сразу же из регистров окажется в памяти.

Цитата(SasaVitebsk @ Jan 17 2007, 23:49) *
2 defunct. Главное, о чём я писал в своём сообщении, что если бы компилятор произвольно использовал бы кучу, то как с ней работать? А если я её освобождаю ниже занятого уровня? Я уверен, что она не занята. Потому, что мной она не занята. Он меня ещё может контролировать. Я его - нет.
я не defunct, но попытаюсь ответить: вы не можете "освободить ниже занятого уровня". Вы говорите сколько вам памяти надо, malloc выделяет в куче участок такого размера и выдает вам указатель на него. Этот участок в вашем полном распоряжении и никто на него не покусится. Когда вы хотите освободить этот участок - вы передаете free указатель на участок. Размер освобождаемого участка менеджер памяти определит сам. Повторное освобождение какого-либо участка - это ошибка в программе. Но ничего не мешает другой части программы (другой функции, задаче, другому потоку) получить из этой же кучи другой участок.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 19 2007, 02:21
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Сергей Борщ @ Jan 18 2007, 19:56) *
Цитата(SasaVitebsk @ Jan 17 2007, 23:49) *

Но я говорю немного уклончиво потому, что полностью компилятор не знает никто кроме разработчиков, а в полной мере проверить не удаётся.
Для того и существуют стандарты, чтобы точно описывать "как оно должно быть","как оно не должно быть" и "а вот это хз". Последнее отдано на откуп разработчикам компиляторов. Не больше.
Цитата(SasaVitebsk @ Jan 17 2007, 23:49) *
Пример специально для Вас Сергей Борщ. smile.gif В библиотеках которые я выкладывал по поводу 18b20 применено динамическое распределение памяти. И там же использован массив локальный.
Здесь вы путаетесь в терминах. В языке С динамическим распределением памяти называется именно работа с кучей. Локальные переменные, под которые память выделяется на стеке, в терминах С называются автоматическими. Переменные, под которые память выделяется на этапе запуска программы, называются статическими. К статическим относятся глобальные переменные и локальные переменные, объявленные с квалификатором static. В вашем примере динамического распределения я не увидел.
Цитата(SasaVitebsk @ Jan 17 2007, 23:49) *
Возможно Вы будете удивлены, но IAR данный массив размещает в регистрах. (Оптимизирует)
Ненаказуемо smile.gif Но если вы попытаетесь взять адрес такой переменной и передать куда-либо указатель на нее, она сразу же из регистров окажется в памяти.

Цитата(SasaVitebsk @ Jan 17 2007, 23:49) *
2 defunct. Главное, о чём я писал в своём сообщении, что если бы компилятор произвольно использовал бы кучу, то как с ней работать? А если я её освобождаю ниже занятого уровня? Я уверен, что она не занята. Потому, что мной она не занята. Он меня ещё может контролировать. Я его - нет.
я не defunct, но попытаюсь ответить: вы не можете "освободить ниже занятого уровня". Вы говорите сколько вам памяти надо, malloc выделяет в куче участок такого размера и выдает вам указатель на него. Этот участок в вашем полном распоряжении и никто на него не покусится. Когда вы хотите освободить этот участок - вы передаете free указатель на участок. Размер освобождаемого участка менеджер памяти определит сам. Повторное освобождение какого-либо участка - это ошибка в программе. Но ничего не мешает другой части программы (другой функции, задаче, другому потоку) получить из этой же кучи другой участок.


Я не путаюсь в терминах. Я пишу "В библиотеках которые я выкладывал по поводу 18b20 применено динамическое выделение памяти. И там же использован массив локальный." и это так и есть! Просто п/п пример, которой я привёл не использует динамического выделения, а использует локальный массив. Динамическое выделение исп. в другом месте этой же библиотеки.

Код
uint8_t OW_cnt_device(void)
{
uint8_t    Cnt_Device;                                // Число устройств на шине

Cnt_Device=0;
if(!OW_reset())                                // Начинается когда импульс присутствия обнаружен
{
   lastDiscrep = 0;                                // восстановите последнее несоответствие rom поиска глобальное
   OW_Rom_Device=CurrentAddr=malloc(8);            // Зарезервировать память под ROM
   while (Next())                                // Продолжить пока все дополнительные устройства не будут обнаружены
   {
     Cnt_Device++;
   }
}  return(Cnt_Device);
}


void OW_free(void)                                // Освободить память занятую под датчики
{
  free(OW_Rom_Device);                            // Освободить память
}


Я определяю колличество 1-wire устройств на шине (Cnt_Device) и их адреса в объёме Cnt_Device*7+1 сохраняю в куче.

Это было выложено в библиотеках для всеобщего 18.10.2006, что явно раньше этой дискусии.

А примером по локальному массиву, я возразил что он не всегда ложится на стэк. В моём случае компилятор при оптимизации разместил его в регистрах.

По поводу высказывания.
Цитата
я не defunct, но попытаюсь ответить: вы не можете "освободить ниже занятого уровня". Вы говорите сколько вам памяти надо, malloc выделяет в куче участок такого размера и выдает вам указатель на него. Этот участок в вашем полном распоряжении и никто на него не покусится. Когда вы хотите освободить этот участок - вы передаете free указатель на участок. Размер освобождаемого участка менеджер памяти определит сам. Повторное освобождение какого-либо участка - это ошибка в программе. Но ничего не мешает другой части программы (другой функции, задаче, другому потоку) получить из этой же кучи другой участок.


Вы меня не поняли. Я имел в виду следующее. Представьте что я выполнил процедуру определения датчиков OW_cnt_device() и получил указатель на свободное место в куче. После этого компилятор без моего ведома разместил там ещё какое-то колличество переменных. Не зная об этом я беру и выполняю операцию OW_free(). В результате происходит крах проги. Поэтому я и высказал сомнение о реальности.

Я редко высказываюсь категорично. Приведу пример. В серьёзных (во всяком случае я об этом читал) системах/компиляторах (В винде этого нет) существуют так называемые "сборщики мусора". Которые убирают дыры образующиеся в куче при выполнении операций new/free. Таким образом менеджер памяти там очень мощный. Он может перераспределять данные, в том числе от разных пользователей/потоков. Здесь менеджер - один указатель и пара сравнений. Написано пользователь сам должен. Оно и понятно "обеднённая" система.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- simsim   перезапуск программы   Jan 16 2007, 21:13
- - bodja74   SREG и регистры сохраняются в прерывании ?   Jan 16 2007, 21:33
|- - simsim   Цитата(bodja74 @ Jan 16 2007, 21:33) SREG...   Jan 16 2007, 21:43
- - SasaVitebsk   Цитата(simsim @ Jan 16 2007, 22:13) p.s. ...   Jan 16 2007, 23:13
- - GDI   Индексы массивов не выходят ли за границы оных, ст...   Jan 17 2007, 12:42
|- - simsim   Цитата(GDI @ Jan 17 2007, 12:42) Индексы ...   Jan 17 2007, 17:46
|- - prottoss   Цитата(simsim @ Jan 17 2007, 21:46) Цитат...   Jan 17 2007, 18:02
||- - SasaVitebsk   Цитата(prottoss @ Jan 17 2007, 19:02) Доп...   Jan 17 2007, 19:10
||- - prottoss   Цитата(SasaVitebsk @ Jan 17 2007, 23:10) ...   Jan 17 2007, 19:25
||- - simsim   Для IAR даже если массив объявлен внутри ф-ции, то...   Jan 17 2007, 19:35
||- - defunct   Цитата(prottoss @ Jan 17 2007, 19:25) Цит...   Jan 17 2007, 20:27
|- - simsim   Цитата(simsim @ Jan 17 2007, 17:46) Цитат...   Jan 17 2007, 19:00
|- - SasaVitebsk   Цитата(simsim @ Jan 17 2007, 20:00) Цитат...   Jan 17 2007, 19:36
||- - Сергей Борщ   Чтобы все не спорили. Массивы, объявленные внутри ...   Jan 17 2007, 20:14
||- - AndryG   Не вчитывался в посты народа ... звыняйте .. в АСМ...   Jan 17 2007, 20:21
||- - Qwertty   Цитата(AndryG @ Jan 17 2007, 20:21) Не вч...   Jan 17 2007, 20:37
||- - simsim   Заменил ассемблерную функцию на СИ-шную unsigned ...   Jan 17 2007, 21:06
||- - simsim   Цитата(simsim @ Jan 17 2007, 21:06) Замен...   Jan 17 2007, 21:35
||- - Dan_Dima   Всем привет. Я можнт что-то не понимаю скажите а р...   Jan 18 2007, 03:43
||- - dimka76   Цитата(Dan_Dima @ Jan 18 2007, 03:43) Все...   Jan 18 2007, 08:27
|||- - Dan_Dima   Цитата(dimka76 @ Jan 18 2007, 08:27) Цита...   Jan 18 2007, 12:28
|||- - Dog Pawlowa   Цитата(Dan_Dima @ Jan 18 2007, 13:28) Нас...   Jan 18 2007, 13:00
||||- - Dan_Dima   Цитата(Dog Pawlowa @ Jan 18 2007, 13:00) ...   Jan 18 2007, 14:35
||||- - Dog Pawlowa   Цитата(Dan_Dima @ Jan 18 2007, 15:35) Пре...   Jan 18 2007, 18:08
|||- - satellite-plus   Насколько я помню подобные преобразования компилят...   Jan 18 2007, 13:25
||- - satellite-plus   Цитата(Dan_Dima @ Jan 18 2007, 02:43) Все...   Jan 18 2007, 09:19
|- - prottoss   Цитата(simsim @ Jan 17 2007, 23:00) В под...   Jan 17 2007, 19:38
- - _Bill   Цитата(simsim @ Jan 16 2007, 21:13) есть ...   Jan 17 2007, 13:04
- - prottoss   Цитата(simsim @ Jan 17 2007, 01:13) есть ...   Jan 17 2007, 13:41
- - vesago   Согласен с GDI 9:10 - криво проинициализировали ин...   Jan 17 2007, 17:05
- - GDI   Цитатаиндексы в порядке, потому что два раза прохо...   Jan 17 2007, 19:32
|- - defunct   Цитата(Сергей Борщ @ Jan 18 2007, 18:56) ...   Jan 19 2007, 01:32
|- - Сергей Борщ   Цитата(SasaVitebsk @ Jan 19 2007, 01:21) ...   Jan 19 2007, 12:06
- - prottoss   defunct был прав - массив, объявленный в функции, ...   Jan 18 2007, 19:40
|- - zltigo   Цитата(prottoss @ Jan 18 2007, 18:40) Еди...   Jan 18 2007, 20:15
|- - prottoss   Цитата(zltigo @ Jan 19 2007, 00:15) Цитат...   Jan 18 2007, 20:39
|- - xemul   Цитата(prottoss @ Jan 18 2007, 20:39) Цит...   Jan 18 2007, 21:44
||- - prottoss   Цитата(xemul @ Jan 19 2007, 01:44) Автома...   Jan 18 2007, 21:52
|- - Сергей Борщ   Цитата(prottoss @ Jan 18 2007, 19:39) А в...   Jan 19 2007, 12:21
||- - prottoss   Цитата(Сергей Борщ @ Jan 19 2007, 16:21) ...   Jan 19 2007, 12:36
||- - Сергей Борщ   Цитата(prottoss @ Jan 19 2007, 11:36) НО,...   Jan 19 2007, 12:57
||- - prottoss   Цитата(Сергей Борщ @ Jan 19 2007, 16:57) ...   Jan 19 2007, 13:29
||- - IgorKossak   Цитата(prottoss @ Jan 19 2007, 12:29) Цит...   Jan 19 2007, 13:55
|||- - prottoss   Цитата(IgorKossak @ Jan 19 2007, 17:55) Ц...   Jan 19 2007, 14:12
|||- - IgorKossak   Цитата(prottoss @ Jan 19 2007, 13:12) Инт...   Jan 19 2007, 15:47
||- - Сергей Борщ   Цитата(prottoss @ Jan 19 2007, 12:29) Вы ...   Jan 19 2007, 13:57
||- - zltigo   Цитата(prottoss @ Jan 19 2007, 12:29) Вы ...   Jan 19 2007, 15:55
|- - zltigo   Цитата(prottoss @ Jan 18 2007, 19:39) а В...   Jan 19 2007, 15:42
|- - prottoss   Цитата(zltigo @ Jan 19 2007, 19:42) Цитат...   Jan 19 2007, 15:55
- - xemul   Цитата(Dan_Dima @ Jan 18 2007, 14:35) Цит...   Jan 18 2007, 21:15
- - prottoss   Канешна, это все здорово очень, объясните тада, ум...   Jan 18 2007, 21:43
|- - xemul   Цитата(prottoss @ Jan 18 2007, 21:43) Кан...   Jan 18 2007, 21:59
|- - prottoss   Цитата(xemul @ Jan 19 2007, 01:59) Цитата...   Jan 18 2007, 22:04
|- - xemul   Цитата(prottoss @ Jan 18 2007, 22:04) Цит...   Jan 19 2007, 00:20
|- - prottoss   Цитата(xemul @ Jan 19 2007, 04:20) Цитата...   Jan 19 2007, 11:11
- - makc   Предложение ко всем участникам форума - квотить ме...   Jan 19 2007, 11:58
- - SasaVitebsk   Prottoss последний мой проект целиком построен на ...   Jan 20 2007, 04:48
- - SasaVitebsk   Цитата(Сергей Борщ @ Jan 19 2007, 13:06) ...   Jan 20 2007, 05:12


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:18
Рейтинг@Mail.ru


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