1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
29
30
31
32
33
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
54
55
59
60
63
64
68
69
72
73
74
75
76
77
78
79
83
84
85
86
87
88
89
92
93
98
99
104
105
108
109
114
115
116
117
118
119
120
121
124
125
126
127
128
129
130
132
133
135
136
140
141
143
144
146
147
148
149
150
151
152
153
156
157
158
159
160
161
162
164
165
167
168
173
174
176
177
179
180
181
182
183
184
185
186
187
189
190
191
192
193
194
195
197
198
200
201
203
204
206
207
209
210
211
212
#include <string.h>
#include <stdlib.h>
#include "ff.h"
#include "sdkconfig.h"
#ifdef CONFIG_FATFS_ALLOC_PREFER_EXTRAM
#include "esp_heap_caps.h"
#endif
void* ff_memalloc (
unsigned msize
)
{
#ifdef CONFIG_FATFS_ALLOC_PREFER_EXTRAM
return heap_caps_malloc_prefer(msize, 2, MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM,
MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL);/* ... */
#else
return malloc(msize);
#endif
}{ ... }
void ff_memfree (
void* mblock
)
{
free(mblock);
}{ ... }
#if FF_FS_REENTRANT
#define OS_TYPE 3
#if OS_TYPE == 0
#include <windows.h>
static HANDLE Mutex[FF_VOLUMES + 1];
/* ... */
#elif OS_TYPE == 1
#include "itron.h"
#include "kernel.h"
static mtxid Mutex[FF_VOLUMES + 1];
/* ... */
#elif OS_TYPE == 2
#include "includes.h"
static OS_EVENT *Mutex[FF_VOLUMES + 1];
/* ... */
#elif OS_TYPE == 3
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
static SemaphoreHandle_t Mutex[FF_VOLUMES + 1];
/* ... */
#elif OS_TYPE == 4
#include "cmsis_os.h"
static osMutexId Mutex[FF_VOLUMES + 1];
/* ... */
#endif
/* ... */
int ff_mutex_create (
int vol
)
{
#if OS_TYPE == 0
Mutex[vol] = CreateMutex(NULL, FALSE, NULL);
return (int)(Mutex[vol] != INVALID_HANDLE_VALUE);
/* ... */
#elif OS_TYPE == 1
T_CMTX cmtx = {TA_TPRI,1};
Mutex[vol] = acre_mtx(&cmtx);
return (int)(Mutex[vol] > 0);
/* ... */
#elif OS_TYPE == 2
OS_ERR err;
Mutex[vol] = OSMutexCreate(0, &err);
return (int)(err == OS_NO_ERR);
/* ... */
#elif OS_TYPE == 3
Mutex[vol] = xSemaphoreCreateMutex();
return (int)(Mutex[vol] != NULL);
/* ... */
#elif OS_TYPE == 4
osMutexDef(cmsis_os_mutex);
Mutex[vol] = osMutexCreate(osMutex(cmsis_os_mutex));
return (int)(Mutex[vol] != NULL);
/* ... */
#endif
}{ ... }
/* ... */
void ff_mutex_delete (
int vol
)
{
#if OS_TYPE == 0
CloseHandle(Mutex[vol]);
/* ... */
#elif OS_TYPE == 1
del_mtx(Mutex[vol]);
/* ... */
#elif OS_TYPE == 2
OS_ERR err;
OSMutexDel(Mutex[vol], OS_DEL_ALWAYS, &err);
/* ... */
#elif OS_TYPE == 3
vSemaphoreDelete(Mutex[vol]);
/* ... */
#elif OS_TYPE == 4
osMutexDelete(Mutex[vol]);
/* ... */
#endif
}{ ... }
/* ... */
int ff_mutex_take (
int vol
)
{
#if OS_TYPE == 0
return (int)(WaitForSingleObject(Mutex[vol], FF_FS_TIMEOUT) == WAIT_OBJECT_0);
/* ... */
#elif OS_TYPE == 1
return (int)(tloc_mtx(Mutex[vol], FF_FS_TIMEOUT) == E_OK);
/* ... */
#elif OS_TYPE == 2
OS_ERR err;
OSMutexPend(Mutex[vol], FF_FS_TIMEOUT, &err));
return (int)(err == OS_NO_ERR);
/* ... */
#elif OS_TYPE == 3
return (int)(xSemaphoreTake(Mutex[vol], FF_FS_TIMEOUT) == pdTRUE);
/* ... */
#elif OS_TYPE == 4
return (int)(osMutexWait(Mutex[vol], FF_FS_TIMEOUT) == osOK);
/* ... */
#endif
}{ ... }
/* ... */
void ff_mutex_give (
int vol
)
{
#if OS_TYPE == 0
ReleaseMutex(Mutex[vol]);
/* ... */
#elif OS_TYPE == 1
unl_mtx(Mutex[vol]);
/* ... */
#elif OS_TYPE == 2
OSMutexPost(Mutex[vol]);
/* ... */
#elif OS_TYPE == 3
xSemaphoreGive(Mutex[vol]);
/* ... */
#elif OS_TYPE == 4
osMutexRelease(Mutex[vol]);
/* ... */
#endif
}{ ... }
/* ... */#endif