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

 
 
> Защита памяти, Нужно защитить переменную в памяти
Sergio66
сообщение Apr 27 2010, 19:28
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Доброго вечера!
Есть программа, для Меги32.
Уже пол-года в тестовой эксплуатации.
Возникает следующая проблема - иногда, (из 50 приборов за 4 месяца круглосуточной эксплуатации) 3 или 4 раза произошел сбой системного времни
Системные часы организованы по таймеру от задающего генератора (16МГц).
CStack программы выбран в соответствии с МАР файлом, RStack - аналогично. Однако, в программе используется ф-я printf.
И у меня есть подозрение, что для нее компиллер не может правильно оценить размер CStack, и она, при своей работе выходит за границы объявленного стека и портит рабочие переменные.
переменная системного времени (__no init) расположена, естесственно в ОЗУ.
Внимание вопрос - есть ли какие нибудь мысли, как расположить данную переменную так, чтобы никакая функция, вышедшая за границы стека ее не могла испортить.
Отловить ошибку средствами отладчика не представляется возможным. Ошибка довольно редкая.
И еще.
что происходит с CStack, когда он достигает дна. Где после этого будут размещаться локальные переменные?
Заранее благодарю.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GDI
сообщение Apr 28 2010, 08:57
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Ну переместите вашу переменную в другое месть или жестко задайте ей другой адрес по дальше от границы стека или просто измените порядок объявления переменных в исходнике. Если уверены что дело в стэке, то почему бы вам чисто для отладки не уменьшить его значение, тогда по идее должна увеличится частота возникновения ошибок. В ИАРе (вы ведь им пользуетесь?) в настройках проекта можно включить показ дополнительной информации в мап-файле, в частности можно включить показ рекомендуемого/расчетного размера стека.
P.S. А защитить что-либо при порче стека, конечно же невозможно, по крайней мере в архитектуре АВР.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Apr 28 2010, 09:14
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Цитата(GDI @ Apr 28 2010, 12:57) *
Ну переместите вашу переменную в другое месть или жестко задайте ей другой адрес по дальше от границы стека или просто измените порядок объявления переменных в исходнике. Если уверены что дело в стэке, то почему бы вам чисто для отладки не уменьшить его значение, тогда по идее должна увеличится частота возникновения ошибок. В ИАРе (вы ведь им пользуетесь?) в настройках проекта можно включить показ дополнительной информации в мап-файле, в частности можно включить показ рекомендуемого/расчетного размера стека.
P.S. А защитить что-либо при порче стека, конечно же невозможно, по крайней мере в архитектуре АВР.


Да, я пользуюсь именно ИАРом. И стек я выбираю именно по рекомендациям из МАР файла.
Скажите, а вот для такой конструкции ИАР корректно может вычислить размер стека:
printf("трали вали %u", f(x));
где f(x) возвращает int ???
Есть у меня именно такие конструкции, грешу на них.
Есть мысли по этому поводу?

А чтобы переместить критическую переменную подальше от границ стека, я и задавал вопрос - куда будут писаться локальные переменные при нарушениии границ CStack?
в RStack? в регистовый файл? или в область старших адресов SRAM?
Go to the top of the page
 
+Quote Post



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

 


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


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