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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Непонятный глюк
wmakc
сообщение Jun 17 2011, 13:22
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 111
Регистрация: 2-03-10
Пользователь №: 55 768



Контроллер at91sam9g20, компилятор keil 4.03, загрузчик атмеловский.

Компилирую, зашиваю, все работает.
Меняю значение одной переменной, опять компилирую, зашиваю. Перестает отвечать Usart.
При этом меняется размер бинарного файла, хотя переменная char и за диапазон не выходит.

С чем это может быть связано, с компилятором, с памятью, с загрузчиком?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 17 2011, 14:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Это может быть связано с чем угодно. Слишком мало информации. Отлаживать надо.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 17 2011, 14:28
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (wmakc @ Jun 17 2011, 16:22) *
С чем это может быть связано, с компилятором, с памятью, с загрузчиком?

Могу с удручающе высокой вероятностью утверждать, что "с компилятором, с памятью, с загрузчиком" это НЕ связано. Связано только с тем, что Вы написали.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 17 2011, 14:39
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(wmakc @ Jun 17 2011, 17:22) *
Меняю значение одной переменной, опять компилирую, зашиваю. Перестает отвечать Usart.
При этом меняется размер бинарного файла, хотя переменная char и за диапазон не выходит.

Меняете часом не "char n" на "char n = 123"?
На размер бинарного файла обращать внимание не стоит, ибо RW-секции в RVCT по умолчанию компрессируются.
Go to the top of the page
 
+Quote Post
wmakc
сообщение Jun 18 2011, 08:33
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 111
Регистрация: 2-03-10
Пользователь №: 55 768



переменная unsigned char num = 1;
меняю на unsigned char num = 2;
Меняется размер, но раз так и должно быть, значит не в этом дело. Больше изменений никаких, причем, если добавить еще одну переменную, то usart опять продолжает работать. Также была еще одна непонятная проблема, когда объявлял массив char непосредственно перед функцией его использующей, то у меня переставал нормально работать кодек jpeg(Даже правильнее не переставал, а просто сжимал картинку неправильно), но стоило изменить его размер и все начинало работать нормально. Только вот этот массив никак не используется при сжатии. Может все связано с тем, что некоторые массивы у меня очень большие, до мегабайта могут доходить и память под них неправильно выделяется?
Иногда помогает взять старый проект и скопировать в него основной файл с main.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 18 2011, 08:43
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(wmakc @ Jun 18 2011, 12:34) *
Может все связано с тем, что некоторые массивы у меня очень большие, до мегабайта могут доходить и память под них неправильно выделяется?

Неправильно - это как? Сдается мне, что при работе вы где-то выходите за границы. Как вариант еще стека может не хватать.
Go to the top of the page
 
+Quote Post
wmakc
сообщение Jun 18 2011, 09:09
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 111
Регистрация: 2-03-10
Пользователь №: 55 768



А что можно сделать со стеком?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 18 2011, 09:29
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(wmakc @ Jun 18 2011, 13:09) *
А что можно сделать со стеком?

Посмотреть расход и увеличить при необходимости.
Go to the top of the page
 
+Quote Post
svss
сообщение Jun 18 2011, 12:25
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 231
Регистрация: 19-12-08
Из: Новосибирск
Пользователь №: 42 594



Цитата(wmakc @ Jun 18 2011, 15:34) *
переменная unsigned char num = 1;
меняю на unsigned char num = 2;

Иногда помогает взять старый проект и скопировать в него основной файл с main.

Обычно, если действительно хочется получить помощь, соискатель сообщает не только как объявляется переменная,
но и *где* объявляется, и как она используется. То есть увидеть бы кусочек кода, сказать чего б было проще.
Да и мысли излагать бы пояснее: зачем чего-то копировать в старый проект?

Вы, вероятно догадываетесь, что показанные Вами конструкции вида
"unsigned char num = 1;"
тыщи программёров использовали по стопицот раз и, стало быть, дело не в них.

Весьма не исключено, что Вы её, конструкцию, используете хитрым способом
и, например, отыскали баг линкера, связанный, скажем, с выравниванием или инициализацией статиков.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 18 2011, 13:02
Сообщение #10


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(svss @ Jun 18 2011, 16:25) *
что Вы её, конструкцию, используете хитрым способом
и, например, отыскали баг линкера, связанный, скажем, с выравниванием или инициализацией статиков.

Только вот вероятность обнаружения багов линкера\компилятора очень мала.
99,9% - это баг программы, написанной топикстартером sm.gif
Go to the top of the page
 
+Quote Post
wmakc
сообщение Jun 22 2011, 18:56
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 111
Регистрация: 2-03-10
Пользователь №: 55 768



на работоспособность usart вроде как влияли кеши, после того как отключил их в загрузчике, все стало работать. Также заметил, что некоторые переменные могут обнуляться, если в настройках компилятора поставить оптимизацию по времени.(Хотя и не понимаю как такое может быть, в программе нигде нет обнуления этих переменных). Если перед их использованием передать их по usart, то все выполняется правильно. Главное что я понял, так это то, что лучше не использовать никакую оптимизацию вообще.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 22 2011, 19:07
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(wmakc @ Jun 22 2011, 22:56) *
Также заметил, что некоторые переменные могут обнуляться, если в настройках компилятора поставить оптимизацию по времени.(Хотя и не понимаю как такое может быть, в программе нигде нет обнуления этих переменных).

Часто бывает, что на высоких уровнях оптимизации отладчик привирает, а программа работает как положено.
А ещё часто бывают ошибки в программе, которые проявляются только на высоких уровнях оптимизации (обычно это вызвано нехваткой volatile в нужных местах).
Go to the top of the page
 
+Quote Post
wmakc
сообщение Jun 24 2011, 19:23
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 111
Регистрация: 2-03-10
Пользователь №: 55 768



Спасибо за информацию, нужно правда проверить volatile переменные. Прерываний много обрабатывается, так что вполне вероятно, что что-то упустил.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 24 2011, 22:35
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (wmakc @ Jun 22 2011, 21:56) *
Главное что я понял, так это то, что лучше не использовать никакую оптимизацию вообще.

Я плакалъ sad.gif. Очередному пришла светлая мысль о том, что компиляторы пишут идиоты и оптимизациия вредна. Как не печально для Вас, но дела обстоят с точностью до наоборот.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 25 2011, 13:52
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(wmakc @ Jun 22 2011, 22:56) *
Главное что я понял, так это то, что лучше не использовать никакую оптимизацию вообще.

Действительно парадоксальный вывод.
Вы просто не умеете их готовить.
Снижать уровень оптимизации в надежде скрыть ошибки в коде - это недальновидная стратегия. Эти же ошибки могут вылезти и по другим причинам. Вообще-то разработчики наоборот стараются сделать так, чтобы на этапе разработки вскрылось как можно больше багов. Для этого включают всякие предупреждения компилятора и даже - о ужас! - устраивают разнообразные стресс-тесты, чтобы отловить изъяны в системе.
Вы же подобно страусу прячете голову в песок в надежде, что баги пройдут стороной. Не пройдут.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:52
Рейтинг@Mail.ru


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