Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

атомични операции, fifo
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=16039
Страница 1 от 3

Автор:  syscop [ Пет Юли 20, 2018 2:41 pm ]
Заглавие:  атомични операции, fifo

Имам едно fifo, което го пълня с данни от една нишка и го чета от друга. OS-a е nuttx, има posix threads и няма проблеми. Налага се да ползвам същото нещо на друго mcu, но там няма os - bare metal.
Въпросът е как да направя нещо подобно на mutex, без да имам os.

Автор:  miro_atc [ Пет Юли 20, 2018 3:11 pm ]
Заглавие:  Re: атомични операции, fifo

Нещо не разбирам въпроса...
Значи от фифо до фифо има разлика, а пък мютекс е друга бира.
Ако фифо-то го ползваш да пъхаш от една "нишка" и вадиш от друга няма никакъв проблем. Това си е кръгов буфер с два указателя и тъй като всеки указател се променя само от една нишка нямаш конфликт. Това е 1:1 ситуация. Ако обаче искаш да имаш две или повече нишки от една и съща страна на фифото вече трябва да ги синхронизираш.
Предполагам затова и споменаваш мютекс, т.е. преди си имал повече от една нишка от дадена страна. Ако е така проблемът ти е смяна на контекста, а не атомичността. То пак е нужна атомичност, но само за да поддържаш информация кой ще кара влака. След това като стигнеш до зает ресурс някак си трябва да блокираш, т.е. да смениш контекста. Затова си трябва кърнелче някакво или помощ от хардуера...

Автор:  syscop [ Пет Юли 20, 2018 3:21 pm ]
Заглавие:  Re: атомични операции, fifo

Не намерих дали при arm записа в една клетка памет е атомична, т.е. имам volatile int32_t i и като напиша i = 32 ще се запише толкова без значение, че по време на записа може да дойде прекъсване. Ако обработката на прекъсването изчака края на присвояването, няма да има проблем със синхронизирането.

Автор:  TheWizard [ Пет Юли 20, 2018 3:44 pm ]
Заглавие:  Re: атомични операции, fifo

мутекс на баре метал - демек няма кой да бара контекса освен прекъсване... статик флаг във функията пробвай

Автор:  t_i_t_o [ Пет Юли 20, 2018 5:24 pm ]
Заглавие:  Re: атомични операции, fifo

syscop написа:
Не намерих дали при arm записа в една клетка памет е атомична, т.е. имам volatile int32_t i и като напиша i = 32 ще се запише толкова без значение, че по време на записа може да дойде прекъсване. Ако обработката на прекъсването изчака края на присвояването, няма да има проблем със синхронизирането.

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

Автор:  relsys [ Пет Юли 20, 2018 6:25 pm ]
Заглавие:  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;, за това е и първи в структурата.
След това няма значение, дали нещо го е променило в оригиналната дестинация, както и дали буфера е допълнен с нови данни.
Те просто ще минат на следващата итерация.

Автор:  syscop [ Пет Юли 20, 2018 6:57 pm ]
Заглавие:  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]

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

Автор:  Zdrav [ Пет Юли 20, 2018 9:32 pm ]
Заглавие:  Re: атомични операции, fifo

самия запис е само последната инструкция.
така че няма как да не е атомик.

Автор:  syscop [ Пет Юли 20, 2018 10:02 pm ]
Заглавие:  Re: атомични операции, fifo

То това ме притеснява. Кодът, който ползвам не е само мой, та не знам дали ако между 1,2 или 2,3 стане прекъсване, някой няма да е успял да омаже регистъра.
Ако бях като tgi нямаше въобще да повдигам въпроса :)

Автор:  gicho [ Пет Юли 20, 2018 10:33 pm ]
Заглавие:  Re: атомични операции, fifo

Да сложиш ОС заради синхронизиране на едно FIFO 8O
Класическото решение е забрана на прекъсванията около зоната на възможен конфликт - ако ти е няколко инструкции изобщо не е проблем. ОС-аджиите му викат критична секция ("critical section").
Не опитвай с флаг, гарантирано не работи - освен ако не забраниш прекъсванията поне около проверката на флага и манипулацията му.
Но ако е само 32битова променлива няма нужда да се притесняваш.

Автор:  syscop [ Пет Юли 20, 2018 10:54 pm ]
Заглавие:  Re: атомични операции, fifo

OS-а не е заради fifo-то. Там имам малък проблем с драйвер, та реших да извадя съмнителните неща отделно, да ги тествам, без всички излишните щуротии на os-a и чак тогава да ги върна на място.
Една променлива е достатъчна да отбележа, дали да (не) се пипа някъде, така че ще пробвам да видя какво ще стане.

Автор:  ToHu [ Пет Юли 20, 2018 10:58 pm ]
Заглавие:  Re: атомични операции, fifo

И защо флаг да не работи, в крайна сметка всички ОС свързани методи се свеждат до флаг ...въпросът е къде сетваш флага, кой може да го бута и кога буташ данните. Забрана на прекъсване е най-лесният метод, и аз бих го използвал но далеч не е най-правилния, в другата тема miro писа защо, не мога да не съм съгласен с него въпреки лично аз да нарушавам това правило, най-вече защото рядко да не кажа почти никога не не работя в екип с друг и нещата са малки.

Автор:  relsys [ Пет Юли 20, 2018 11:16 pm ]
Заглавие:  Re: атомични операции, fifo

Код:
24:   2220            movs    r2, #32


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

Автор:  Zdrav [ Пет Юли 20, 2018 11:45 pm ]
Заглавие:  Re: атомични операции, fifo

аве, не изпадайте в заблуди и параноя.
Ако някое прекъсване омаже в този момент регистрите то имаш друг проблем - с възстановяването на конктекста. Но по скоро те гони параноя някаква. При 32 битово МЦУ записа на променлива в паметта е atomic. Както t_i_t_o по-горе каза проблем може да има ако става въпрос за read-modify-write.

Автор:  woody [ Съб Юли 21, 2018 9:51 am ]
Заглавие:  Re: атомични операции, fifo

Zdrav написа:
При 32 битово МЦУ записа на променлива в паметта е atomic

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

Страница 1 от 3 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/