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

 
 
> Защита памяти, Нужно защитить переменную в памяти
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
Ответов
SasaVitebsk
сообщение Apr 28 2010, 06:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Sergio66 @ Apr 27 2010, 22:28) *
Внимание вопрос - есть ли какие нибудь мысли, как расположить данную переменную так, чтобы никакая функция, вышедшая за границы стека ее не могла испортить.

biggrin.gif

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

Мне трудно судить о вашей программе, но, исходя из вероятности сбоя, мне кажется у вас проблемы с атомарностью доступа к переменной, достаточно редко используемой. Это можно проверить, блокируя участки кода запретом прерывания. Так можно локализовать "место порчи". Ну и классический способ: взять исходник, и думать, как машина. smile.gif
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Apr 28 2010, 08:05
Сообщение #3


Местный
***

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



Цитата(SasaVitebsk @ Apr 28 2010, 10:34) *
biggrin.gif

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

1. Все другие переменные восстанавливаемы. Все, кроме времени. Они восстанавливаются из контекста программы.
2. Вопрос ставился именно КАК защитить определенную область памяти от всяких случайных переполнений. Чтобы ВСЕ переменные не портились. Ну, на крайний случай - критические данные, типа времени.
Цитата(SasaVitebsk @ Apr 28 2010, 10:34) *
Мне трудно судить о вашей программе, но, исходя из вероятности сбоя, мне кажется у вас проблемы с атомарностью доступа к переменной, достаточно редко используемой. Это можно проверить, блокируя участки кода запретом прерывания. Так можно локализовать "место порчи". Ну и классический способ: взять исходник, и думать, как машина. smile.gif

Что касается доступа - то системное время мнеяется только в обработчике прерывания таймера, а во всех остальных случаях, только читается и переностится в лог.
Конфликт доступа исключен.
Причем, сбивается оно случайным образом - не предсказуемо на какое значение, а в обработчике прерывания оно меняется только на 1 (+1). Т.е. конфликт доступа, если бы он и был, то не приводил бы к таким последствиям.

И, возвращаясь к вопросу стека - при настройках из xcl-файла, CStack развивается в сторону младших или старших адресов? Судя по тому, как задан стек, мне кажется, что в сторону младших. Т.о., при выходе за 0х60 адрес, стек что будет портить? регистровый файл? Старшие адреса области данных? Старшие адреса RStack?
Go to the top of the page
 
+Quote Post



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

 


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


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