Перейти к содержанию
    

кусок кода

 if (ack == 1)
 {
     value = (RxMessage.Data[1] << 8) | RxMessage.Data[0];
     Parser_SendInt(COM_USART, value, 1, 0);
     break;
 }

Если ставлю точку останова на value = (RxMessage.Data[1] << 8) | RxMessage.Data[0]; - получаю правильное значение на выходе.
Без точки останова - получаю 0. И не важно value локальная или глобальная переменная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если на Parser_SendInt поставить, что получится?

 

P.S. Думаю, IAR ни при чем, как обычно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, aaarrr said:

А если на Parser_SendInt поставить, что получится?

 

P.S. Думаю, IAR ни при чем, как обычно.

если на Parser_SendInt поставить - тоже  0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда следующий вопрос: как связаны ack и заполнение полей RxMessage?

А то очень похоже, что последние заполняются где-нибудь в прерывании уже после того, как был взведен ack.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, aaarrr said:

Тогда следующий вопрос: как связаны ack и заполнение полей RxMessage?

А то очень похоже, что последние заполняются где-нибудь в прерывании уже после того, как был взведен ack.

если вставить задержку то все в порядке

if (ack == 1)
{
    for (i = 0; i < 10000; i++) ;
            
     value = (RxMessage.Data[1] << 8) | RxMessage.Data[0];
     Parser_SendInt(COM_USART, value, 1, 0);
     break;
}

данные я получаю по КАН. но это не многопоточное приложение. если бы в одном потоке я получал КАН а вдругом запрашивал данные тогда я бы понял. но ack = 1 когда данные уже приняты.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, jenya7 said:

но ack = 1 когда данные уже приняты.

Поведение под отладчиком и с задержкой не наводит на мысль, что это все же не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, aaarrr said:

Поведение под отладчиком и с задержкой не наводит на мысль, что это все же не так?

ох. наводит. еще как наводит. надо как то синхронизироваться с данными.

тем не менее IAR все равно меня часто растраивает в последнее время. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jenya7 said:

IAR все равно меня часто растраивает в последнее время. :)

Тогда меняйте, чего мучаться?)
 

Quote

 Тебе не нравятся кошки!? Ты просто не умеешь их готовить!



По делу, похоже на то что флаг выставляется по приему первого байта а при присвоени значения переменной value, второй байт(R xMessage.Data[1]) еще не был принят

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, Integro said:

Тогда меняйте, чего мучатся?)
 

я продублировал проект в Атолик. вот сижу размышляю.

7 minutes ago, Integro said:


По делу, похоже на то что флаг выставляется по приему первого байта а при присвоени значения переменной value, второй байт(R xMessage.Data[1]) еще не был принят

да. КАН не спеша заполняет мэйлбокс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, Integro сказал:

Тогда меняйте, чего мучатся?)

После этого изменятся только топики тем, с "IAR опять глючит", на "XXX опять глючит"   ;)))

Тут ведь дело не в бобине....   ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, jcxz said:

После этого изменятся только топики тем, с "IAR опять глючит", на "XXX опять глючит"   ;)))

Тут ведь дело не в бобине....   ;)

Не уверен. На Атолик нареканий не было. Все работало чики пуки

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Покажите объявление RxMessage. Подозреваю, что volatile там нет, что и позволяет компилятору отложить запись из регистров в память на момент после записи единицы в ack.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/2/2018 at 4:17 PM, Сергей Борщ said:

Покажите объявление RxMessage. Подозреваю, что volatile там нет, что и позволяет компилятору отложить запись из регистров в память на момент после записи единицы в ack.

volatile не помог. интересно что флаг ack устанавливается уже после

void USB_LP_CAN1_RX0_IRQHandler(void)
{
  can_message_received = 1;
 
  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
}

то есть данные уже приняты по идее. ack = 1 только если  can_message_received = 1

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 02.11.2018 в 16:21, jenya7 сказал:

Не уверен. На Атолик нареканий не было. Все работало чики пуки

Есть некоторый опыт переноса с IAR на GCC. Так вот, смею доложить, IAR многое прощает при оптимизации по сравнению с GCC. При использовании -О3 и -Оs не всё с ходу заводится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 minutes ago, VladislavS said:

Есть некоторый опыт переноса с IAR на GCC. Так вот, смею доложить, IAR многое прощает при оптимизации по сравнению с GCC. При использовании -О3 и -Оs не всё с ходу заводится.

или! уж я столкнулся с этой проблемой! правда многие товарищи тут пытаются меня убедить что это мои кривые руки. они то кривые но от компайлера за 5 кусков зеленых ждешь чего то большего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...