freeRTOS + SPI + semafory

Michal Grunt michal.grunt na gmail.com
Úterý Duben 26 16:12:10 CEST 2016


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