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

 
 
> Отладка в KEIL. Как вычислить, откуда в переменной появляются данные?
zheka
сообщение Aug 13 2013, 02:47
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Есть функция
Код
OW_ReceiveByte()
{   unsigned char count, data;
count = 8;
  do
   {
    data >>= 1;
    if(OW_ReadBit()) data |= 0x80;
   }
  while(--count);

  return data;
}


каким-то непостижимым образом в data изначально появляются данные. Каждый раз одинаковые. Даже если ничего не писать в data, а по выходу из функции прочитать то, что она возвращает.

Как вычислить с помощью отладчика?
Контроллер - STM32F103VGT6

Сообщение отредактировал zheka - Aug 13 2013, 02:48
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Aug 13 2013, 05:59
Сообщение #2


Гуру
******

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



QUOTE (andrewlekar @ Aug 13 2013, 06:12) *
Вроде как по стандарту локальные переменные должны инициализироваться нулём в C.
Перечитайте стандарт. Только глобальные и статические переменные.
QUOTE (zheka @ Aug 13 2013, 07:25) *
Проблема то решена принудительным обнулением.
А проблемы не было. У вас 8-битовая переменная и вы 8 раз в нее вдвигаете биты. Все ваши обнуленные биты "выталкиваются" из переменной во время исполнения функции. Поэтому начальное значение data на результат не влияет.
QUOTE (zheka @ Aug 13 2013, 07:25) *
Но - по логике вещей в data ничего не должно писаться без ведома программы, так собственно и происходит с остальными пермененными.
А в нее ничего специально и не пишется. Просто двоичная система не имеет состояния "ничего не записано". Поэтому изначально там случайный набор битов.
QUOTE (zheka @ Aug 13 2013, 07:25) *
Как выяснилось, массив у меня был без указания размера, а по сему пользовался "ничейной" областью памяти. И когда программа хотела в эту область записать еще что-то, ей это удавалось.
Наоборот. Это вы писали за границы своего массива нулевой длины и портили другие переменные, а потом пытались эти переменные считать как содержимое своего массива.
QUOTE (zheka @ Aug 13 2013, 07:25) *
Так вот у меня опасения, что причина проблем с переменной data схожая, боюсь что словлю глюк где-нибьудь еще и понять его причину будет сложно.
С переменной data проблем нет. И чудес не бывает и нет. Проблема в том, что вы пытаетесь пользоваться инструментом (языком C) не изучив его. Вы же не пытаетесь методом "тыка" использовать лекарства из домашней аптечки - здесь вы имеете такой же летальный для вашей программы результат.
QUOTE (zheka @ Aug 13 2013, 07:25) *
Копнул недавно на теу отладки в KEIL, добавил в окно мониторинга пару переменных и был разочарован - чтобы узнать их значение, программу нужно останавливать. Куда удобнее выводить на экран.

а) Просмотр переменных в отладчике удобен для пошаговой отладки.
б) много переменных на экран не выведешь
в) на экране нельзя посмотреть переменную, которую вы захотели посмотреть уже после того, как запустили программу.
Для разных целей разные методы. Для чего-то - светодиод, для чего-то - консоль (на худой конец - экран), для чего-то - отладчик.

QUOTE (zheka @ Aug 13 2013, 07:25) *
Как сделать две вещи - определить адрес в памяти, выделенный под data и как определить "клиента" который на этот адрес покушается?

1)прочитать описание языка и из него узнать, где размещаются локальные переменные
2)посмотреть дизассемблированный код функции и узнать смещение переменной в стековом кадре или имя регистра (компилятор имеет право расположить ее и в регистре).
3) на шаге 1 понять, что никто никуда не покушается и ничего не портит.

QUOTE (zheka @ Aug 13 2013, 07:25) *
Никогда похожих проблем не было с выводом на экран или запись в порт. Как-то расхотелось пользоваться житагом.
"Ну дык, еб тыть" - сказали суровые русские мужики и пошли валить лес двуручными пилами.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- zheka   Отладка в KEIL. Как вычислить, откуда в переменной появляются данные?   Aug 13 2013, 02:47
- - VAI   data у Вас - локальная переменная, то место ей выд...   Aug 13 2013, 03:52
- - andrewlekar   Вроде как по стандарту локальные переменные должны...   Aug 13 2013, 04:12
- - toweroff   А если непосредственно по вопросу темы, то в окне ...   Aug 13 2013, 04:31
- - Golikov A.   А если совсем по теме то КЕИЛ может делать такие ч...   Aug 13 2013, 04:42
|- - toweroff   Цитата(Golikov A. @ Aug 13 2013, 08:42) Т...   Aug 13 2013, 04:49
- - zheka   Цитатаstatic unsigned char data; КодНо если у вас ...   Aug 13 2013, 05:25
- - richie   zheka, возьмите в привычку: объявил переменную, пр...   Aug 13 2013, 05:27
- - zheka   Цитатаzheka, возьмите в привычку: объявил переменн...   Aug 13 2013, 05:36
|- - Raven   Цитата(zheka @ Aug 13 2013, 09:36) То ест...   Aug 13 2013, 05:59
- - andrewlekar   ЦитатаПри изучении чужих программу меня сложилось ...   Aug 13 2013, 05:56
- - zheka   ЦитатаА проблемы не было. У вас 8-битовая переменн...   Aug 13 2013, 07:50
- - редактор   При входе в отладчик в кейле в менюшке (View кажет...   Aug 13 2013, 07:52
|- - zheka   Цитата(редактор @ Aug 13 2013, 11:52) При...   Aug 13 2013, 12:09
- - Golikov A.   а еще Кодint data int * data_adr = &data; в...   Aug 13 2013, 14:25
|- - Сергей Борщ   QUOTE (Golikov A. @ Aug 13 2013, 16:25) в...   Aug 13 2013, 20:53
|- - Golikov A.   Цитата(Сергей Борщ @ Aug 14 2013, 00:53) ...   Aug 14 2013, 03:43
- - toweroff   Что есть startup? кусок кода, который, обычно: 1. ...   Aug 13 2013, 21:19


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

 


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


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