freeRTOS + SPI + semafory

Michal Grunt michal.grunt na gmail.com
Úterý Duben 26 11:56:06 CEST 2016


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