_sda 0 2 октября, 2019 Опубликовано 2 октября, 2019 · Жалоба Коллеги, помогите победить bug. Работаю с ниос в Эклипсе. При добавлении нового массива стали портиться дефолтные значения глобальных переменных(IP и MAC адреса). Если законнектиться в отладочном режиме и сразу после коннекта посмотреть переменные при остановленной программе - они уже запорчены, причём всегда портятся одними и теми же значениями. struct Eth_Param { alt_u8 IP[4]; alt_u8 MAC[6]; alt_u8 DEST_IP[4]; alt_u8 DEST_MAC[6]; } Eth_Ctrl= {{10,0,0,9},{0x00,0x1D,0x2D,0x3d,0x4d,0x5d},{10,0,0,12},{0x00,0x01,0x02,0x03,0x04,0x05}}; alt_u32 buf_time[128]; .... if (point_time < 100) { buf_time[point_time++] = 0x00ffffff & data; } .... Причём если заремарить строчку с записью в буфер - ничего не портится! В памяти программ ещё 25Кб свободного места. И в варнингах ничего подозрительного нет. Подскажите,плз,как отремонтировать. Вот запорченный IP сразу после загрузки софта, без старта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FakeDevice 0 2 октября, 2019 Опубликовано 2 октября, 2019 · Жалоба а где размещается новый массив? может, заканчивается именно та область памяти, а не область памяти под программу? размер кучи/стека не пробовали увеличивать? было что-то подобное с микроблейзом, увеличение размера кучи исправило ситуацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 2 октября, 2019 Опубликовано 2 октября, 2019 · Жалоба 27 минут назад, FakeDevice сказал: а где размещается новый массив? может, заканчивается именно та область памяти, а не область памяти под программу? размер кучи/стека не пробовали увеличивать? Вроде нет. Вот map: А куча у меня дефолтная, где можно посмотреть её размер? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 45 2 октября, 2019 Опубликовано 2 октября, 2019 · Жалоба 14 hours ago, _sda said: А куча у меня дефолтная, где можно посмотреть её размер? В стартапе, наверное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 2 октября, 2019 Опубликовано 2 октября, 2019 · Жалоба 12 hours ago, StewartLittle said: В стартапе, наверное. Я в основном хардом занимаюсь, а программист в отпуске. Не подскажете где посмотреть этот стартап? В проекте Эклипс нет файла с таким названием. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 3 2 октября, 2019 Опубликовано 2 октября, 2019 · Жалоба Обложите структуру pragma pack(push,1)/pop Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 3 октября, 2019 Опубликовано 3 октября, 2019 · Жалоба 11 часов назад, gosha-z сказал: Обложите структуру pragma pack(push,1)/pop Спасибо за совет. Наконец добрался до этого проекта, извиняюсь. Нет, не помогло, структура портится как и раньше. В чём же может быть дело? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 3 октября, 2019 Опубликовано 3 октября, 2019 · Жалоба Дополнительная информация по теме. 1). Уменьшение размера нового массива до одного элемента не устраняет проблему. 2). Если заремарить запись в новый массив и увеличивать размер ранее существующего другого массива в пределах свободной области памяти - проблема не возникает. Как объединить эти два факта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 3 октября, 2019 Опубликовано 3 октября, 2019 · Жалоба 3). Проблема возникает если запись в буфер выглядит так: alt_u8 point_time; ...... if (sec != reg_sec) { if (point_time < 100) { buf_time_pps[point_time++] = 0x00ffffff & data; } } Если же запись сделать так: if (sec != reg_sec) { if (point_time < 100) { buf_time_pps[50] = 0x00ffffff & data; } } где вместо 50 можно указать любое число 0...99 - то проблемы не возникает. Я в Си любитель, а что скажут профессионалы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 45 3 октября, 2019 Опубликовано 3 октября, 2019 · Жалоба 5 минут назад, _sda сказал: alt_u8 point_time; ...... if (sec != reg_sec) { if (point_time < 100) { buf_time_pps[point_time++] = 0x00ffffff & data; } } А где переменная point_time инициализируется? И еще вопрос - эта переменная объявлено локально? А если ее глобальной сделать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 2 3 октября, 2019 Опубликовано 3 октября, 2019 · Жалоба 4 minutes ago, _sda said: 3). Проблема возникает если запись в буфер выглядит так: alt_u8 point_time; ...... if (sec != reg_sec) { if (point_time < 100) { buf_time_pps[point_time++] = 0x00ffffff & data; } } Если же запись сделать так: if (sec != reg_sec) { if (point_time < 100) { buf_time_pps[50] = 0x00ffffff & data; } } где вместо 50 можно указать любое число 0...99 - то проблемы не возникает. Я в Си любитель, а что скажут профессионалы? Вообще не профессионал, но: Выбросил бы запись "& data" и попробовал заполнить буфер 0x00ffffff. После этого станет понятно, что ломается: итератор или данные. Если все ОК и буфер заполняется ff - значит ломается переменная data; Если буфер все равно заполняется мусором - значит ломается итератор (point_time). Ну так далее, пока не станет точно понятно, в какой переменной возникает проблема. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 3 октября, 2019 Опубликовано 3 октября, 2019 · Жалоба 35 минут назад, StewartLittle сказал: А где переменная point_time инициализируется? И еще вопрос - эта переменная объявлено локально? А если ее глобальной сделать? Запись выполняется в цикле main, инициализация выполняется перед циклом. В дальнейшем чтобы перезапустить процесс записи я по внешнему интерфейсу просто обнуляю point_time. Сейчас глобальная. Пробовал объявить локально - результат один и тот же. 34 минуты назад, nice_vladi сказал: Вообще не профессионал, но: Выбросил бы запись "& data" и попробовал заполнить буфер 0x00ffffff. После этого станет понятно, что ломается: итератор или данные. Если все ОК и буфер заполняется ff - значит ломается переменная data; Если буфер все равно заполняется мусором - значит ломается итератор (point_time). Ну так далее, пока не станет точно понятно, в какой переменной возникает проблема. Извиняюсь, но до записи буфера дело не доходит. Просто если в тексте есть строчка с этой записью - ломается структура с данными. Если строчку заремарить - то ничего не ломается. Я выше это описал. И ломается ещё до того как процессор выполнит запись в этот буфер. Если написать buf_time_pps[point_time++] = 0; тоже ломается... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 45 3 октября, 2019 Опубликовано 3 октября, 2019 · Жалоба Так посмотрите под дебаггером этот участок кода - какие переменные содержат какие значения, куда указывает buf_time_pps и т.п. И пройдите по шагам, установите на каком шаге у Вас все ломается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 3 октября, 2019 Опубликовано 3 октября, 2019 · Жалоба 11 минут назад, StewartLittle сказал: Так посмотрите под дебаггером этот участок кода - какие переменные содержат какие значения, куда указывает buf_time_pps и т.п. И пройдите по шагам, установите на каком шаге у Вас все ломается. Ребята, я же выше всё описал. Это я только подключился дебаггером. Программу не стартую. Смотрю структуру - она уже битая, до старта программы. Здесь как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 45 3 октября, 2019 Опубликовано 3 октября, 2019 · Жалоба 6 минут назад, _sda сказал: Смотрю структуру - она уже битая, до старта программы. То есть до старта main()? Тогда получается, что все портится во время работы стартапа. 23 часа назад, _sda сказал: В памяти программ ещё 25Кб свободного места. И в варнингах ничего подозрительного нет. Подскажите,плз,как отремонтировать. Хм.. А в памяти данных? Посмотрите настройки линкера в bsp editor'e. Как у Вас в проекте организована память физически? Например, если в проекте Qsys имеется один модуль ОnChip RAM и других памятей нет, то в этом модуле будут располагаться и сегмент кода, и сегменты данных, и стек, и куча. Тогда при компиляции должен сообщаться объем получившегося исполняемого кода, и сколько памяти остается под стек и кучу. Что у Вас говорит компилятор по этому поводу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться