我使用一个线程通过 FatFS 访问我的 SD 卡。正如你所说,它运作良好。我使用主线程来运行文件系统,因为它具有最大的堆栈(因为它必须运行 crt、C++ 静态 ctor 和其他东西)。main() 成为一个线程,启动运行应用程序的所有其他线程,然后运行一个文件系统循环来处理来自生产者-消费者队列的请求。
任何需要文件操作的线程都必须将“FSrequest”对象排队到 FS 线程。当请求出现在队列中时,FS 线程会按顺序处理它们。所有需要 FS 的线程都从 FSnotifiable 派生,它本身是从 FSrequest 派生的类,该类具有 FSnotify 方法,该方法将 FSrequest 作为参数。FS 线程从队列中弹出 FSrequest,按照“command”枚举成员的请求对其进行处理,加载带有 null 或错误字符串指针的“error”成员,然后以完成的 FSrequest 作为参数调用 FSnotify 方法。
通常, FSnotify() 发出信号量,原始线程正在等待该信号量。
编辑:这都是垃圾,因为这是交流问题:((
我会再尝试:
好的,所以没有类:( 声明一个“FSrequest”结构来表示一个 FS 请求/响应。它应该有一个枚举来表示所需的操作,以及一个“完成”回调函数来填充原始线程。它会也可能有一个缓冲区指针,(对于那些需要缓冲区来读取/写入,或保存错误消息失败的操作)和一个成功/失败布尔值。
使用从生产者-消费者队列结构/代码中弹出的一个线程来处理文件系统。如果一个线程想要进行 FS 操作,它需要声明一个 FS 请求,填写详细信息并将其排队到 FS 线程。它应该将完成回调指向一个发出信号量的函数。请求线程在信号量上等待来自 FS 线程的完成通知。FS 线程执行请求的任何操作,填写成功/失败/错误,然后调用完成回调。