|
Отладка в KEIL. Как вычислить, откуда в переменной появляются данные? |
|
|
|
Aug 13 2013, 02:47
|
Гуру
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Aug 13 2013, 14:25
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
а еще Код int data int * data_adr = &data; всегда считал что все переменные до инициализации содержат мусор, не знал про статик и глобальные. А кто их нулит? Ведь есть системы где память после загрузки не 0, процы на плисах к примеру, 9 Кбайтные блоки памяти у них не нулятся при старте, даже если просить... а еще 16 битные переменные в 8 битных контроллерах умеют во время прерывания на половину изменятся, не говорят про 32 и 64 битные переменные... Что же вы теперь программу будете всю отладчиком шерстить? Лучше уже писать безопасный код ИМХО. Доказательство лучше проверки...
|
|
|
|
|
Aug 13 2013, 20:53
|

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

|
QUOTE (Golikov A. @ Aug 13 2013, 16:25)  всегда считал что все переменные до инициализации содержат мусор, не знал про статик и глобальные. А кто их нулит? Обычно это специальный так называемый стартап код, который выполняется перед запуском main(). В стандарте сказано просто что-то вроде "переменные обнуляются". Чем и как - вроде бы не оговаривается. QUOTE (Golikov A. @ Aug 13 2013, 16:25)  Что же вы теперь программу будете всю отладчиком шерстить? Лучше уже писать безопасный код ИМХО. Если бы все были этакими сферическими программистами в вакууме, способными писать код сразу без ошибок... Часто проход по шагам небольшого кусочка кода, исполняющегося не так, как ожидал автор, позволяет за один проход найти ошибку. Все остальные методы отладки, включая медитацию над исходником, требуют гораздо больше времени.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 14 2013, 03:43
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(Сергей Борщ @ Aug 14 2013, 00:53)  Обычно это специальный так называемый стартап код, который выполняется перед запуском main(). В стандарте сказано просто что-то вроде "переменные обнуляются". Чем и как - вроде бы не оговаривается.
Если бы все были этакими сферическими программистами в вакууме, способными писать код сразу без ошибок... Часто проход по шагам небольшого кусочка кода, исполняющегося не так, как ожидал автор, позволяет за один проход найти ошибку. Все остальные методы отладки, включая медитацию над исходником, требуют гораздо больше времени. Ок, будем знать как говориться... Но я на всякий случай важные переменные все равно буду в начале инициализировать. Потери от этого если и есть, то они мизерные, зато как то внутри спокойнее.... Я не про отладку в целом, я про фразу человека что он сделал массив без размера, фактически указатель, а потом загадив им память начал тыкать отладчиком во все функции и смотреть как локальные переменные объявляются, и не приводит ли это к чему... так проверить все я уверен нельзя. Потому считаю что лучше объявить переменную явно если от ее значения сразу что-то зависит, либо писать код учитывая что в начале она имеет любое значение.
|
|
|
|
Сообщений в этой теме
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 Сергей Борщ QUOTE (andrewlekar @ Aug 13 2013, 06:12) ... Aug 13 2013, 05:59 zheka ЦитатаА проблемы не было. У вас 8-битовая переменн... Aug 13 2013, 07:50 редактор При входе в отладчик в кейле в менюшке (View кажет... Aug 13 2013, 07:52 zheka Цитата(редактор @ Aug 13 2013, 11:52) При... Aug 13 2013, 12:09 toweroff Что есть startup?
кусок кода, который, обычно:
1. ... Aug 13 2013, 21:19
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|