搜索
bottom↓
回复: 171

FatFS文件系统详解

  [复制链接]

出0入0汤圆

发表于 2013-2-25 13:24:13 | 显示全部楼层 |阅读模式
前段时间移植了一个FATFS文件系统之后总是有人问我FATFS移植的问题,有时候很多问题都一样,只是有些人太浮躁,没有好好的把那不到1K的源文件给看一遍而已,今天整理文件,发现之前下载的一个很不错的介绍FATFS的文章,里面基本上把代码全部都注释了,奉献给大家。原文如下,地址已经找不到了,就不在附上了,感谢写这篇文章的人。

=====================我是分割线============================================
最近做的spi flash,本打算弄个文件系统,由于之前用过了JFFS、YAFFS和TrueFFS,代码量都相当的大,这次想找款代码量不那么吓人的,学习一下,听说配置会相对复杂一些。选来选去,最终选定了FatFS,代码量足够的小,最新的R0.09版本只有1个.c文件(当然,还有一个底层的要自己写,option文件夹里的无视),老点版本就更小了。而且更新很频繁,用户量也够大,就选定它了。尽管最后由于硬件和项目原因未能实际的移植它到vxWorks,但学过的还是要记录下。
    在这里http://elm-chan.org/fsw/ff/00index_e.html下载源码,只有800多K,小的可怜,还可以下载示例程序,有AVR、Win32、lpc等多平台已实现的方案。打开看src文件夹,一个option文件夹、00readme.txt、diskio.h、ff.c、ff.h、ffconf.h和interger.h。移植时需要修改的文件主要包括ffconf.h和interger.h,后者是在它的定义与目标平台上的有冲突,或者用的不习惯时修改的。
    在做具体修改之前,先大概阅读下FatFS的源代码,可以先读integer.h,了解所用的数据类型,然后是ff.h,了解文件系统所用的数据结构和各种函数声明,再就是diskio.h,了解与介质相关的数据结构和操作函数。ff.c这个文件相对较大,可以在最后将所实现的函数大致扫描一遍,之后根据用户应用层程序调用函数的次序仔细阅读相关代码。各个文件都可以直接用记事本打开查阅,非常方便。ff.h中的几个结构体十分重要,列举如下,首先是最基础的文件系统结构体:
  1. /* File system object structure (FATFS) */
  2. typedef struct {
  3.         BYTE        fs_type;                /* FAT子类型,一般在mount时用,置0表示未挂载*/
  4.         BYTE        drv;                        /* 物理驱动号,一般为0*/
  5.         BYTE        csize;                        /* 每个簇的扇区数目(1,2,4...128) */
  6.         BYTE        n_fats;                        /* 文件分配表的数目(1,2) */
  7.         /*FAT文件系统依次为:引导扇区、两个文件分配表、根目录区和数据区*/
  8.         BYTE        wflag;                        /* 标记文件是否被改动过,为1时要回写*/
  9.         BYTE        fsi_flag;                /* 标记文件系统信息是否被改动过,为1时要回写*/
  10.         WORD        id;                                /* 文件系统挂载ID */
  11.         WORD        n_rootdir;                /* 根目录区入口(目录项)的个数(用于FAT12/16)*/
  12. #if _MAX_SS != 512
  13.         WORD        ssize;                        /* 每扇区的字节数(用于扇区大于512Byte的flash) */
  14. #endif
  15. #if _FS_REENTRANT
  16.         _SYNC_t        sobj;                        /* 允许重入,即定义同步对象,用在tiny中*/
  17. #endif
  18. #if !_FS_READONLY
  19.         DWORD        last_clust;                /* 最后一个被分配的簇*/
  20.         DWORD        free_clust;                /* 空闲簇的个数*/
  21.         DWORD        fsi_sector;                /* 存放fsinfo的扇区(用于FAT32) */
  22. #endif
  23. #if _FS_RPATH
  24.         DWORD        cdir;                        /* 允许相对路径时用,存储当前目录起始簇(0:root)*/
  25. #endif
  26.         DWORD        n_fatent;                /* FAT入口数(簇的数目 + 2)*/
  27.         DWORD        fsize;                        /* 每个FAT所占扇区*/
  28.         DWORD        fatbase;                /* FAT起始扇区*/
  29.         DWORD        dirbase;                /* 根目录起始扇区(FAT32:Cluster#) */
  30.         DWORD        database;                /* 数据目录起始扇区*/
  31.         DWORD        winsect;                /* 当前缓冲区中存储的扇区号*/
  32.         BYTE        win[_MAX_SS];        /* 单个扇区缓存*/
  33. } FATFS;
复制代码
然后是与之相关的文件和文件夹结构体,附上具体注释:
  1. /* File object structure (FIL) */
  2. typedef struct {
  3.         FATFS*        fs;                                /* 所在的fs指针*/
  4.         WORD        id;                                /* 所在的fs挂载编号*/
  5.         BYTE        flag;                        /* 文件状态*/
  6.         BYTE        pad1;           /* 不知道含义,也未见程序使用*/
  7.         DWORD        fptr;                        /* 文件读写指针*/
  8.         DWORD        fsize;                        /* 大小*/
  9.         DWORD        sclust;                        /* 文件起始簇(fsize=0时为0) */
  10.         DWORD        clust;                        /* 当前簇*/
  11.         DWORD        dsect;                        /* 当前数据扇区*/
  12. #if !_FS_READONLY
  13.         DWORD        dir_sect;                /* 包含目录项的扇区 */
  14.         BYTE*        dir_ptr;                /* Ponter to the directory entry in the window */
  15. #endif
  16. #if _USE_FASTSEEK
  17.         DWORD*        cltbl;                        /*指向簇链接映射表的指针*/
  18. #endif
  19. #if _FS_SHARE
  20.         UINT        lockid;                        /* File lock ID (index of file semaphore table) */
  21. #endif
  22. #if !_FS_TINY
  23.         BYTE        buf[_MAX_SS];        /* File data read/write buffer */
  24. #endif
  25. } FIL;
复制代码
下面是目录的:
  1. /* Directory object structure (DIR) */
  2. typedef struct {
  3.         FATFS*        fs;                                /* 同上*/
  4.         WORD        id;
  5.         WORD        index;                        /* 当前读写索引号 */
  6.         DWORD        sclust;                        /* 文件数据区开始簇*/
  7.         DWORD        clust;                        /* 当前簇*/
  8.         DWORD        sect;                        /* 当前扇区*/
  9.         BYTE*        dir;                        /* 扇区缓存中当前SFN入口指针,SFN含义未知,猜测和LFN类似,与文件名相关*/
  10.         BYTE*        fn;                                /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */
  11. #if _USE_LFN
  12.         WCHAR*        lfn;                        /* Pointer to the LFN working buffer */
  13.         WORD        lfn_idx;                /* Last matched LFN index number (0xFFFF:No LFN) */
  14. #endif
  15. } DIR;
复制代码
其他类似f_mount、f_open等接口API就不细说了,在挂载的时候其实真正起作用的是chk_mounted函数,在这里才会将挂载分区的相关信息分配到FatFS结构体中;还有一个get_fat函数,也比较重要,在f_open和许多目录操作的函数中都有用到,而且FAT入口这个表达也十分晦涩,而它又调用了一个move_window的函数,也是十分晦涩难懂,可能是我英语太烂的缘故吧。实际上,move_window的作用是改变文件系统的当前工作扇区,如果要迁移到的是当前扇区,直接返回,如果不是,就将原扇区写回,若是FAT表,还要写进备份区。
    熟悉了代码结构后,现在开始作修改了,首先修改ffconf.h文件配置与硬件相关的文件系统特性,然后自己添加一套底层操作即可。先看ffconf.h,里面定义了很多宏,可以根据自己需要一一配置:
    先看功能配置:
_FS_TINY:文件系统为标准的还是微型的,默认为标准的(0);
_FS_READONLY:文件系统是否为只读,默认为可读写(0),若只读则f_write、f_sync、 f_unlink、f_mkdir、f_chmod、f_rename、f_truncate和f_getfree不可用;
_FS_MINIMIZE:裁剪文件系统的功能,默认为全部功能(0),若为1、2则会移除大部分链接、目录等功能;
_USE_STRFUNC:是否允许字符串操作,默认为不允许(0),这个看个人需求,一般情况下设置为1即可,如果工作在windows下,为保证文件兼容性(如换行符’\n’和回车符’\r’)建议将此项设置为2;
_USE_MKFS:是否允许使用f_mkfs函数,默认为0,用于创建文件夹,建议开启;
_USE_FORWARD:用于允许f_forward函数,只有开启tiny文件系统时才用到,该函数用于将读写的数据立即转存到数据流中,以节省RAM空间;
_USE_FASTSEEK:是否开启快速索引,默认为0,开启后,会使用FIL结构体中的cltbl元素来加快搜索;
_CODE_PAGE:指定目标系统使用的OEM代码页,默认为日语(932),改为936简体中文;OEM是什么意思呢?在OS编码中,unicode是一种双字节字符编码,无论中文还是英文,或者其他语言统一到2个字节,它与现有的任何编码(ASCII,GB等)都不兼容。WindowsNT(2000)的内核即使用该编码,所有数据进入内核前转换成UNICODE,退出内核后在转换成版本相关的编码(通常称为OEM,在简体中文版下即为GB);
_USE_LEN、_MAX_LEN、_LFN_UNICODE:这三个的意思不是很清楚,但是确定是与长文件名有关的,不建议开启,否则又要多加函数,麻烦;
_FS_RPATH:是否允许相对路径,让我选择就不开启,否则逻辑变得复杂不说,代码量也变多了一些;
    再看硬件相关配置:
_VOLUMES:磁盘(flash)逻辑卷数,默认为1,不建议修改;
_MAX_SS:扇区大小,默认512Byte,最大可设置4096Byte;
_MULTI_PARTITION:分区选项,默认为0,即一个分区,若想要多分区可自行设置;
_USE_ERASE:是否允许扇区擦除,默认为0,若开启则要在disk_ioctl函数中添加擦除命令代码;
    最后是文件系统配置:
_WORD_ACCESS:数据递进格式,默认为0,即以字节为单位递进,兼容性更强,若你的系统最新单位为字(2Byte),则可设为1;
_FS_REENTRANT、_FS_TIMEOUT、_SYNC_t:这三个选项与文件系统是否允许重入有关,所直白点,就是能否被多线程同时访问,像RTOS中,一般建议开启,_SYNC_t可定义为对应OS中的操作对象,windows下为HANDLE,uCos中为OS_EVENT,vxWorks中为SEMAPHORE。另外,开启后还需要添加ff_req_grant、ff_rel_grant和ff_del_syncobj三个函数,实际上实现的功能就是申请互斥量、释放互斥量和删除互斥量的意思,可以定义OS封装即可;
_FS_SHARE:和上面的类似,表示文件系统最大允许同时打开多少文件,默认为0,即只能打开一个。
    在配置这些选项的时候,可以根据定义阅读ff.c文件中的相关代码,基本上能对整体的结果有了了解,完成了ffconf.h后,再就是编写底层接口了,在新一点的FatFs中,并未提供函数接口模版,可以下老版的拷过来,也可以打开doc文件夹下的帮助文档00index_e.htm文件,里面有底层函数接口的格式及各个参数的描述。至于底层驱动,我只做过spi flash的,这个可以参考我上一篇文章。需要注意的是,底层读写函数中的参数sector指的是扇区的序号,需要自己换算成驱动接口中的字节位置。
    到这里,移植基本完成了,如果你的文件系统出现LD_WORD(ptr) (WORD)(*(WORD*)(BYTE*)(ptr))有问题(数据异常终止DATA ABORT exception之类的)的情况,请百度搜索“转一篇比较详细介绍FatFS文件系统移植的文章”就可以搞定了,那里有详细的解决办法。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-2-25 13:29:21 | 显示全部楼层
顶一下楼主!

出0入0汤圆

 楼主| 发表于 2013-2-25 14:30:28 | 显示全部楼层
James_King 发表于 2013-2-25 13:29
顶一下楼主!

谢谢。

出0入0汤圆

发表于 2013-2-25 15:50:30 | 显示全部楼层
不错。

出0入0汤圆

发表于 2013-2-26 03:17:07 | 显示全部楼层
關注一下~

出0入0汤圆

发表于 2013-2-26 10:29:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-3-27 16:54:32 | 显示全部楼层
好好研究一下,正需要这个。

出0入0汤圆

发表于 2013-3-27 17:09:19 | 显示全部楼层
原创帖,总结贴都要留名~

出0入0汤圆

发表于 2013-3-27 20:00:34 | 显示全部楼层
楼主,请问open函数返回FR_NOT_READY
The disk drive cannot work due to incorrect medium removal or disk_initialize() function failed.
是怎么回事呢?sd卡是好的,sdio的实验能成功,但是一上fatfs就失败了。前几次成功过,但是我把卡移到windows上格式化后就不行了

出0入0汤圆

发表于 2013-3-28 10:57:19 | 显示全部楼层
原创帖,总结贴都要留名~

出0入0汤圆

 楼主| 发表于 2013-3-30 16:15:15 | 显示全部楼层
705060359 发表于 2013-3-27 20:00
楼主,请问open函数返回FR_NOT_READY
The disk drive cannot work due to incorrect medium removal or dis ...

初始化是否正常呢?

出0入0汤圆

发表于 2013-4-6 19:26:17 | 显示全部楼层
Mark!学习下,多谢LZ。

出0入0汤圆

发表于 2013-4-6 20:33:03 来自手机 | 显示全部楼层
多谢楼主

出0入0汤圆

发表于 2013-4-6 21:13:33 | 显示全部楼层
学习了,顶一个

出0入17汤圆

发表于 2013-4-6 21:18:47 | 显示全部楼层
顶一个

出0入0汤圆

发表于 2013-6-10 09:54:37 | 显示全部楼层
学习了~

出0入0汤圆

发表于 2013-6-10 10:27:03 | 显示全部楼层
顶一下楼主,如可以的话,请把带注释的源码发一下上来!

出0入0汤圆

发表于 2013-6-10 10:48:00 | 显示全部楼层
学     习

出0入53汤圆

发表于 2013-6-13 09:18:02 | 显示全部楼层
LZ写的很好学习了

出0入0汤圆

发表于 2013-6-13 11:37:48 | 显示全部楼层
先MARK下

出0入0汤圆

发表于 2013-6-13 21:22:42 | 显示全部楼层
顶楼主,我目前也正在写一篇关于FATFS的剖析文章,楼主的文章很精彩!

出0入0汤圆

发表于 2013-6-14 10:18:25 | 显示全部楼层
学习了,顶楼主

出0入0汤圆

发表于 2013-6-14 10:34:28 | 显示全部楼层
hexiaolong2009 发表于 2013-6-13 21:22
顶楼主,我目前也正在写一篇关于FATFS的剖析文章,楼主的文章很精彩!

期待你的大作。。。

出0入0汤圆

发表于 2013-6-14 10:34:43 | 显示全部楼层
顶楼主,加收藏。。。

出0入0汤圆

 楼主| 发表于 2013-6-14 13:43:13 | 显示全部楼层
hexiaolong2009 发表于 2013-6-13 21:22
顶楼主,我目前也正在写一篇关于FATFS的剖析文章,楼主的文章很精彩!

期待你到时候共享~

出0入0汤圆

发表于 2013-6-14 15:04:46 | 显示全部楼层
学习了,很详细的解释

出0入0汤圆

发表于 2013-7-5 12:30:42 | 显示全部楼层
顶一个

出0入0汤圆

发表于 2013-7-18 13:05:28 | 显示全部楼层
这个强大了

出0入0汤圆

发表于 2013-7-18 18:40:42 | 显示全部楼层
必须给顶

出0入0汤圆

发表于 2013-7-19 01:30:48 | 显示全部楼层
mark
                        

出0入0汤圆

发表于 2013-7-19 09:17:31 | 显示全部楼层
学习了,谢谢楼主

出0入8汤圆

发表于 2013-7-19 09:34:17 | 显示全部楼层
讲得不错哦  ~~~

出0入0汤圆

发表于 2013-7-26 15:29:16 | 显示全部楼层
强帖留名,最近也在学习这个。

出0入0汤圆

发表于 2013-7-26 16:44:50 | 显示全部楼层
FatFS系统 MARK

出0入0汤圆

发表于 2013-7-29 11:44:30 | 显示全部楼层
顶楼主,下载试试!!

出0入0汤圆

发表于 2013-7-29 14:47:53 | 显示全部楼层
实际上看这个的信息量还是不如fatfs自带的帮助多,那个英文还是很简单的
也应该去看看主页的例程
至少我发现  sta 这个全局状态  网上的移植都没考虑这个,实际上这个状态是diskio直接相关的变量,很重要但是很多没考虑

出0入0汤圆

发表于 2013-7-29 19:49:37 | 显示全部楼层
恩,先收藏了,谢谢楼主了,呵呵

出0入0汤圆

发表于 2013-8-8 12:45:52 | 显示全部楼层
好文,记录一下,慢慢消化

出0入0汤圆

发表于 2013-8-14 10:23:27 | 显示全部楼层
保存

出0入0汤圆

发表于 2013-9-2 14:10:27 | 显示全部楼层
顶一下……

出0入8汤圆

发表于 2013-9-5 15:25:32 | 显示全部楼层
好贴,谢谢LZ分享经验

出0入0汤圆

发表于 2013-9-8 11:47:24 | 显示全部楼层

出0入0汤圆

发表于 2013-9-8 13:10:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-9-8 13:32:41 | 显示全部楼层
讲的不错啊!~                  

出0入0汤圆

发表于 2013-9-8 17:23:04 | 显示全部楼层
mark~~~~~~~~~

出0入0汤圆

发表于 2013-9-8 17:28:42 | 显示全部楼层
谢谢!
保存一下

出0入0汤圆

发表于 2013-9-9 07:35:23 | 显示全部楼层
顶一下楼主

出0入0汤圆

发表于 2013-9-15 17:49:09 | 显示全部楼层
mark、、、、

出0入0汤圆

发表于 2013-9-15 18:52:44 | 显示全部楼层
mark        

出0入0汤圆

发表于 2013-10-1 11:51:52 | 显示全部楼层
Mark....

出0入0汤圆

发表于 2013-10-3 15:50:03 | 显示全部楼层
标记一下。

出0入0汤圆

发表于 2013-10-13 08:39:00 | 显示全部楼层
已经找了好久了,今天忽然间看到了,很有用啊,感谢

出0入0汤圆

发表于 2013-10-24 18:01:43 | 显示全部楼层
FatFs 真实地学习了一天,云里雾里转。这篇文档,真是帮了自己大忙了,谢谢楼主!

出0入0汤圆

发表于 2013-10-25 09:06:31 | 显示全部楼层
谢谢,收藏了

出0入0汤圆

发表于 2013-10-30 22:31:31 | 显示全部楼层
真是好贴!!

出0入0汤圆

发表于 2013-11-6 09:00:07 | 显示全部楼层
mark                        

出0入0汤圆

发表于 2013-11-13 10:17:13 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2013-11-13 14:42:36 | 显示全部楼层
thanks a lot

出0入0汤圆

发表于 2013-11-20 20:57:08 | 显示全部楼层
不错 ! 不错                                                        

出0入0汤圆

发表于 2013-11-21 08:26:25 | 显示全部楼层
感谢楼主分享,先收藏一下

出0入0汤圆

发表于 2013-11-21 08:47:11 | 显示全部楼层
先做一个标记

出0入0汤圆

发表于 2013-11-22 16:09:40 | 显示全部楼层
謝~分享囉

出0入0汤圆

发表于 2013-11-28 08:57:39 | 显示全部楼层
已关注

出0入0汤圆

发表于 2013-11-28 10:36:14 | 显示全部楼层
Mark         

出0入0汤圆

发表于 2013-12-15 12:43:13 | 显示全部楼层
mark。。。。。

出0入0汤圆

发表于 2013-12-15 15:23:49 来自手机 | 显示全部楼层
good 谢谢分享

出0入0汤圆

发表于 2013-12-15 16:22:37 | 显示全部楼层
帮楼主顶上去。

出0入0汤圆

发表于 2013-12-15 17:04:53 | 显示全部楼层
学习~学习~

出0入0汤圆

发表于 2013-12-15 17:24:14 | 显示全部楼层
不顶不舒服斯基

出0入0汤圆

发表于 2013-12-16 14:31:53 | 显示全部楼层
yi ding  yao ding a ,wo de xia yi ge mu biao

出0入0汤圆

发表于 2013-12-16 16:34:59 | 显示全部楼层
这个很给力,太有参考价值了,不用瞎摸FATS了

出0入0汤圆

发表于 2013-12-17 09:19:48 来自手机 | 显示全部楼层
mark!!!!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2013-12-17 19:33:17 | 显示全部楼层
学习一下!

出0入0汤圆

发表于 2013-12-18 10:11:48 来自手机 | 显示全部楼层
支持一下一下

出0入0汤圆

发表于 2013-12-19 12:11:58 | 显示全部楼层
文件系统挺好用的

出0入0汤圆

发表于 2013-12-19 14:40:47 | 显示全部楼层
mark一下, 如果有例程就更好了

出0入0汤圆

发表于 2013-12-26 11:55:38 | 显示全部楼层
下载来研究下,谢谢楼主哇

出0入0汤圆

发表于 2013-12-27 13:25:18 | 显示全部楼层
学习了,这个要顶

出0入0汤圆

发表于 2014-1-2 14:12:47 | 显示全部楼层
学学------

出0入0汤圆

发表于 2014-1-2 14:30:03 | 显示全部楼层
下载收藏一下了

出0入0汤圆

发表于 2014-1-5 12:32:14 | 显示全部楼层
感谢分享,顶。

出0入0汤圆

发表于 2014-1-7 09:37:38 | 显示全部楼层
谢谢分享 ~~~

出0入0汤圆

发表于 2014-1-10 17:03:18 | 显示全部楼层
谢了楼主!!!

出0入0汤圆

发表于 2014-1-10 23:53:25 | 显示全部楼层
顶一下楼主

出0入0汤圆

发表于 2014-1-13 12:00:21 | 显示全部楼层
顶,感谢楼主

出0入0汤圆

发表于 2014-2-27 12:18:37 | 显示全部楼层
仔细看看,顶了。

出0入0汤圆

发表于 2014-2-27 12:50:34 | 显示全部楼层
Mark一下,好东西!

出0入0汤圆

发表于 2014-2-27 13:19:08 来自手机 | 显示全部楼层
顶楼主!!!!!!!!!!!!

出0入0汤圆

发表于 2014-2-27 16:54:08 | 显示全部楼层
牛,言简意赅。支持楼主

出0入0汤圆

发表于 2014-3-13 16:11:49 | 显示全部楼层
705060359 发表于 2013-3-27 20:00
楼主,请问open函数返回FR_NOT_READY
The disk drive cannot work due to incorrect medium removal or dis ...

感觉你的初始化不对,你查一下
stat = disk_initialize(fs->drv);        /* Initialize low level disk I/O layer */
if (stat & STA_NOINIT)                                /* Check if the initialization succeeded */
  return FR_NOT_READY;

出0入42汤圆

发表于 2014-3-23 10:25:50 | 显示全部楼层
现在在做U盘的读写,用的fatfs 可以参考一下本帖,顶。

出0入0汤圆

发表于 2014-3-23 13:19:54 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2014-4-9 16:48:51 | 显示全部楼层
Mark一个~~~另外楼主头像好熟悉啊^_^

出0入0汤圆

发表于 2014-4-9 16:49:18 | 显示全部楼层
Mark一个~~~另外楼主头像好熟悉啊

出0入0汤圆

发表于 2014-4-9 21:03:16 | 显示全部楼层
不错,顶一下楼主

出0入0汤圆

发表于 2014-4-15 16:27:35 | 显示全部楼层
顶一下,mark

出0入0汤圆

发表于 2014-4-15 22:13:21 | 显示全部楼层
谢谢了,好认真

出0入0汤圆

发表于 2014-4-28 09:46:30 | 显示全部楼层
学习      

出0入0汤圆

发表于 2014-4-28 23:34:56 | 显示全部楼层
学习,一般人只会open,close什么的

出0入0汤圆

发表于 2014-4-29 08:05:00 | 显示全部楼层
谢谢楼主分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 03:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表