Перейти к содержанию
    

bug при намерении записи в массив

Коллеги, помогите победить 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 сразу после загрузки софта, без старта.

2019-10-02_152127_bag_ip.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а где размещается новый массив? может, заканчивается именно та область памяти, а не область памяти под программу? размер кучи/стека не пробовали увеличивать?

было что-то подобное с микроблейзом, увеличение размера кучи исправило ситуацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 минут назад, FakeDevice сказал:

а где размещается новый массив? может, заканчивается именно та область памяти, а не область памяти под программу? размер кучи/стека не пробовали увеличивать?

Вроде нет. Вот map:

 

2019-10-02_153655_map_ip.png

2019-10-02_154110_ьфз_шз2.png

 

А куча у меня дефолтная, где можно посмотреть её размер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, _sda said:

А куча у меня дефолтная, где можно посмотреть её размер?

В стартапе, наверное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, StewartLittle said:

В стартапе, наверное.

Я в основном хардом занимаюсь, а программист в отпуске. Не подскажете где посмотреть этот стартап? В проекте Эклипс нет файла с таким названием.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 часов назад, gosha-z сказал:

Обложите структуру pragma pack(push,1)/pop

Спасибо за совет. Наконец добрался до этого проекта, извиняюсь.

Нет, не помогло, структура портится как и раньше. В чём же может быть дело?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дополнительная информация по теме.

1). Уменьшение размера нового массива до одного элемента не устраняет проблему.

2). Если заремарить запись в новый массив и увеличивать размер ранее существующего другого массива в пределах свободной области памяти - проблема не возникает.

Как объединить эти два факта?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 - то проблемы не возникает.

Я в Си любитель, а что скажут профессионалы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, _sda сказал:

 


alt_u8 point_time;
......
		if (sec != reg_sec) {
			if (point_time < 100) {
				buf_time_pps[point_time++] = 0x00ffffff & data;
				}
			}

 

А где переменная point_time инициализируется?

И еще вопрос - эта переменная объявлено локально? А если ее глобальной сделать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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).

Ну так далее, пока не станет точно понятно, в какой переменной возникает проблема.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

35 минут назад, StewartLittle сказал:

А где переменная point_time инициализируется?

И еще вопрос - эта переменная объявлено локально? А если ее глобальной сделать?

Запись выполняется в цикле main, инициализация выполняется перед циклом. В дальнейшем чтобы перезапустить процесс записи я по внешнему интерфейсу просто обнуляю point_time.

Сейчас глобальная. Пробовал объявить локально - результат один и тот же.

34 минуты назад, nice_vladi сказал:

Вообще не профессионал, но:

Выбросил бы запись "& data" и попробовал заполнить буфер 0x00ffffff. После этого станет понятно, что ломается: итератор или данные.

Если все ОК и буфер заполняется ff - значит ломается переменная data;

Если буфер все равно заполняется мусором - значит ломается итератор (point_time).

Ну так далее, пока не станет точно понятно, в какой переменной возникает проблема.

Извиняюсь, но до записи буфера дело не доходит. Просто если в тексте есть строчка с этой записью - ломается структура с данными.

Если строчку заремарить - то ничего не ломается.

Я выше это описал. И ломается ещё до того как процессор выполнит запись в этот буфер.:wacko2:

Если написать 

buf_time_pps[point_time++] = 0;

тоже ломается...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так посмотрите под дебаггером этот участок кода - какие переменные содержат какие значения, куда указывает buf_time_pps и т.п. И пройдите по шагам, установите на каком шаге у Вас все ломается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, StewartLittle сказал:

Так посмотрите под дебаггером этот участок кода - какие переменные содержат какие значения, куда указывает buf_time_pps и т.п. И пройдите по шагам, установите на каком шаге у Вас все ломается.

Ребята, я же выше всё описал.

image.png.496e6916fb74279cc9ec55f983f90beb.png

Это я только подключился дебаггером. Программу не стартую.

image.png.d370d3f9fb4fa98b6fc4ad4ea5093cc4.png

Смотрю структуру - она уже битая, до старта программы.

Здесь как?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, _sda сказал:

Смотрю структуру - она уже битая, до старта программы.

То есть до старта main()? Тогда получается, что все портится во время работы стартапа.
 

23 часа назад, _sda сказал:

В памяти программ ещё 25Кб свободного места. И в варнингах ничего подозрительного нет. Подскажите,плз,как отремонтировать.

Хм.. А в памяти данных? Посмотрите настройки линкера в bsp editor'e.

Как у Вас в проекте организована память физически?

Например, если в проекте Qsys имеется один модуль ОnChip RAM и других памятей нет, то в этом модуле будут располагаться и сегмент кода, и сегменты данных, и стек, и куча. Тогда при компиляции должен сообщаться объем получившегося исполняемого кода, и сколько памяти остается под стек и кучу.

Что у Вас говорит компилятор по этому поводу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...