реклама на сайте
подробности

 
 
> Interlocked Exchange, проблема с массивом данных
Mikron
сообщение Oct 29 2015, 12:53
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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;
        }

Но прерывание может возникнуть снова в тот момент, когда я еще не успел разобрать данные, соответственно они могут испортиться.
Вопрос, как выйти из этой ситуации? Есть ли какие-нибудь атомарные операции, чтобы данные не бились. Спасибо
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Mikron
сообщение Oct 29 2015, 13:23
Сообщение #2


Частый гость
**

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



а если я заполню второй массив раньше чем обработаю данные в первом? Отключать прерывния? тогда данные будут теряться.

Обрабатываю я вроде быстро, но туплю либо я либо мк) Хотелось бы вообще исключить даже теоретическую возможность побитых данных
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 29 2015, 13:53
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 07:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016