Jump to content

    
Fox_Sanchez

STM32 FreeRTOS UART бьются данные

Recommended Posts

Добрый день!

Есть проект с на STM32F429 с FreeRTOS. Там несколько не сильно загруженных задач. Одна из них получает из очереди сообщения, парсит их и передает на ПК через UART всякие текстовые сообщения.

Помогите отловить странный глюк: при выводе наблюдается что-то типа "Отпра��лено с��общение". При том бьются символы на схожем интервале во всех посылках.

Пробовал передачу как блокирующую, так и по прерываниям и даже через DMA - везде оно присутствует в разной мере. Отладчиком проверял - из очереди данные поступают без повреждений. Функции УАРТ брал ХАЛовские стандартные, свои писать пока не пробовал. Если все остальные задачи заглушить - глюк пропадает (но и очередь не работает, просто делаю тестовый вывод в цикле единственной задачи).

Кстати насколько ХАЛ можно использовать в многопоточном приложении? (при условии что с УАРТом работает только одна задача)

Share this post


Link to post
Share on other sites

Дописал свои функции вывода - не помогло.

void my_putchar(uint8_t ch)
{
	taskENTER_CRITICAL();
	while(!	(huart5.Instance->SR & UART_FLAG_TXE)	);
	huart5.Instance->DR = (ch);
	taskEXIT_CRITICAL();
}

void my_puts(uint8_t * str, uint32_t len)
{
	uint32_t i;
	for(i=0;i<len;i++)	my_putchar(*(str+i));

}

Строка на вход приходит нормальная (смотрю отладчиком, брякпоинт на вызов my_puts), на выходе - битая. Что еще это может быть?

Есть какая-нибудь возможность "отловить" обращение к памяти под массивом этой строки? В момент вызова my_puts она нормальная, а в процессе вывода данные портятся. При том далеко не каждый раз. Такое ощущение, что туда кто-то пишет эту дичь время от времени.

Share this post


Link to post
Share on other sites

Мой опыт подсказывает, что проблемы возникают часто по этим причинам:

1. Не хватает стэка задаче. Можно временно увеличить всем задачам при создании стэк до заведомо больших величин, например до 1024 слов (число в FreeRTOS при создании задачи указывает не количество байт, а количество слов).

2. Не хватает стэка MSP. Увеличить его размер в скрипте линкера. Тоже, допустим до 1 кБ. Задачи работают со стэком PSP.

3. Неаккуратная работа с одним или несколькими указателями. Здесь может помочь MPU. Но я его не использовал, поэтому поищите поиском на форуме, как это сделать. Описания точно приводились. Либо, заглушить все задачи, которые не нужны для проверки последовательного порта, и оставьте лишь минимум. И вот этот минимум отлаживать. Т.е., допустим одна задача пишет в очередь, вторая (которая обслуживает порт) её разгребает и выводит в порт. Ну или как-то так, я не знаю, как точно у вас программа устроена в плане архитектуры ПО и драйверов.

Share this post


Link to post
Share on other sites
12 hours ago, Fox_Sanchez said:

....Такое ощущение, что туда кто-то пишет эту дичь время от времени.

huart5.Instance->SR & UART_FLAG_TXE

Открою большую тайну - это тип совсем не буль... Далее думаю понятно...

 

(круглый)

ЗЫ

ВАНГУЮ: Но имхо - это не единственный ляп в коде.

Edited by kolobok0

Share this post


Link to post
Share on other sites
2 hours ago, kolobok0 said:

Открою большую тайну - это тип совсем не буль... Далее думаю понятно...

Он и не должен быть булем. Главное, что он или ноль или не ноль. Так всегда циклы для поллинга флагов писали и пишут)

Share this post


Link to post
Share on other sites
29.08.2020 в 18:01, kolobok0 сказал:

Открою большую тайну - это тип совсем не буль... Далее думаю понятно...

в си (а фриртос на си) нет булей. у тс нормальная строка.

2тс, попробуй так

while(! (huart5.Instance->SR & UART_FLAG_TС) );

 

Share this post


Link to post
Share on other sites
On 8/29/2020 at 4:46 AM, Fox_Sanchez said:

Есть проект с на STM32F429 с FreeRTOS. Там несколько не сильно загруженных задач.

Проверь в настройках FreeRTOS режим энергосбережения. Когда ядро уходит в сон с работающей периферией - иногда подобная фигня случается. 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.