freeRTOS + SPI + semafory

Michal Grunt michal.grunt na gmail.com
Čtvrtek Duben 28 00:05:44 CEST 2016


Abych to uzavřel tak už to maká. Ale byl to oříšek. No spíš takový
větší kokos :-). Ty funkce co jsem tu psal tak fungují. While je
nutné. Děkuji všem.

Dne 26. dubna 2016 16:12 Michal Grunt <michal.grunt na gmail.com> napsal(a):
> Tak je tam ještě nějaký průser. Pokud naplním SRAM, pak plnění
> zastavím a začnu data postupně číst a zpracovávat tak není problém.
> Ale jakmile v pozadí běží zápis a zpracovávají se data tak už to
> blbne. Už vidím jak to bude nějaká blbost až to najdu...
>
> Dne 26. dubna 2016 11:56 Michal Grunt <michal.grunt na gmail.com> napsal(a):
>> Tak jsem to předělal. Vymazal jsem původní funkce obsluhující semafory
>> (co byly pro SRAM a VS1053 zvlášť) a nahradil je tímto. U SRAM jsem
>> dva Handle neřešil a použil jsem funkci spi_semaphore_take/give(). Ale
>> ještě jsem to nezkoušel.
>>
>> Udělal jsem si knihovnu spi_semaphore.h resp. .c a ta se použije (ve
>> zkratce, aby to bylo názorné) v sram.c a vs1053.c.
>>
>> static xSemaphoreHandle xSemaphoreSpiMutex;
>>
>> př SPI inicializaci někde v main() - spi_semaphore_init():
>> void spi_semaphore_init(void) {
>>     xSemaphoreSpiMutex = xSemaphoreCreateMutex();
>> }
>>
>> na začátek funkce, která komunikuje s SPI - spi_semaphore_take():
>> uint8_t ICACHE_FLASH_ATTR spi_semaphore_take(void) {
>>     if(xSemaphoreTake(xSemaphoreSpiMutex, portMAX_DELAY)) return 1;
>>     return 0;
>> }
>>
>> na konec funkce - spi_semaphore_give():
>> void ICACHE_FLASH_ATTR spi_semaphore_give(void) {
>>     xSemaphoreGive(xSemaphoreSpiMutex);
>> }
>>
>> Bude to takto principielně fungovat? Musí být na začátku funkce, která
>> používá SPI příkaz while(spi_semaphore_take()); nebo jenom
>> spi_semaphore_take();? Protože někde je použito while a jinde ne...
>> Ještě doplním, že nic by se nemělo "ztrácet" nebo přeskakovat. Dodání
>> dat v tom pořadí jak přijdou z wifi do VS1053 (přes ten SRAM buffer)
>> je kritické. Jinak audio bude "bublat".
>>
>> Ještě se v této souvislosti zeptám, když mám v jiném vlákně třeba
>> webserver, který má svoje semafory nebude to ovlivňovat?
>>
>> Děkuji, MG
>>
>> Dne 26. dubna 2016 9:14 Michal Grunt <michal.grunt na gmail.com> napsal(a):
>>> Teď jsem si všiml, že u VS1053 je ještě u inicializace:
>>> if(!sSPI) vSemaphoreCreateBinary(sSPI);
>>>
>>> Dne 26. dubna 2016 9:12 Michal Grunt <michal.grunt na gmail.com> napsal(a):
>>>> Nyní to je nastavené takto.
>>>>
>>>> SRAM - inicializace ram:
>>>> vSemaphoreCreateBinary(semCanRead);
>>>> vSemaphoreCreateBinary(semCanWrite);
>>>> mux=xSemaphoreCreateMutex();
>>>>
>>>> čtení:
>>>> xSemaphoreTake(mux, portMAX_DELAY);
>>>> ...kód
>>>> xSemaphoreGive(mux);
>>>> xSemaphoreGive(semCanWrite);
>>>>
>>>> zápis:
>>>> xSemaphoreTake(mux, portMAX_DELAY);
>>>> ...kód
>>>> xSemaphoreGive(mux);
>>>> xSemaphoreGive(semCanRead);
>>>>
>>>>
>>>> VS1053
>>>> xSemaphoreHandle sSPI = NULL;
>>>>
>>>> na záčátku funkcích, které komunikují s SPI:
>>>> uint8_t ICACHE_FLASH_ATTR spi_take_semaphore() {
>>>> if(sSPI) if(xSemaphoreTake(sSPI, portMAX_DELAY)) return 1;
>>>> return 0;
>>>> }
>>>>
>>>> na konci:
>>>> void ICACHE_FLASH_ATTR spi_give_semaphore() {
>>>> if(sSPI) xSemaphoreGive(sSPI);
>>>> }
>>>>
>>>> Potřeboval bych to nějak skloubit dohromady...
>>>>
>>>> Děkuji, MG
>>>>
>>>> Dne 25. dubna 2016 19:45 Michal Grunt <michal.grunt na gmail.com> napsal(a):
>>>>> Je to ESP8266. Na jedné SPI sběrnici mám MP3 dekodér VS1053 a SRAM 23LC1024.
>>>>> A později bych tam chtěl pověsit i SD kartu. :-)
>>>>>
>>>>> Obojí najednou fungovat nemusí. Stačí aby jeden přístup zablokoval druhý a
>>>>> naopak. Takže když zapisují do paměti nemusím komunikovat s dekoderem. Ten
>>>>> počká až bude u konce práce s paměti (zapisuje se po malých blocích).
>>>>>
>>>>> Dne pondělí 25. dubna 2016 Martin Persich <persich na transcon.cz> napsal(a):
>>>>>
>>>>>> No, pravda, asi by to šlo vysvětlit tak i tak ... počkáme na vyjádření
>>>>>> autora ... :-)
>>>>>> Martin. persich na transcon.cz
>>>>>>
>>>>>> ----- Original Message ----- From: "Jaroslav Buchta"
>>>>>> <jaroslav.buchta na hascomp.cz>
>>>>>> To: "HW-news" <hw-list na list.hw.cz>
>>>>>> Sent: Monday, April 25, 2016 6:51 PM
>>>>>> Subject: Re: freeRTOS + SPI + semafory
>>>>>>
>>>>>>
>>>>>> Aha, ja pochopil, ze pouziva 2 periferie, asi jsem to pochopil spatne.
>>>>>>
>>>>>> Dne 25.04.2016 v 18:48 Martin Persich napsal(a):
>>>>>>>
>>>>>>> Přiznávám, dvě současně běžící komunikace na jedné SPI sběrnici si nějak
>>>>>>> neumím představit...
>>>>>>> Martin. persich na transcon.cz
>>>>>>>
>>>>>>> ----- Original Message ----- From: "Jaroslav Buchta"
>>>>>>> <jaroslav.buchta na hascomp.cz>
>>>>>>> To: "HW-news" <hw-list na list.hw.cz>
>>>>>>> Sent: Monday, April 25, 2016 6:23 PM
>>>>>>> Subject: Re: freeRTOS + SPI + semafory
>>>>>>>
>>>>>>>
>>>>>>> Probhlem nastane, pokud ta komunikace ma bezet zaroven ;-)
>>>>>>> Nevidim v tom problem, jen by me zajimalo, proc vubec vznika (jake jsou
>>>>>>> ty pouzite knihovny).
>>>>>>> Stejne to chce pri SPI pouzivat DMA a semafor se pak prirozene pouzije k
>>>>>>> cekani na dokonceni prenosu, na blokovani pri provadeni jednotlivych
>>>>>>> kratkych funkci bych pouzil kritickou sekci (v podstate omezeni nebo
>>>>>>> zakaz preruseni a prepinani tasku)
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> HW-list mailing list  -  sponsored by www.HW.cz
>>>>>>> Hw-list na list.hw.cz
>>>>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> HW-list mailing list  -  sponsored by www.HW.cz
>>>>>> Hw-list na list.hw.cz
>>>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> HW-list mailing list  -  sponsored by www.HW.cz
>>>>>> Hw-list na list.hw.cz
>>>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>>>>


Další informace o konferenci Hw-list