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

    
2 hours ago, Integro said:

Не видел, не верю!)
Гипотезу с лишним прерыванием легко проверить вставкой счетчика в обработчик.

А вообще, мне кажется, должно быть так:


void CAN1_RX0_IRQHandler(void)
{
    if (CAN_GetITStatus(CAN1,CAN_IT_FMP0)!= RESET)
    {
        CAN_ClearITPendingBit(CAN1, CAN_IT_FF0);
        CAN_ClearFlag(CAN1, CAN_FLAG_FF0);

        CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);

        can_message_received = 1;
    }
} 

 

Зачем чистить флаг "FIFO полон" не в этом месте? Для этих бит должна быть отдельная ветка в прерывании. А в FMP0 ничего чистить не нужно. Только проверка:

void CAN1_RX0_IRQHandler(void)
{
	if(CAN_GetITStatus(CAN1, CAN_IT_FMP0) == SET)
	{
		CanRxMsg CANRxMessage;
		
		CAN_Receive(CAN1, CAN_FIFO0, &CANRxMessage);
		
		can_message_received = 1;
	}
	
	if(CAN_GetITStatus(CAN1, CAN_IT_FF0) == SET)
	{
      ...
	  CAN_ClearITPendingBit(CAN1, CAN_IT_FF0);
	}
	
	if(CAN_GetITStatus(CAN1, CAN_IT_FOV0) == SET)
	{
      ...
	  CAN_ClearITPendingBit(CAN1, CAN_IT_FOV0);
	}
}

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
3 minutes ago, Сергей Борщ said:

Там никакого ПДП нет между CAN и CANRxMessage?

В STM32 (скажу за серию F4) нет DMA на CAN.

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


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, Arlleex сказал:

скажу за серию F4

А вы уверены в своей телепатии? Я вот нет, поэтому и спрашиваю. Автор-то не посчитал нас достойными знать тип процессра, поэтому рассуждаем о сферическом коне в вакууме.

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


Ссылка на сообщение
Поделиться на другие сайты
Just now, Сергей Борщ said:

А вы уверены в своей телепатии? Я вот нет, поэтому и спрашиваю. Автор-то не посчитал нас достойными знать тип процессра, поэтому рассуждаем о сферическом коне в вакууме.

Ну, тут ваша подпись как раз хорошо вписывается - "На любой вопрос даю любой ответ" =)

Вангую, что контроллер у него F1 (103, возможно), судя по названию вектора обработчика (по первым ссылкам Гугла). Но и в нем нет DMA на CAN.

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


Ссылка на сообщение
Поделиться на другие сайты
34 minutes ago, Сергей Борщ said:

А вы уверены в своей телепатии? Я вот нет, поэтому и спрашиваю. Автор-то не посчитал нас достойными знать тип процессра, поэтому рассуждаем о сферическом коне в вакууме.

контролер STM32F303CB.

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


Ссылка на сообщение
Поделиться на другие сайты
On 11/4/2018 at 2:02 PM, jenya7 said:

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

Это точно. Он должен застенчиво заглядывать в глаза и с полуслова понимать намерения кодера. А кофе варить - это даже компиляторы за 1000 доллариев умеют.

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


Ссылка на сообщение
Поделиться на другие сайты
On 11/5/2018 at 2:09 PM, jenya7 said:

спасибо. проверю.

Так чем все закончилось? И закончилось ли? IAR все еще плох?

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


Ссылка на сообщение
Поделиться на другие сайты
12 minutes ago, Integro said:

Так чем все закончилось? И закончилось ли? IAR все еще плох?

не могу проверить пока. система разобрана.

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


Ссылка на сообщение
Поделиться на другие сайты
В 04.11.2018 в 14:02, jenya7 сказал:

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

Про руки совершенно зря сомневаетесь, огромное кол-во ваших тем это подтверждает. Компилятор ограничен стандартом языка. А стандарт С/С++ написан в расчете на экстремально внимательных и сознательных разработчиков. Если хочется что бы машина домысливала за вас нужно использовать что-нибудь другое: python, javascript, php, etc. Многие из них доступны и в эмбедед, возможно вам бы стало легче.

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


Ссылка на сообщение
Поделиться на другие сайты
On 11/6/2018 at 1:48 PM, Integro said:

Так чем все закончилось? И закончилось ли? IAR все еще плох?

Переделал функцию прерывания, как посоветовал уважаемый Arlleex. Помогло. Принимаю данные без внесенной задержки. Правда бывает проскакивает 0 но с этим можно жить.

 

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


Ссылка на сообщение
Поделиться на другие сайты
8 minutes ago, jenya7 said:

Переделал функцию прерывания, как посоветовал уважаемый Arlleex. Помогло. Принимаю данные без внесенной задержки. Правда бывает проскакивает 0 но с этим можно жить.

 

Я наоборот стараюсь увеличивать частоту сбоев, если они есть, чтобы можно было найти причину и устранить её. А кто-то считает уменьшение частоты сбоев благом. Чудеса :-)

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


Ссылка на сообщение
Поделиться на другие сайты
16 minutes ago, scifi said:

Я наоборот стараюсь увеличивать частоту сбоев, если они есть, чтобы можно было найти причину и устранить её. А кто-то считает уменьшение частоты сбоев благом. Чудеса :-)

категорически согласен. просто есть проблемы с более высоким приоритетом. отложу до лучших времен.

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


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

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

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

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

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

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

Войти

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

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