реклама на сайте
подробности

 
 
> FatFS под RTOS, Интересует опыт по "доработке" FatFS для работы в несколько по
Faradey
сообщение Mar 31 2009, 07:20
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638



Есть необходимость использования FatFS под FreeRTOS в несколько потоков с картой памяти.
Наиболее простым способом видиться "упаковка" используемого API FatFS в мютекс, аля:
Код
FRESULT RTOS_f_open(
    FIL *fp,            /* Pointer to the blank file object */
    const char *path,   /* Pointer to the file name */
    BYTE mode,           /* Access mode and file open mode flags */
    xSemaphoreHandle mutex   /* <--  Например так */
)
{
xSemaphoreGive( mutex );
FRESULT fr = f_open( &file, file_name, FA_OPEN_ALWAYS | FA_WRITE );
xSemaphoreTake( mutex, portMAX_DELAY );
return fr;
}

Прошу уже прошедших по этому пути поделиться опытом laughing.gif


--------------------
Завтра пойму, что нужно было сделать вчера...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Andy Mozzhevilov
сообщение Apr 9 2009, 15:09
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Взял 0.07
Для uCOS получилось примерно так:
CODE

#include "ucos_ii.h"

#define WAIT_OBJECT_0 TRUE

typedef OS_EVENT * HANDLE;

inline HANDLE CreateMutex(void *p1, BOOL b, void *p2)
{
HANDLE FatFS_Sem;

FatFS_Sem = OSSemCreate(1);
if (0 == FatFS_Sem)
{
while(1)
{
}
}
return (FatFS_Sem);
}

inline void CloseHandle(HANDLE pmutex)
{
INT8U err;
OSSemDel(pmutex, OS_DEL_ALWAYS, &err);
}

inline BOOL WaitForSingleObject(HANDLE pmutex, INT16U tout)
{
INT8U err;

OSSemPend(pmutex, tout / OS_TICKS_PER_SEC, &err);
if (OS_ERR_NONE == err)
{
return (TRUE);
}
return (FALSE);
}

inline void ReleaseMutex(HANDLE pmutex)
{
OSSemPost(pmutex);
}

Но, не знаю, насколько автор тестировал "re-entrancy for multitask operation", поскольку есть банальная синтаксическая ошибка в функции unlock_fs().
Но по коду бегло просмотрел, вроде как дополнительно низкоуровневые функции драйвера лочить не нужно, все должно разруливаться через введенные lock_fs() и unlock_fs().
Буду тестировать.
Если у кого вдруг появятся результаты, в том числе найдутся баги (мало ли, любой код не без этого), то интересно будет узнать.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016