这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 请教各位大侠,nand的TFFS和ftp上传超过20k时发生错误的问题

共4条 1/1 1 跳转至

请教各位大侠,nand的TFFS和ftp上传超过20k时发生错误的问题

菜鸟
2007-06-28 06:28:37     打赏

目前nandflash可以格式话,可以加载,但在用ftp上传文件时出现问题,上传小于20k的文件没有问题,但上传大一点的文件就会出现异常:异常如下
Data abort
Exception address: 0x300a1964
Current Processor Status Register: 0x20000013
Task: 0x33df7c8c "tFtpdServ1"
trcStack aborted: error in top frame
由于问题一直存在所以我更换了ftpdlib.c,ftplib.c ,则list目录的问题解决了,但异常还是出现!
我的开发环境是5.5,芯片是2410,nandflash是k9f1208 定义的是norflash的ftlsystffs.c和tffsconfig.c都用的是norflash的,写了read函数
请问这会是哪里出现的问题呢?
考虑如下:
1.有时后会出现
0x33dfce20 (tDcacheUpd): disk cache error: device 33ffc08c block 249 errno c0006, disk removed while writing data, possible data loss ,此情况只出现过一两次
问:是cache的原因吗?
2.有是会出现
Exception number 16: Task: 0x33e22b58 (tFtpdServ1)
Data abort
Program Counter: 0x3009ce38
Status Register: 0x20000013
0 : logical2Physical ()
此函数是在ftllite.c中定义如下
/*----------------------------------------------------------------------*/
/* l o g i c a l 2 P h y s i c a l */
/* */
/* Returns the physical address of a logical sector no. */
/* */
/* Parameters: */
/* vol : Pointer identifying drive */
/* address : logical sector no. */
/* */
/* Returns: */
/* CardAddress : physical address of sector */
/*----------------------------------------------------------------------*/

static CardAddress logical2Physical(Flare vol, LogicalSectorNo address)
{
return physicalBase(&vol,vol.logicalUnits[address >> (vol.unitSizeBits - SECTOR_SIZE_BITS)]) |
(((CardAddress) address << SECTOR_SIZE_BITS) & vol.unitOffsetMask);
}

问题如下:
1:有可能是ftpsever的问题,如果是:请问可能是哪些方面的?
2:TFFS驱动的问题,有时候会提示到findFreeSector这个函数有问题
3:还是要用nandflash的翻译层?但用上就只能辨识到,调用不到其他函数




关键词: 请教     各位     大侠     上传     超过     发生     错误     问题    

菜鸟
2007-06-28 23:09:00     打赏
2楼

谢谢yaopg大侠的回答:

①芯片是 三星 arm9 2410 nandflash 为 k9f1208 对应bank1(0X08000000--0X10000000)

#define NFLASH_BASE_ADRS (0x08000000)
#define NFLASH_SIZE (0x04000000)

mmu定义如下:

{
(void *) (0x08000000),
(void *) (0x08000000),
ROUND_UP (0x04000000, PAGE_SIZE),
VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
},

但在romInit.s没有对bank1进行初始化,只对bank0进行了初始话,但我觉得不会是这里的问题,因为格式化和加载都没有问题。

②read函数的输出为:

READ: address = 0x0, length = 0x44

READ: address = 0x10000, length = 0x44 /*不明白length为什么是0x44 ?*/

READ: address = 0x20000, length = 0x44

一直读到

READ: address = 0x3ff0000, length = 0x44

结束(共计64m,每隔64kb读一次,共计1024次)

Erase函数的输出为:

firstBlock = 0x0, numOfBlock = 0x4

ERASE: blockNo = 0x0

ERASE: blockNo = 0x1

ERASE: blockNo = 0x2

ERASE: blockNo = 0x3

WRITE: address = 0x0, length = 0x4c, mode = 0

WRITE: address = 0x14, length = 0x2, mode = 1/*这里调用了Write函数 但不明白红色参数的意思*/

不至于数据扇区只写了这么点长度的数据吧?
先总结到次,在调试调试!请大侠帮忙解决这个问题。


菜鸟
2007-07-01 18:42:00     打赏
3楼

根据yaopg大侠的提示,去掉了mmu的多余的关于nandflash的映射,确实nandflash不对应任何bank,通过2410的nand接口来控制,只需定义NAND FLASH芯片寄存器的区间。

上传60.4kb文件时串口输出如下:

READ: address = 0x80400, length = 0x200.............................................READ: address = 0x8f200, length = 0x200

间隔512byte读一次,也就是1个page,共计59.5kb,之后读到下面的奇怪地址

READ: address = 0x600, length = 0x200
READ: address = 0x8f400, length = 0x200
READ: address = 0x800, length = 0x200
READ: address = 0x9fa00, length = 0x200
READ: address = 0xb0000, length = 0x244 length是580 Byte,超过一个page ,这个长度是不是有问题?
WRITE: address = 0xb004c, length = 0x4, mode = 0
WRITE: address = 0xb0400, length = 0x200, mode = 0
READ: address = 0x804, length = 0x4
READ: address = 0xc0000, length = 0x244
WRITE: address = 0xc004c, length = 0x4, mode = 0
WRITE: address = 0xc004c, length = 0x4, mode = 1
WRITE: address = 0xc0404, length = 0x4, mode = 0
WRITE: address = 0x804, length = 0x4, mode = 1
WRITE: address = 0x90238, length = 0x4, mode = 1
READ: address = 0x80600, length = 0x200
READ: address = 0x80600, length = 0x200
READ: address = 0xd0000, length = 0x244
WRITE: address = 0xd004c, length = 0x4, mode = 0
WRITE: address = 0xd0400, length = 0x200, mode = 0
WRITE: address = 0xd004c, length = 0x4, mode = 1
WRITE: address = 0x80050, length = 0x4, mode = 1
READ: address = 0x600, length = 0x200
READ: address = 0x8fe00, length = 0x200
READ: address = 0xe0000, length = 0x244
WRITE: address = 0xe004c, length = 0x4, mode = 0
WRITE: address = 0xe0400, length = 0x200, mode = 0
READ: address = 0x614, length = 0x4
READ: address = 0x800, length = 0x200
READ: address = 0xc0400, length = 0x200
WRITE: address = 0xc0400, length = 0x200, mode = 1
WRITE: address = 0x54, length = 0x4, mode = 1
WRITE: address = 0xc004c, length = 0x4, mode = 1
READ: address = 0xf0000, length = 0x244
WRITE: address = 0xf004c, length = 0x4, mode = 0
WRITE: address = 0xf004c, length = 0x4, mode = 1
WRITE: address = 0xf0414, length = 0x4, mode = 0
WRITE: address = 0x614, length = 0x4, mode = 1
WRITE: address = 0x80240, length = 0x4, mode = 1
READ: address = 0xc0400, length = 0x200
READ: address = 0xb0400, length = 0x200
READ: address = 0x777700a4, length = 0x4 这里的地址更加奇怪,这个地址不存在呀?
0x33e74ae0 (tFtpdServ1): disk cache error: device 33e9ff60 block 249 errno c0006, disk removed while writing data, possible data loss
0x33e74ae0 (tFtpdServ1): disk cache error: device 33e9ff60 block 264 errno c0006, disk removed while writing data, possible data loss


菜鸟
2007-07-01 19:42:00     打赏
4楼

接上面

READ: address = 0x80400, length = 0x200
READ: address = 0xd0400, length = 0x200
READ: address = 0x80800, length = 0x200

READ: address = 0x82e00, length = 0x200
READ: address = 0x80400, length = 0x200
READ: address = 0xd0400, length = 0x200
READ: address = 0x80800, length = 0x200

READ: address = 0x8f200, length = 0x200
READ: address = 0x600, length = 0x200
READ: address = 0xf0400, length = 0x200
READ: address = 0xe0400, length = 0x200
READ: address = 0xe0000, length = 0x200
READ: address = 0x3dd2600, length = 0x200
READ: address = 0xc0400, length = 0x200
READ: address = 0xb0400, length = 0x200
READ: address = 0x33320000, length = 0x200 此处的地址是不正确的,但不知道为什么会读到这个地址?
READ: address = 0x1003000, length = 0x200

自此文件上传结束:特别注意红色字体部分
但从cuteftp看其文件大小属性为0,于是下载下来,结果文件大小就是0,从输出write函数看来只写了868Byte
且有mode=1的情况存在,mode=1表示擦写到c区域了呀?


为了确定是否是ftp的问题,我用同样的tfp代码对norflash进行操作,结果ftp上传774kb的文件成功,且大小相符,下载也能成功,也可以正常打开,只是时间很长,下载一个800kb文件要10分钟,(时间是否正常,我的tffs和bootrom在同一块norflash上)且有时下载到80%时cutetfp就提示超时:接收服务器响应时发生超时(60000 毫秒)。然后重新连接。

由此可以看出tfp是有一定的小问题,估计在网卡驱动那里,但问题不大,不足以造成象在nandflash上,上传20kb的文件,由此可以确定是nandflash的驱动的问题,于是先检查read函数


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]