|
Я в тупике. IAR C., может кто подскажет ниточку ... |
|
|
|
Jul 6 2006, 21:46
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Проблема такая. Прога в JTAG MK2 работает. Выключаешь/включаешь питание - нет. Точнее почти полностью работает. Причина выяснена. Имеется одна переменная, которая объявлена в начале файла таким образом: uint8_t static NumbActiveKom=0; // Текущее число активных команд Эта переменная в голове инкрементируется в виде: NumbActiveKom++; // Ввод команды завершён А в прерывании декрементируется типа: NumbActiveKom--; // Сократить число активных команд Дальше я с помощью отладочного вывода выяснил, что в прерывании она уменьшается (и сохраняется от прерывания к прерыванию), а в голове увеличивается. Короче ведёт себя так, как будто это две различных переменных. Даже не совсем так. Сначала всё нормально в голове она увеличивается до 10. Потом в прерывании она должна уменьшатся и по мере уменьшения в голове должны подгружаться новые команды, а переменная должна увеличиваться. Но этого не происходит. Переменная уменьшается и в прерывании читается правильно 10,9,8,7... а в голове читается 10 на постоянку! Как будто значение переменной с прерывания не передаётся в голову. Я попробовал остановить в JTAG прогу в нулевом адресе и "загадить" всё озу "FF". А потом запустить прогу на отладку в JTAG. Не помогает. Работает прекрасно. Как будто в JTAG своя прога, а так - своя. Пересбрасывать тоже не помогает. Надо вкл./выкл. МК. Причём на такое время, чтобы озу похезалось. Может кто подскажет как такую хрень вычислить? Вся остальная прога работает как часы. Одна переменная только.
|
|
|
|
|
Jul 7 2006, 06:58
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(SasaVitebsk @ Jul 7 2006, 00:46)  Проблема такая. Прога в JTAG MK2 работает. Выключаешь/включаешь питание - нет. Точнее почти полностью работает. Причина выяснена. Имеется одна переменная, которая объявлена в начале файла таким образом: uint8_t static NumbActiveKom=0; // Текущее число активных команд
Эта переменная в голове инкрементируется в виде: NumbActiveKom++; // Ввод команды завершён
А в прерывании декрементируется типа: NumbActiveKom--; // Сократить число активных команд
Дальше я с помощью отладочного вывода выяснил, что в прерывании она уменьшается (и сохраняется от прерывания к прерыванию), а в голове увеличивается. Короче ведёт себя так, как будто это две различных переменных. Даже не совсем так. Сначала всё нормально в голове она увеличивается до 10. Потом в прерывании она должна уменьшатся и по мере уменьшения в голове должны подгружаться новые команды, а переменная должна увеличиваться. Но этого не происходит. Переменная уменьшается и в прерывании читается правильно 10,9,8,7... а в голове читается 10 на постоянку! Как будто значение переменной с прерывания не передаётся в голову. Код в студию!
|
|
|
|
|
Jul 7 2006, 09:05
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(IgorKossak @ Jul 7 2006, 13:45)  Цитата(Old1 @ Jul 7 2006, 10:10)  Для того, чтобы компилер не вмешивался с оптимизацией, глобальную переменную нужно объявить volatile, что и рекомендовал GetSmart , а __root всего лишь "говорит" компилятору чтобы он перменную "не выкинул" даже если к ней нет обращений в коде...
Хотелось бы знать, какой толк в непременном наличии переменной если в программе к ней нет обращения?  А например, если нужно временно зарезервировать область в RAM, а xcl-файл править не хочется
|
|
|
|
|
Jul 7 2006, 09:26
|

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

|
Цитата(IgorKossak @ Jul 7 2006, 10:45)  Хотелось бы знать, какой толк в непременном наличии переменной если в программе к ней нет обращения?  Код __root char const __flash * copyright "Слава мне, победителю драконов!" :-)) Возможно переменнная объявляется в application а обращение к ней из bootloader section. Обе части компилятся как отдельные программы. В общем хоть и редко, но бывает надо.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 7 2006, 12:30
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(Сергей Борщ @ Jul 7 2006, 12:26)  Цитата(IgorKossak @ Jul 7 2006, 10:45)  Хотелось бы знать, какой толк в непременном наличии переменной если в программе к ней нет обращения?  Код __root char const __flash * copyright "Слава мне, победителю драконов!" :-)) Возможно переменнная объявляется в application а обращение к ней из bootloader section. Обе части компилятся как отдельные программы. В общем хоть и редко, но бывает надо. Согласен, бывает надо. Но в этом случае к переменной таки есть обращение в обеих частях. Кроме того, кто может гарантировать, что в обеих частях она будет лежать в одном и том же месте если не отвести для неё отдельный сегмент в xcl файле? rezident, ну разве что как временная мера
|
|
|
|
|
Jul 7 2006, 19:19
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата Причина выяснена. Имеется одна переменная, которая объявлена в начале файла таким образом: uint8_t static NumbActiveKom=0; // Текущее число активных команд
Эта переменная в голове инкрементируется в виде: NumbActiveKom++; // Ввод команды завершён
А в прерывании декрементируется типа: NumbActiveKom--; // Сократить число активных команд
Дальше я с помощью отладочного вывода выяснил, что в прерывании она уменьшается (и сохраняется от прерывания к прерыванию), а в голове увеличивается. Короче ведёт себя так, как будто это две различных переменных. Если main и процедура прерывания описаны в разных Си-шных модулях, то так и будет. Переменная типа static имеет область видимости в пределах того модуля, где она описана. Объявите ее в модуле с main-ом как Код volatile uint8_t NumbActiveKom=0; а в модуле с прерыванием как Код extern volatile uint8_t NumbActiveKom; и все будет инкрементировать и декрементироваться как вам хотелось.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|