|
перезапуск программы, непонятно почему. |
|
|
|
Jan 16 2007, 21:13
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Jan 18 2007, 00:49
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(SasaVitebsk @ Jan 17 2007, 20:10)  Для IAR даже если массив объявлен внутри ф-ции, то он всё равно будет создан "на этапе запуска стартап-кода". Даже если он и будет создан динамически (не программистом а компилятором), то он будет создан за счёт памяти выделенной под это на этапе линковки. А куча полностью предоставлена программисту. (Как в С++ не знаю). Я могу выделить память и освободить её. М/у моими действиями ничего происходить с кучей не должно. Ничего без моего участия. Таким образом учитывая, что парень не слышал о таком слове  - куча не занята, и она явно к этому не имеет никакого отношения. 2 defunct поясни пожалуйста, что я сказал неправильно. Я не для спора, а для своего понимания. Смею предположить, что неверна лишь выдержка из поста Prottoss "на этапе запуска стартап-кода". Но я её просто как выдержку привёл, а имелл ввиду что сама прога полностью сгенерирована к моменту запуска. И место под переменные уже выделены. Это так не только в Си. С динамической памятью работать приходилось. Посмотри пожалуйста следующую за вырванной фразу. Я пишу, "Даже если он и будет создан динамически (не программистом а компилятором), то он будет создан за счёт памяти выделенной под это на этапе линковки." То есть я как раз и описываю этот вариант. В моём сообщении не это главное. Опишу чуть ниже. 2 Сергей Борщ по поводу первого раздела, именно это я и хотел сказать но у меня не получилось.  Но я говорю немного уклончиво потому, что полностью компилятор не знает никто кроме разработчиков, а в полной мере проверить не удаётся. А в документах, можно кое что упустить. Пример специально для Вас Сергей Борщ.  В библиотеках которые я выкладывал по поводу 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.
|
|
|
|
|
Jan 18 2007, 18:56
|

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

|
Цитата(SasaVitebsk @ Jan 17 2007, 23:49)  Но я говорю немного уклончиво потому, что полностью компилятор не знает никто кроме разработчиков, а в полной мере проверить не удаётся. Для того и существуют стандарты, чтобы точно описывать "как оно должно быть","как оно не должно быть" и "а вот это хз". Последнее отдано на откуп разработчикам компиляторов. Не больше. Цитата(SasaVitebsk @ Jan 17 2007, 23:49)  Пример специально для Вас Сергей Борщ.  В библиотеках которые я выкладывал по поводу 18b20 применено динамическое распределение памяти. И там же использован массив локальный. Здесь вы путаетесь в терминах. В языке С динамическим распределением памяти называется именно работа с кучей. Локальные переменные, под которые память выделяется на стеке, в терминах С называются автоматическими. Переменные, под которые память выделяется на этапе запуска программы, называются статическими. К статическим относятся глобальные переменные и локальные переменные, объявленные с квалификатором static. В вашем примере динамического распределения я не увидел. Цитата(SasaVitebsk @ Jan 17 2007, 23:49)  Возможно Вы будете удивлены, но IAR данный массив размещает в регистрах. (Оптимизирует) Ненаказуемо  Но если вы попытаетесь взять адрес такой переменной и передать куда-либо указатель на нее, она сразу же из регистров окажется в памяти. Цитата(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)
|
|
|
|
|
Jan 19 2007, 02:21
|
Гуру
     
Группа: Свой
Сообщений: 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)  Пример специально для Вас Сергей Борщ.  В библиотеках которые я выкладывал по поводу 18b20 применено динамическое распределение памяти. И там же использован массив локальный. Здесь вы путаетесь в терминах. В языке С динамическим распределением памяти называется именно работа с кучей. Локальные переменные, под которые память выделяется на стеке, в терминах С называются автоматическими. Переменные, под которые память выделяется на этапе запуска программы, называются статическими. К статическим относятся глобальные переменные и локальные переменные, объявленные с квалификатором static. В вашем примере динамического распределения я не увидел. Цитата(SasaVitebsk @ Jan 17 2007, 23:49)  Возможно Вы будете удивлены, но IAR данный массив размещает в регистрах. (Оптимизирует) Ненаказуемо  Но если вы попытаетесь взять адрес такой переменной и передать куда-либо указатель на нее, она сразу же из регистров окажется в памяти. Цитата(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. Таким образом менеджер памяти там очень мощный. Он может перераспределять данные, в том числе от разных пользователей/потоков. Здесь менеджер - один указатель и пара сравнений. Написано пользователь сам должен. Оно и понятно "обеднённая" система.
|
|
|
|
Сообщений в этой теме
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|