SD卡机械离扇区越远读写越慢吗读写,怎么连续在多个机械离扇区越远读写越慢吗写数据

同一文件在两处扇区找到,何解?
[问题点数:28分,结帖人dongond88]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:5981
2017年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本版专家分:0
本版专家分:24571
2014年5月 其他开发语言大版内专家分月排行榜第一2014年4月 其他开发语言大版内专家分月排行榜第一2014年3月 其他开发语言大版内专家分月排行榜第一2014年1月 其他开发语言大版内专家分月排行榜第一2013年12月 其他开发语言大版内专家分月排行榜第一2013年3月 Windows专区大版内专家分月排行榜第一2010年7月 其他开发语言大版内专家分月排行榜第一2010年3月 其他开发语言大版内专家分月排行榜第一2007年6月 其他开发语言大版内专家分月排行榜第一2007年5月 其他开发语言大版内专家分月排行榜第一2006年8月 其他开发语言大版内专家分月排行榜第一2006年5月 其他开发语言大版内专家分月排行榜第一2005年7月 其他开发语言大版内专家分月排行榜第一2003年4月 其他开发语言大版内专家分月排行榜第一
2016年3月 其他开发语言大版内专家分月排行榜第二2014年10月 其他开发语言大版内专家分月排行榜第二2013年7月 Windows专区大版内专家分月排行榜第二2013年5月 其他开发语言大版内专家分月排行榜第二2013年4月 其他开发语言大版内专家分月排行榜第二2012年11月 其他开发语言大版内专家分月排行榜第二2012年6月 其他开发语言大版内专家分月排行榜第二2011年11月 其他开发语言大版内专家分月排行榜第二2011年9月 其他开发语言大版内专家分月排行榜第二2010年6月 其他开发语言大版内专家分月排行榜第二2007年4月 其他开发语言大版内专家分月排行榜第二2006年12月 其他开发语言大版内专家分月排行榜第二2006年11月 其他开发语言大版内专家分月排行榜第二2005年6月 其他开发语言大版内专家分月排行榜第二2003年5月 其他开发语言大版内专家分月排行榜第二2003年3月 其他开发语言大版内专家分月排行榜第二
2013年11月 其他开发语言大版内专家分月排行榜第三2013年8月 其他开发语言大版内专家分月排行榜第三2012年12月 其他开发语言大版内专家分月排行榜第三2012年9月 其他开发语言大版内专家分月排行榜第三2012年8月 其他开发语言大版内专家分月排行榜第三2012年5月 其他开发语言大版内专家分月排行榜第三2011年12月 其他开发语言大版内专家分月排行榜第三2010年12月 其他开发语言大版内专家分月排行榜第三2010年9月 其他开发语言大版内专家分月排行榜第三
本版专家分:363
本版专家分:626
匿名用户不能发表回复!|
其他相关推荐Posts - 33,
Articles - 0,
Comments - 18
源碼之前了無秘密
15:34 by 至上, ... 阅读,
本文主要介绍从用户层读sd卡和写sd卡中间执行的过程。有对内核普遍性的介绍,和sd卡驱动个性的描述,强调把内核与驱动分开来看。同时提出内核需要驱动提供的参数,数据。
一 SD卡使用流程框图
说简单点:就是完成SD卡与内存之间的数据交互。但是涉及到了设备管理与文件管理。用户操作就是用户进程的read/write系统调用,应该说是 fread/fwrite,表示读某个文件,再不是读sd卡这个设备文件,也就是说你不需要在sd驱动中实现read/write函数,因为用不到啊。系 统调用后进入fat文件系统中的read/write,如果你问我为什么会进入fat中,因为sd卡上的文件组织使用的是fat32文件系统,并且在 mount的时候明确了是fat。这是与字符设备差异的地方。
VFS层&具体的文件系统层(fat32体现文件系统的差异)&cache层(这是内存的一部分,用于缓存磁盘文件,读文件的时候现在内存找,命中就不用再读了)&通用块设备层(制造bio,bio是一次请求的容器,包含了内存中为将要读取文件预留的空间(bio_vec),还有文件在磁盘上的扇区)&IO调度层(以前的磁盘文件随意访问影响速度,这是由硬件决定的,所以有了对请求的调度,如果2个磁盘文件在磁盘中的位置相近,就把请求调整到一起,现在的sd卡等就不需要了)&块设备驱动层(从请求队列中一个接着一个的取request,并且执行,使用dma搬运数据)
二 SD卡使用流程图
三 文件在内存中的缓存
从物理地址上讲,文件缓存是一直在内存中的(超级块信息缓存在内核数据区,节点位图,设备块位图保存在缓冲区(缓冲区是内核空间与用户空间中间的一部分内存),文件缓存在page cache中),不会因为进程切换而切换,就是说所有进程共享这部分内容。普通文件是共享的,可以操作,可执行文件是要拷贝到进程空间执行的。这样做的好处是不用每次都去外存中读取文件,提高了整体的性能。都是页操作的,不错页管理与页中的内容无关,缓冲区还是你按照块操作的,这个块是文件块的意思,一般是1K,大小与操作系统有关,块IO也就是这个意思。在用户空间,使用缺页机制,经常会按页操作,不会与块有关。就是说块机制用于与外存文件交互,页机制用于其他内存管理,当然了缓冲区也有页的概念,这就与线性地址寻址有关了。
四 准备SD卡,准备具体分析流程
&&& 准备一个SD卡,在其内放置一个文件test.txt,内容是:this is just a test!!!文件大小22字节,占空间4KB。这是在SD卡中占的空间,称之为一簇,但是大家知道,在内存中是不会占这么大的,可能比22字节大一点,保证字节对齐。从SD卡中取数据必须以扇区为单位,就是512字节,那么系统在执行的时候是读了一个扇区,还是8个扇区呢?因为后面根本没有数据。这个问题后面会解答。
&& 这个是test文件的信息,使用winhex工具时可以查看的,有创建时间,文件大小,所在簇号等信息。这些信息很重要,比如说当你在SD卡目录,cd打开一个目录,看到很多文件名,那么就代表这些文件在内存中或者cache中吗,显然不是,但是关于这些文件的信息比如在内存中,当你打开某一个文件时,会用到这些信息,使用文件大小确定读得扇区数,通过扇区号,确定文件在SD卡中的位置,这样才能找到文件。那么这些文件信息一开始就在内存中吗,是的,在mount的时候,就读进来了。或许只是部分,但是通过目录是可以找到的。在图片中最后的16 00 00 00 ,是文件大小22字节,前面一点是03 00,是表示文件在第三簇,然后推算到扇区号是=7536.怎么找到的就不说了,我的另外一篇博客中有写。
这副图就是在在7536号扇区中显示的,是文件的内容。这次的测试就是把这些内容读到内存中去。详细说明其过程。
从readpage函数开始分析,因为第一次肯定不在cache中,需要从sd卡中读。也是产生bio结构体的最直接的函数。表示一次磁盘连续IO操作的结构体为bio,bio在通用块层制造,构造好之后传递给IO调度层,进而传递给设备驱动来处理,磁盘操作最小的单位是扇区,所以bio要以起始扇区号和长度来描述一次IO操作。
当访问的sd卡中两个文件连续的 时候,两个bio会合成一个request,一般一个bio就是一次request,有时候一个request也包含多个bio。表示请求一次文件操作,不过,当文刚说到了内存中不连续的块,如果一次get_block分配到的几个块是连续的,就表示为一个段,所以bio_vec用来表示几个连续的文件块就是段了,当然了,如果文件大于4K,就会有多个页,就不是图中仅有的8个数据块了(页是4K,块大小与操作系统有关,感觉还是1K的多)。我还有个问题:如果两个块属于不同的物理页,但是物理地址上是连续的,可以组成一个段吗?貌似是不可以的。
const struct file_operations fat_file_operations = {&& &.llseek&& &&& &= generic_file_llseek,&& &.read&& &&& &= do_sync_read,&& &.write&& &&& &= do_sync_write,&& &.aio_read&& &= generic_file_aio_read,&& &.aio_write&& &= generic_file_aio_write,&& &.mmap&& &&& &= generic_file_mmap,&& &.release&& &= fat_file_release,&& &.ioctl&& &&& &= fat_generic_ioctl,&& &.fsync&& &&& &= file_fsync,&& &.splice_read&& &= generic_file_splice_read,};sys_read操作先调用do_sync_read,然后在do_sync_read中调用generic_file_aio_read。在generic_file_aio_read中先到缓存中去找,找到就直接拷贝文件到用户空间,找不到就要到磁盘上去运输,会调用read_page函数
/* Start the actual read. The read will unlock the page. */
error = mapping-&a_ops-&readpage(filp, page);
接着会.readpage = fat_readpage,就是直接调用fat_readpage函数。文件系统在操作设备的时候,有一个预读取的动作。一般我们需要的数据是通过预读取读进内存的,这个时候调用的就是fat_readpages操作函数。
static const struct address_space_operations fat_aops = {
.readpage = fat_readpage,
.readpages = fat_readpages,
.writepage = fat_writepage,
.writepages = fat_writepages,
.sync_page = block_sync_page,
.write_begin = fat_write_begin,
.write_end = fat_write_end,
.direct_IO = fat_direct_IO,
.bmap = _fat_bmap
static int fat_readpages(struct file *file, struct address_space *mapping,
struct list_head *pages, unsigned nr_pages)//注意他的最后一个参数fat_get_block是一个函数指针。他的作用是建立从文件块号到设备扇区号的映射。
printk("*****you are in fat_readpages*****\n");
return mpage_readpages(mapping, pages, nr_pages, fat_get_block);//由这个函数制造bio,这个函数属于通用块层
}先分析一下参数,file是fopen函数返回的一个结构体,address_space数据结构是用来描述一个文件在页高速缓存中的信息,每个文件可以有多个虚拟地址,但是只能在物理内存中有一份,意思就是多个进程共享该文件,所以address_space结构体与虚拟地址没有关系,只是描述文件存储本身,pages和nr_pages是文件使用的第一页信息和文件在内存中占了几页,这样一看这些页是连续的,从虚拟地址的角度看确实是的,但是在内存存储上,即使是一页,也不一定是连续的,比如说一页是4K,一个块是512Byte,那么一个页就由8个块组成,这8个块是可连续也可不连续的。如果每次都是这样分配,页高速缓存机制(内存中一部分)也不会给内存带来内存碎片,这样的组织方式还是可以接受的。结论就是,文件在内存中是以页为单位的,就是4K为单位的,而在sd卡中文件是以簇为单位的,簇的大小也是4K,扇区与块都是512Byte,这个巧合不能说明什么,因为Nand等其他块设备不一定是这样的。问题就来了,在sd卡中,以4K为单位存储文件没问题,但是内存有限,当一个22字节的文件在内存中占用4K空间的时候,你能接受吗?不过从文件统计来讲,大于4K的文件多还是小于4K的文件多呢,这也说不清楚,但是从回写的角度看,把一页内容直接回写到sd卡中,确实很方便,如果一页中还有其他内容,显然不方便操作。浪费一点就一点吧,毕竟页高速缓存是可以缩放的,并不严格规定大小,随着内存的使用而改变,在内存充足的情况下还是可以接受的。要制造一个bio,需要提供三个信息:/&缓冲块大小可以是1K,2K等小于页大于扇区,与操作系统有关,文件小与1K,只需要申请一个文件块,不要申请一个页,所以是块IO而不是页IO是有理由的&/
设备信息,关系到生成的bio结构体提交给谁,就是给那个设备,并不是说fat文件系统制造的就一定要给sd卡。/&文件路径决定了设备信息,文件的i节点就有设备信息&/
内存信息,如果是读sd卡,就要指定读到内存的那个地方,如果是写,就要说明数据来自内存的那个地方。/&fat_get_block&/
sd卡信息,如果是读,文件在sd卡的那个扇区,大小多少。如果是写,又要写在那个扇区,占多大空间。/*fat_readpages*/
只有提供了这些信息,才能完成一次传输。然后分析一下参数喽。
/kernel/fs/mpage.c
mpage_readpages(struct address_space *mapping, struct list_head *pages,
unsigned nr_pages, get_block_t get_block)
struct bio *bio = NULL;
unsigned page_
sector_t last_block_in_bio = 0;
struct buffer_head map_
unsigned long first_logical_block = 0;
map_bh.b_state = 0;
map_bh.b_size = 0;
for (page_idx = 0; page_idx & nr_ page_idx++) {
//是一页一页循环读取的,是按页操作的,每次读都是4K内容。如果是读22字节的文件,显然4K空间内只有一个扇区是有内容的,后面的填零就行了啊。省去不少读的时间,读空也是读啊。这个循环把每一页的地址信息都放到bio_vec中去,形成一个大的bio,并且通过get_block找到sd卡中想要操作的文件的扇区号和占用扇区个数。
struct page *page = list_entry(pages-&prev, struct page, lru);
prefetchw(&page-&flags);
list_del(&page-&lru);
if (!add_to_page_cache_lru(page, mapping,
page-&index, GFP_KERNEL)) {
bio = do_mpage_readpage(bio, page,
nr_pages - page_idx,7
&last_block_in_bio, &map_bh,
&first_logical_block,
get_block);
page_cache_release(page);
BUG_ON(!list_empty(pages));
mpage_bio_submit(READ, bio);
struct bio中的数据分析:
struct bio {
/* device address in 512 byte
sectors */
struct bio
/* request queue link */
struct block_device
unsigned long
/* status, command, etc */
unsigned long
/* bottom bits READ/WRITE,
* top bits priority
unsigned short
/* how many bio_vec's */
unsigned short
/* current index into bvl_vec */
/* Number of segments in this BIO after
* physical address coalescing is performed.
unsigned int
unsigned int
/* residual I/O count */
* To keep track of the max segment size, we account for the
* sizes of the first and last mergeable segments in this bio.
unsigned int
bi_seg_front_
unsigned int
bi_seg_back_
unsigned int
/* max bvl_vecs we can hold */
unsigned int
/* completion CPU */
/* pin count */
struct bio_vec
/* the actual vec list */
bio_end_io_t
#if defined(CONFIG_BLK_DEV_INTEGRITY)
struct bio_integrity_payload *bi_
/* data integrity */
bio_destructor_t
*bi_ /* destructor */
* We can inline a number of vecs at the end of the bio, to avoid
* double allocations for a small number of bio_vecs. This member
* MUST obviously be kept at the very end of the bio.
struct bio_vec
bi_inline_vecs[0];//多个内存片段数组(片段是几个连续块的集合(一个页内的块))
struct bio_vec {
struct page
unsigned int
unsigned int
/kernel/fs/mpage.c mapge_readpages make struct bio
------do_mpage_readpage------
blocks_per_page = 8 //内存中的文件块大小是512Bytes与扇区大小一致
you are into __make_request
mpage.c mapge_readpages make struct bio
------do_mpage_readpage------
blocks_per_page = 8
------do_mpage_readpage------
blocks_per_page = 8
------do_mpage_readpage------
blocks_per_page = 8
you are into __make_request
[sepmmc_request], into
[sepmmc_start_cmd], cmd:18
blksz=512, blocks=21
[sepmmc_dma_transfer], seg_num = 3
[sepmmc_dma_transfer], cur_seg=0, bus_addr=0x, seg_len=0x1000
[dma_read], bus_addr: 0x, blk_size: 0x1000
[sepmmc_command_done]
[dma_chan_for_sdio1_irq_handler], cur_seg=1, bus_addr=0x428d1000, seg_len=0x1000
[dma_read], bus_addr: 0x428d1000, blk_size: 0x1000
[dma_chan_for_sdio1_irq_handler], cur_seg=2, bus_addr=0x428e0000, seg_len=0xa00
[dma_read], bus_addr: 0x428e0000, blk_size: 0xa00
[sepmmc_data_transfer_over]
[sepmmc_start_cmd], cmd:12
[dma_chan_for_sdio1_irq_handler], up to the last segment
[sepmmc_command_done]
[sepmmc_request], exit这是把一个12KB的文件cp到UBI文件系统中,可以看书只拷贝了10.5KB大小,说明了文件不足10.KB。只发了一次命令,说明文件在sd卡中存储是连续的,同时在这个request中只有一个bio,这个bio中有三个bio_vec,各对应一个缓冲区片段,每个片段最大是4K,就是不能超过一页。奇怪的是这些页地址并不连续,好奇怪。
最重要的是文件块大小与扇区一样是512字节,因为blocks_per_page = 8,就是一页中有8个块。
上文提到文件小于512字节的在sd卡中也占一个簇4KB,但是在读得时候,只读一个扇区,因为其他扇区没有用内容。
[sepmmc_request], into
[sepmmc_start_cmd], cmd:18
blksz=512, blocks=256
[sepmmc_dma_transfer], seg_num = 13
[sepmmc_dma_transfer], cur_seg=0, bus_addr=0x, seg_len=0x2000
[dma_read], bus_addr: 0x, blk_size: 0x2000
[sepmmc_command_done]
[dma_chan_for_sdio1_irq_handler], cur_seg=1, bus_addr=0x, seg_len=0x3000
[dma_read], bus_addr: 0x, blk_size: 0x3000
[dma_chan_for_sdio1_irq_handler], cur_seg=2, bus_addr=0x, seg_len=0x1000
[dma_read], bus_addr: 0x, blk_size: 0x1000
[dma_chan_for_sdio1_irq_handler], cur_seg=3, bus_addr=0x441e8000, seg_len=0x3000
[dma_read], bus_addr: 0x441e8000, blk_size: 0x3000
[dma_chan_for_sdio1_irq_handler], cur_seg=4, bus_addr=0x441eb000, seg_len=0x1000
[dma_read], bus_addr: 0x441eb000, blk_size: 0x1000
[dma_chan_for_sdio1_irq_handler], cur_seg=5, bus_addr=0x, seg_len=0x3000
[dma_read], bus_addr: 0x, blk_size: 0x3000
[dma_chan_for_sdio1_irq_handler], cur_seg=6, bus_addr=0x, seg_len=0x3000
[dma_read], bus_addr: 0x, blk_size: 0x3000
[dma_chan_for_sdio1_irq_handler], cur_seg=7, bus_addr=0x, seg_len=0x2000
[dma_read], bus_addr: 0x, blk_size: 0x2000
[dma_chan_for_sdio1_irq_handler], cur_seg=8, bus_addr=0x, seg_len=0x3000
[dma_read], bus_addr: 0x, blk_size: 0x3000
[dma_chan_for_sdio1_irq_handler], cur_seg=9, bus_addr=0x, seg_len=0x3000
[dma_read], bus_addr: 0x, blk_size: 0x3000
[dma_chan_for_sdio1_irq_handler], cur_seg=10, bus_addr=0x, seg_len=0x2000
[dma_read], bus_addr: 0x, blk_size: 0x2000
[dma_chan_for_sdio1_irq_handler], cur_seg=11, bus_addr=0x441e0000, seg_len=0x3000
[dma_read], bus_addr: 0x441e0000, blk_size: 0x3000
[dma_chan_for_sdio1_irq_handler], cur_seg=12, bus_addr=0x441e3000, seg_len=0x3000
[dma_read], bus_addr: 0x441e3000, blk_size: 0x3000
[sepmmc_data_transfer_over]
[sepmmc_start_cmd], cmd:12在读取一个几M大的文件的时候,发一次命令只读取128K,可能与sd卡多块读上线有关,dma传输最大是12kB,一个片段(经过整合过的,通常一个片段最大是4KB,不会超过一页如果连续时可以整合的merge)
[sepmmc_request], into
[sepmmc_start_cmd], cmd:17
blksz=512, blocks=1
[sepmmc_dma_transfer], seg_num = 1
[sepmmc_dma_transfer], cur_seg=0, bus_addr=0x428ee000, seg_len=0x200
[dma_read], bus_addr: 0x428ee000, blk_size: 0x200
[sepmmc_command_done]
[sepmmc_data_transfer_over]
[sepmmc_request], exit
------do_mpage_readpage------
blocks_per_page = 8
------do_mpage_readpage------
blocks_per_page = 8
you are into __make_request
[sepmmc_request], into
[sepmmc_start_cmd], cmd:18
blksz=512, blocks=32
[sepmmc_dma_transfer], seg_num = 2
[sepmmc_dma_transfer], cur_seg=0, bus_addr=0x428e9000, seg_len=0x3000
[dma_read], bus_addr: 0x428e9000, blk_size: 0x3000
[sepmmc_command_done]
[dma_chan_for_sdio1_irq_handler], cur_seg=1, bus_addr=0x428ec000, seg_len=0x1000
[dma_read], bus_addr: 0x428ec000, blk_size: 0x1000
[sepmmc_data_transfer_over]
[sepmmc_start_cmd], cmd:12
[dma_chan_for_sdio1_irq_handler], up to the last segment
[sepmmc_command_done]
[sepmmc_request], exit
mpage.c mapge_readpages make struct bio
------do_mpage_readpage------
blocks_per_page = 8
------do_mpage_readpage------
blocks_per_page = 8
you are into __make_request
[sepmmc_request], into
[sepmmc_start_cmd], cmd:18
blksz=512, blocks=9
[sepmmc_dma_transfer], seg_num = 2
[sepmmc_dma_transfer], cur_seg=0, bus_addr=0x428f1000, seg_len=0x1000
[dma_read], bus_addr: 0x428f1000, blk_size: 0x1000
[sepmmc_command_done]
[dma_chan_for_sdio1_irq_handler], cur_seg=1, bus_addr=0x428f0000, seg_len=0x200
[dma_read], bus_addr: 0x428f0000, blk_size: 0x200
[dma_chan_for_sdio1_irq_handler], up to the last segment
[sepmmc_data_transfer_over]
[sepmmc_start_cmd], cmd:12
[sepmmc_command_done]
[sepmmc_request], exit这是一个文件在sd卡中存放的簇号不连续(修改过的文件都这样),在读取这个文件的时候,是两个request,发两次读命令。一般都是一个bio对应一个request,不过在请求队列里面对源地址(sd卡中的文件块号)相连的两个bio(就是两个request)合并为一个request,这就造成了一个request拥有多个bio,但是在dma传输的时候不需要区分是几个bio,直接拿bio_vec里面的信息生成目的地址信息(内存中的物理地址,及其长度),这个时候的bio_vec也是合并过的,你会发现,dma生成的片段大小会超过4K,也就是超过正常的一个bio_vec的大小,但是有会小于一个值(比如说12K),这是由于dma一次性可传输的块大小决定的,就是说dma搬运数据,没一次都有上限。问下SD卡的容量区分~SD卡读写都是以块为单位?一块等于多少扇区?一个扇区等于多少字节? 我自_百度知道
问下SD卡的容量区分~SD卡读写都是以块为单位?一块等于多少扇区?一个扇区等于多少字节? 我自
问下SD卡的容量区分~SD卡读写都是以块为单位?一块等于多少扇区?一个扇区等于多少字节?我自己理解的
一块等于8个扇区
一个扇区等于512字节
那么一块就等于512*8 字节
是否正确?
我有更好的答案
  你好啊,楼主说的完全正确啊,如果后期还有啥问题的话,可以直接私信小编的
采纳率:78%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。查看: 2608|回复: 6
用fatfs写数据到sd卡 一次只能写4096字节 也就是8个扇区(一个簇) 就写不进去了 不知道为什么
主题帖子精华
初级会员, 积分 119, 距离下一级还需 81 积分
在线时间2 小时
回复【5楼】正点原子:
---------------------------------
好了,原子哥。我用f_sync关闭,好了。用f_close关闭就不行
主题帖子精华
初级会员, 积分 119, 距离下一级还需 81 积分
在线时间2 小时
回复【5楼】正点原子:
---------------------------------
好了,原子哥。我用f_sync关闭,好了。用f_close关闭就不行
主题帖子精华
金钱129434
在线时间1161 小时
我也不知道,没遇到过。
参考下我们例程吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
初级会员, 积分 119, 距离下一级还需 81 积分
在线时间2 小时
回复【2楼】正点原子:
---------------------------------
用的&就是咱们的例程&我的板子是mini的&我把动态分配去了&因为我就用一个sd卡&不用flash&能读能写&就是写4096&&也就一个簇&就死机&感觉不能跳到下一个簇
主题帖子精华
金牌会员, 积分 1308, 距离下一级还需 1692 积分
在线时间93 小时
fatfs&一次写入512字节&会安全好多&写入4096要分多次写入
主题帖子精华
金钱129434
在线时间1161 小时
回复【3楼】wenwu1109:
---------------------------------
我们mini&V3.0?
不存在这个问题才是啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
初级会员, 积分 119, 距离下一级还需 81 积分
在线时间2 小时
回复【6楼】wenwu1109:
---------------------------------
是咱们的&mini板子
"原子哥”推荐 /1
资料包括正点原子开发板全套视频,源码,手册等。原子粉丝请关注公众号。
Powered by在电子工程世界为您找到如下关于“读写SD卡”的新闻
单片机读写SD卡最简单最基本的程序&
处理器:s3c44b0 (arm7)
SD卡与处理器的引脚连接:MISO --&SIORxD&& MOSI --&SIOTxD&& CLK --&SCLK&& CS --&PE5
包括四个文件:sd_drive.c :用户API函数,移植时...
我从一个月前刚放暑假开始弄单片机读写SD卡,八月初完成FAT16,已经可以写入TXT文件,并可在windows上读出。由于网上资料比较散,所以一开始走了不少弯路,现在写一篇总结,将我遇到的问题详细地列出来,希望能帮助和我一样的菜鸟们少走弯路。文中说到的一些问题对高手而言只是常识性的,还请包涵。
&&&&& 第一步:搭电路...
前一贴里利用的是SSP总线下进行扇区的读写,这一贴将在FAT文件系统下进行SD卡的读写。
&&&&&&& 本来想自己写个简单的FAT文件系统,但是,在前不就,本人写了个FAT在AVR ICC下能够正常的运行,到LPC2148中来时死活不运行,这让我对自己写FAT失去了信心。本身FAT就是个比较复杂的东东...
为了更加清楚的说明多扇区与单扇区读写的不同,单独开一贴进行详细的说明。
在FatFs文件系统时,发现为了提高SD卡的读写速度,需要一个多扇区读写的函数。当然很多人都会第一反应为,用循环调用单扇区读写函数不就能实现吗?如:
for (i=0; i & i++)
  单片机读写SD卡最简单最基本的程序
/&   21:14
  转载自 刀禁凯森
  最终编辑 zlulu2008
  处理器:s3c44b0 (arm7)
  SD卡与处理器的引脚连接:MISO --&SIORxD MOSI --&SIOTxD CLK --&SCLK CS --&gt...
& & 读写SD是嵌入式系统中一个比较基础的功能,在很多应用中都可以用得上SD卡。折腾了几天,总算移植成功了 最新版Fatfs(Fatfs R0.09) ,成功读写SD卡下文件。
& & FatFs (http://elm-chan.org/fsw/ff...
应用最广泛的一种存储卡。SD卡具有大容量、高性能、安全等多种特点的多功能存储卡,它比MMC卡多了一个进行数据著作权保护的暗号认证功能(SDMI规格),读写速度比MMC卡要快4倍。
好了,既然这么好,我们在这里给出51单片机读写2G SD卡程序:
#include &reg52.h&//程序通过调试
#include &stdio.h&gt...
读写SD卡资料下载
ARM处理器读写SD卡,而是使用了拥有1270个逻辑单元的MAXⅡ1270 CPLD来驱动SD卡,在CPLD中使用VHDL语言设计了SD卡的总线协议,外部总线接口,SRAM的读写时序等,这样既可以提高微处理器SD卡的读写速度,增强微处理器程序的移植性,又可以简化微处理器读写SD卡的步骤并减少微处理器的负担。 本论文的无线数据传输采用GSM无线通信技术的SMS业务远传现场数据,设计了GSM模块的软件硬件...
51读写SD卡
51读写SD卡...
控制器的速度做出判断,必要时暂停速度较快一方的操作。实际工作表明,该DMA控制器能够在基带芯片和SD卡控制器之间正确传输数据并使读写SD卡的速度达到210 kB/s。Abstract: &In the image coprocessor which used SD card as memory,there is a speed difference between baseband and...
51读写SD卡源码,51读写SD卡源码……...
51读写SD卡。...
S3C44B0读写SD卡程序,S3C44B0读写SD卡程序……...
用51单片机读写SD卡用51单片机读写SD卡...
Preferences
8.2 File存储
8.2.1 openFileOutput和open FileInput
8.2.2 读写SD卡上的文件
8.3 SQLite数据库
8.3.1 简介SQLiteDatabase
8.3.2 创建数据库和表
8.3.3 使用SQL语句操作SQLite数据库
8.3.4 使用sqlite3工具
8.3.5 使用特定方法...
AVR单片机读写SD卡技术...
ARM读写SD卡程序,可以读取sd卡中的文件...
读写SD卡相关帖子
本帖最后由 huo_hu 于
01:01 编辑
此内容由EEWORLD论坛网友huo_hu原创,如需转载或用于商业用途需征得作者同意并注明出处
现在文件系统弄好了,如果你想以更省资源更快的方式读写sd卡,得想办法绕开文件系统。原因有两个:
& && & 一个是文件系统的簇表组织形式不适合连续读写。文件系统的组织形式是一个...
有会mplab的吗,关于PIC24FJ256GB206读写sd卡的程序,网上没有找到教程,请问有会的吗,可以有偿,感谢 关于PIC24FJ256GB206读写sd卡的程序 可能的话,微芯官网上就有,不过应该不是PIC24系列的,是PIC32系列的,要移植下.
本帖最后由 mzb2012 于
11:57 编辑
pic32mx150128B SD 卡数据存储,之前做的留个邮箱...
还是驱动程序?因为这个现象是个个例,我倾向于SD卡的问题。希望有此类经验的网友给于点拨!
STM32F103 SDIO读写SD卡(SD卡剩余容量为0,实际里面的文件很少) 是文件系统的故障,问题出在文件分配表,删除文件时没有收回文件分配表空间,或者第二分配表没处理。
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid...
我测试过很多次了,你可以试试,我用的官方的fatfs源码在MSP432上跑的,上午还可以,下午就不行了,后来换到LM4F120上去读写SD卡,一点问题都没有!
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=2116580&ptid=511381][color=#999999]lcofjp 发表于
.eeworld.com.cn/thread--1.html
用过瑞萨芯片操作SD卡的同学指导一下 先把底层SPI读写SD卡驱动调通再说文件系统的事
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=2111916&ptid=510459][color=#999999]人民币的幻想 发表于
14:48[/color][/url...
数字音乐播放器设计的,但现在软件工作还缺很多。
  这个月里实验过了STM32F411的时钟配置、DMA、I2C、I2S、SDIO. 其中 SDIO 折腾得最久,拿出来和大家分享下。
SDIO这个模块主要是为了读写SD存储卡(也可以操作SDIO wifi卡之类的),ST从STM32F10x开始就已经支持SDIO/SDMMC了,因为是硬件专用模块,比用SPI方式读写SD卡效率要高很多,软件也大大简化。我曾经...
能够接收HDMI发送过来的数据,并且可以接收CVBS和VGA等视频信号。
  8) ARM外接DDR3存储芯片,方便ARM高速缓存数据。
  9) ARM外接NAND FLASH做起加载启动使用。
  10) ARM连接SD卡,能够读写SD卡数据。
  11) ARM外接USB接口,通过USB方便数据传输。
  12) ARM通过PCIE Switch连接两片DSP,通过PCIE接口方便...
刚刚开始学arm,希望用KEIL中提供的RL-FLASHFS编写一个读写SD卡的程序,
我是根据KEIL的帮助文档编写的,所用的单片机是LPC1343,sd卡用SPI通讯。
现在SD卡可以初始化,可以在SD卡中创建文件,但不能读写文件,百思不得解。
从调试结果来看,Retarget中调用的两个读写函数 __sys_write (fh, buf, len) 和
__sys_read (fh...
控制板系统主控芯片采用NXP公司的LPC1768FBD100,电路具有2路RS232串口,分别用来和迪文公司的7寸液晶屏通信、ZY-TP12串口微型打印机连接,实现显示和打印功能;1路RS485电路,实现和通用的电表通信;2路SPI接口电路,分别用来读写SD卡数据和读取用户射频卡;1个4*4薄膜按键矩阵键盘接口,实现人机交互;2路CAN通信接口电路,可以实现和后台的电池管理及远端数据通信;板载...
高手指点一下。
关于msp430驱动sd卡的问题 楼主有参考TI官方的读写SD卡的例程吗?&&官方程序,只需接口匹配一下就可以完美运行。
cc1989summer 发表于
楼主有参考TI官方的读写SD卡的例程吗?&&官方程序,只需接口匹配一下就可以完美运行。
找找有空发上来
网上都说,sd卡的一个扇区是512B,但我...
读写SD卡视频
你可能感兴趣的标签
热门资源推荐

我要回帖

更多关于 fat只能按扇区读写 的文章

 

随机推荐