Отговори на тема  [ 41 мнения ]  Отиди на страница 1, 2, 3  Следваща
атомични операции, fifo 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1969
Мнение атомични операции, fifo
Имам едно fifo, което го пълня с данни от една нишка и го чета от друга. OS-a е nuttx, има posix threads и няма проблеми. Налага се да ползвам същото нещо на друго mcu, но там няма os - bare metal.
Въпросът е как да направя нещо подобно на mutex, без да имам os.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Пет Юли 20, 2018 1:41 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10368
Местоположение: Добрич
Мнение Re: атомични операции, fifo
Нещо не разбирам въпроса...
Значи от фифо до фифо има разлика, а пък мютекс е друга бира.
Ако фифо-то го ползваш да пъхаш от една "нишка" и вадиш от друга няма никакъв проблем. Това си е кръгов буфер с два указателя и тъй като всеки указател се променя само от една нишка нямаш конфликт. Това е 1:1 ситуация. Ако обаче искаш да имаш две или повече нишки от една и съща страна на фифото вече трябва да ги синхронизираш.
Предполагам затова и споменаваш мютекс, т.е. преди си имал повече от една нишка от дадена страна. Ако е така проблемът ти е смяна на контекста, а не атомичността. То пак е нужна атомичност, но само за да поддържаш информация кой ще кара влака. След това като стигнеш до зает ресурс някак си трябва да блокираш, т.е. да смениш контекста. Затова си трябва кърнелче някакво или помощ от хардуера...


Пет Юли 20, 2018 2:11 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1969
Мнение Re: атомични операции, fifo
Не намерих дали при arm записа в една клетка памет е атомична, т.е. имам volatile int32_t i и като напиша i = 32 ще се запише толкова без значение, че по време на записа може да дойде прекъсване. Ако обработката на прекъсването изчака края на присвояването, няма да има проблем със синхронизирането.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Пет Юли 20, 2018 2:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4715
Мнение Re: атомични операции, fifo
мутекс на баре метал - демек няма кой да бара контекса освен прекъсване... статик флаг във функията пробвай

_________________
main[-1u]={1};


Пет Юли 20, 2018 2:44 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Вто Окт 25, 2005 9:54 am
Мнения: 865
Мнение Re: атомични операции, fifo
syscop написа:
Не намерих дали при arm записа в една клетка памет е атомична, т.е. имам volatile int32_t i и като напиша i = 32 ще се запише толкова без значение, че по време на записа може да дойде прекъсване. Ако обработката на прекъсването изчака края на присвояването, няма да има проблем със синхронизирането.

Запис/четене е атомично стига да е не по голямо от разредността на процесора, но инкрементиране (четене-модифициране-запис) не е атомично и трябва да го защитиш.


Пет Юли 20, 2018 4:24 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 10:41 am
Мнения: 1664
Мнение Re: атомични операции, fifo
Ето как съм го реализирал някога:

Код:
bool rs_Buffer_RS_To_Eth(TRS* prs, TETH* peth)
{
  u16 size;
  u16 fragment1;
  u16 fragment2;
 
  TRS  rs;
  TETH eth;
 
  memcpy(&eth, peth, sizeof(TETH));
  if (eth.data_avail) { /*UART1_Write(0x31);*/ return true; }
 
  memcpy(&rs, prs, sizeof(TRS));
  if (rs.head == rs.tail) { /*UART1_Write(0x32);*/ return false; }
 
  if (rs.head > rs.tail)
    {
      fragment1 = rs.head - rs.tail;
      fragment2 = 0;
    }
  else
    {
      fragment1 = _RS_BUFF1_SIZE - rs.tail;
      fragment2 = rs.head;
    }
  size = fragment1 + fragment2;
  if ((size < (u16)8))
    if ((!TimeUp(_SYS_TIMEBASE_MS, rs.timeout, (u32)10))) { /*UART1_Write(0x33);*/ return false; }
 
  memcpy(eth.txbuff, rs.rxbuff + rs.tail, fragment1);
  if (fragment2)
    memcpy(eth.txbuff + fragment1, rs.rxbuff, fragment2);

  prs->tail = rs.head;
 
  eth.data_avail = true;
  eth.udp_data_avail = true;
  eth.size = size;
  memcpy(peth, &eth, sizeof(TETH));
 
  /*UART1_Write(0x34);*/ return true;
}


Съответно ето ги и структурите:

Код:
typedef struct TRS
{
  u16   head;
  u16   tail;
  u32   timeout;
  u8    rxbuff[_RS_BUFF1_SIZE];
} TRS;

typedef struct TETH
{
  u16   size;
  bool  data_avail;
  bool  udp_data_avail;
  u8    txbuff[_ETH_BUFF_SIZE];
} TETH;


Тук идеята е, както t_i_t_o каза, да се откопира указателя u16 head;, за това е и първи в структурата.
След това няма значение, дали нещо го е променило в оригиналната дестинация, както и дали буфера е допълнен с нови данни.
Те просто ще минат на следващата итерация.


Пет Юли 20, 2018 5:25 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1969
Мнение Re: атомични операции, fifo
t_i_t_o написа:
...Запис/четене е атомично стига да е не по голямо от разредността на процесора, но инкрементиране (четене-модифициране-запис) не е атомично и трябва да го защитиш.


Това е листинга от асемблера
Код:
    test_int = 32;
  22:   4b10            ldr     r3, [pc, #64]   ; (64 <main+0x64>)
  24:   2220            movs    r2, #32
  26:   601a            str     r2, [r3, #0]

Три инструкции са, т.е. според мен не е атомична операцията. Ше го мисля още...

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Пет Юли 20, 2018 5:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: атомични операции, fifo
самия запис е само последната инструкция.
така че няма как да не е атомик.

_________________
Най-опасният враг на истината и свободата е мнозинството.


Пет Юли 20, 2018 8:32 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1969
Мнение Re: атомични операции, fifo
То това ме притеснява. Кодът, който ползвам не е само мой, та не знам дали ако между 1,2 или 2,3 стане прекъсване, някой няма да е успял да омаже регистъра.
Ако бях като tgi нямаше въобще да повдигам въпроса :)

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Пет Юли 20, 2018 9:02 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Мар 13, 2006 12:59 pm
Мнения: 3855
Местоположение: Габрово
Мнение Re: атомични операции, fifo
Да сложиш ОС заради синхронизиране на едно FIFO 8O
Класическото решение е забрана на прекъсванията около зоната на възможен конфликт - ако ти е няколко инструкции изобщо не е проблем. ОС-аджиите му викат критична секция ("critical section").
Не опитвай с флаг, гарантирано не работи - освен ако не забраниш прекъсванията поне около проверката на флага и манипулацията му.
Но ако е само 32битова променлива няма нужда да се притесняваш.


Пет Юли 20, 2018 9:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1969
Мнение Re: атомични операции, fifo
OS-а не е заради fifo-то. Там имам малък проблем с драйвер, та реших да извадя съмнителните неща отделно, да ги тествам, без всички излишните щуротии на os-a и чак тогава да ги върна на място.
Една променлива е достатъчна да отбележа, дали да (не) се пипа някъде, така че ще пробвам да видя какво ще стане.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Пет Юли 20, 2018 9:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27995
Местоположение: София
Мнение Re: атомични операции, fifo
И защо флаг да не работи, в крайна сметка всички ОС свързани методи се свеждат до флаг ...въпросът е къде сетваш флага, кой може да го бута и кога буташ данните. Забрана на прекъсване е най-лесният метод, и аз бих го използвал но далеч не е най-правилния, в другата тема miro писа защо, не мога да не съм съгласен с него въпреки лично аз да нарушавам това правило, най-вече защото рядко да не кажа почти никога не не работя в екип с друг и нещата са малки.


Пет Юли 20, 2018 9:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 10:41 am
Мнения: 1664
Мнение Re: атомични операции, fifo
Код:
24:   2220            movs    r2, #32


Тук вместо #32, ще четеш по 4 байта от fifo-то. Щом са ти досатъчни, после можеш да си ги пишеш и побитово, където искаш. Прекъсване между 1-2 и 2-3 няма да навреди на тея 4 байта.


Пет Юли 20, 2018 10:16 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: атомични операции, fifo
аве, не изпадайте в заблуди и параноя.
Ако някое прекъсване омаже в този момент регистрите то имаш друг проблем - с възстановяването на конктекста. Но по скоро те гони параноя някаква. При 32 битово МЦУ записа на променлива в паметта е atomic. Както t_i_t_o по-горе каза проблем може да има ако става въпрос за read-modify-write.

_________________
Най-опасният враг на истината и свободата е мнозинството.


Пет Юли 20, 2018 10:45 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 1:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: атомични операции, fifo
Zdrav написа:
При 32 битово МЦУ записа на променлива в паметта е atomic

Само ако е подравнена.


Съб Юли 21, 2018 8:51 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 41 мнения ]  Отиди на страница 1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 7 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни