最近在项目中使用的MCF51JM128开发嵌入式USB主机,经历了两个月的摸索,有了初步的进展,在网上MCF51JM1128的资料比较少,因此写下自己的一些心得。
在项目中USB主机只支持U盘,因此使用开源的fatfs在U盘上实现文件系统。首先,必备的资料不可少,飞思卡尔有支持MCF51JM128的协议栈,主要有CMX协议栈和USB Stack两个。其中CMX协议栈实现文件系统使用的是链接库(thin-lin.a),因此如果想要对如何具体实现FAT文件系统有所了解,那就不能用CMX协议栈。USB Stack协议栈使用的是fatfs实现的文件系统,但是USB Stack协议栈比较大,我的CodeWarrior版本不能编译,并且并且对USB进行枚举的代码比较复杂。所以选择使用CMX协议栈,但是又想学习下如何具体实现FAT文件系统,因此在网上下载了fatfs,使用的是R0.10b版本,关于fatfs的介绍网上很多,大家可以自己百度。将CMX协议栈中实现FAT文件系统的链接库删除,换上R0.10b版本的fatfs,但是编译后发现出现illegal bp错误。
调试这个错误花了很大时间,走了许多弯路。下面写写自己走过的弯路,虽然走了许多弯路,但是收获了许多弯路的经验。一开始出现illegal bp错误,在网上百度后发现有四种解决方案:
1.重新下载。
2.在调试过程中非法设置断点。(从名字来看,这个命令应该是报ILLEGAL_BP错误~)
3.堆栈溢出。因为片上资源有限,而如果用到的临时变量太多,会导致片上堆栈溢出。
4.程序中中断设置错误。程序中设置了开中断,但是却没有中断处理函数,就会报错。解决办法:要么写中断处理函数,要么别开中断。
然后对照上面的四种方法,依次查找,最后确定是由于堆栈溢出导致的。但是不是由于使用的临时变量太多,具体原因在后文解释。一开始先修改配置文件,在Link Files中的.lcf文件中修改堆栈的大小,但是没有效果。
其次怀疑fatfs中ffconf.h文件配置有问题,对大部分的宏定义百度都有解释,但是都是以前版本的,在R0.10b版本中,有几个是需要注意的。
_WORD_ACCESS 变量是定义大端还是小端的,具体定义大家自己研究吧。如果你的文件系统出现LD_WORD(ptr) (WORD)(*(WORD*)(BYTE*)(ptr))有问题(数据异常终止DATA ABORT exception之类的)的情况,请百度搜索“转一篇比较详细介绍FatFS文件系统移植的**”就可以搞定了,那里有详细的解决办法。
_USE_LFN 如果使能_USE_LFN,则需要添加ff_convert() and ff_wtoupper()函数(这两个函数在option文件中ccsbcs.c文件中),如果令_USE_LFN等于3,则要在ff.c文件中添加ff_memalloc() and ff_memfree()
_MIN_SS和_MAX_SS 扇区大小,这里有点不大明白,我的U盘是8G的,格式化的时候选的默认扇区大小为4096,但是在程序中将_MAX_SS 设置为4096会有问题,调用f_mount函数返回的不是FR_OK,而是FR_NO_FILESYSTEM(好像是这个,记不大清楚了),还是设置的512.
最后在调试的时候不经意间找到了出现illegal bp的原因。在diskio.c中disk_read和disk_write函数出现了问题,对函数参数理解出现了问题。这个错误花了大概有一个多月的时间。。。
|