|
Interlocked Exchange, проблема с массивом данных |
|
|
|
Oct 29 2015, 12:53
|

Частый гость
 
Группа: Участник
Сообщений: 82
Регистрация: 1-03-10
Пользователь №: 55 731

|
Первый раз столкнулся с такой проблемой. stm32f407 В прерываниях по usart заполняю массив данными. Данных всегда одинаковое количество. Когда принимаю последний байт, выставляю флаг и данные разбираю в общем цикле. Код if(cnt<MAX_STRLEN){ received_string[cnt-1] = t; } else if(cnt == MAX_STRLEN){ received_string[cnt-1] = t; cnt = 0; flag_p = 1; } Но прерывание может возникнуть снова в тот момент, когда я еще не успел разобрать данные, соответственно они могут испортиться. Вопрос, как выйти из этой ситуации? Есть ли какие-нибудь атомарные операции, чтобы данные не бились. Спасибо
|
|
|
|
|
 |
Ответов
(1 - 8)
|
Oct 29 2015, 13:53
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Mikron @ Oct 29 2015, 16:23)  Хотелось бы вообще исключить даже теоретическую возможность побитых данных Тогда заведите бесконечно большой кольцевой буфер, пусть прерывание УСАПП складывает принятые данные в него, а процедура обработки вынимает из него и обрабатывает. Чем больше размер буфера, тем дольше можно задумываться над некоторыми пакетами.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 29 2015, 14:25
|

Гуру
     
Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287

|
Цитата(Сергей Борщ @ Oct 29 2015, 15:53)  Тогда заведите бесконечно большой кольцевой буфер, пусть прерывание УСАПП складывает принятые данные в него, а процедура обработки вынимает из него и обрабатывает. Чем больше размер буфера, тем дольше можно задумываться над некоторыми пакетами. Не понимаю, как такое может быть. Если скорость обработки ниже, чем скорость заполнения буфера, то каким бы огромным он ни был, рано или поздно заполнится. Кроме, конечно, предельного случая - именно бесконечно большого буфера. Можно даже не кольцевого...
|
|
|
|
|
Oct 29 2015, 18:13
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Herz @ Oct 29 2015, 17:25)  Если скорость обработки ниже, чем скорость заполнения буфера, то каким бы огромным он ни был, рано или поздно заполнится. Разумеется. Поэтому я написал, что тормозить можно на некоторых пакетах. А абсолютную гарантию даст только бесконечно большой буфер.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 30 2015, 04:54
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Mikron @ Oct 29 2015, 15:53)  Вопрос, как выйти из этой ситуации? Есть какие-нибудь атомарные операции, чтобы данные не бились. Спасибо Самый простой способ выйти из ситуации - не заходить в нее (КО) В данном случае - протоколом обмена информацией должен быть предусмотрен тайм-аут между пакетами, достаточный для разбора одного пакета. Или на этапе ДО начала написания кода должно быть предусмотрено разрешение подобных коллизий - например, короткий ответ "Я занят". Если ничего это не сделано, то легко сделать "атомарную операцию, чтобы данные не бились" - запретить прерывания по интерфейсу на время разбора буфера. Рано или поздно операция закончится, прием начнется. Часть данных может быть утеряна, но Вы ведь знали про это, предусмотрели подтверждения в протоколе, правда?
--------------------
Уходя, оставьте свет...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|