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

    

кусок кода

 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 кусков зеленых ждешь чего то большего.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация