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

 
 
 
Reply to this topicStart new topic
> Как внутри функции считать значение из ОЗУ МК?, С/C++ в AvrStudio
MaksimYrievich
сообщение Aug 10 2011, 17:22
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828



Здравствуйте! Подскажите в чём проблема? Есть функция внутри которой необходимо прочитать значение из глобальной переменной т.е. из ОЗУ МК. В частности строчка i = StatusPrer;, где StatusPrer объявлена как unsigned char StatusPrer; в начале файла после всех инклюд. В общем вот фрагмент кода. А в приложении целиком.
CODE


unsigned char StatusPrer;

//********************************************************************
//Функция по длительности нажатия кнопки выбирает регистр команды
//********************************************************************
static void PressKeyDlit(void)
{
unsigned char KeyCod;
unsigned char i;
_delay_ms(10);
if((PINB & 0xF0) == 0xF0)
{ return;}
else
{TCNT1 = 0x0000;
TCCR1B |= (1<<CS00);}
StatusPrer = 0x00; //Вот здесь без проблем. При компиляции команда остается.
metka1:
wdt_reset();
KeyCod = PINB;
i = StatusPrer; //А вот то место которое упорно удаляется компилятором!!! Соответственно
if(i == 0xFF) //ниже ничего не работает.
{goto metka2;}
else
{wdt_reset();}

if((PINB & 0xF0) != 0xF0)
{goto metka1;}
else
{}
metka2: TCCR1B &= ~(1<<CS00);

if(i == 0xFF)
{_delay_ms(10);
CommandKeyHigh(KeyCod);
return;}
else
{CommandKeyDown(KeyCod);}
}

Прикрепленные файлы
Прикрепленный файл  PH_Regulator_PHR_04_01.rar ( 35.75 килобайт ) Кол-во скачиваний: 10
 
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 10 2011, 17:33
Сообщение #2


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Объявите:

Код
volatile unsigned char StatusPrer;
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Aug 10 2011, 17:39
Сообщение #3


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



У Вас StatusPrer объявлен и в приведённом фрагменте меняется только в одном месте.
Объявите его для начала как volatile чтобы компилятор не оптимизировал доступ к нему.
Если по умолчанию значение StatusPrer = 0, и в Вашем фрагменте ему присваивается 0 то компилятор решил что его значение константное и всегда равно 0.
Поэтому и выкинул ненужный кусок кода. Ещё i=StatusPer может быть оптимизирована из-за того что прочитав его значение в i Вы пытаетесь исп. его для условия if. Компилятор волне мог считать значение в регистр и не использовать переменную i которая могла-бы быть расположенной в стеке. Объявите i volatile если хотите чтобы обмен шёл именно через i.

пока писал ответ sergeeff уже дал ответ sm.gif

Сообщение отредактировал mempfis_ - Aug 10 2011, 17:40
Go to the top of the page
 
+Quote Post
Xenia
сообщение Aug 10 2011, 17:41
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Вы приравниваете StatusPrer нулю:
StatusPrer = 0x00;
после чего компилятор видит, что i всегда тоже нуль:
i = StatusPrer;
А раз так и отказывется проверять фантастические условия:
if(i == 0xFF)
которые очевидно никогда не выполняются.

Предположу, что вы хотели, чтобы StatusPrer = 0x00 было внутри условия else{}, но закрыли блок слишком рано.
Go to the top of the page
 
+Quote Post
MaksimYrievich
сообщение Aug 10 2011, 17:52
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828



Цитата(sergeeff @ Aug 10 2011, 21:33) *
Объявите:

Код
volatile unsigned char StatusPrer;

Да на самом деле сработало. А поясните пожалуйста сей прибамбас. То есть как я понял надо изначально объявлять такие переменные как "volatile". Так сказать сразу компилятору объяснить, что мол не смей даже прикасаться к модернизации кода, связанного с этой переменной. Правильно я Вас понял?

Цитата(Xenia @ Aug 10 2011, 21:41) *
Предположу, что вы хотели, чтобы StatusPrer = 0x00 было внутри условия else{}, но закрыли блок слишком рано.

На самом деле это не имеет значения. Дай БОГ ВАМ всем доброго здоровья! Тема закрыта.
Go to the top of the page
 
+Quote Post

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

 


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


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