FAT和uboot的丁点总结

本文分享了作者在嵌入式领域的实践经验,包括FAT文件系统的深入理解及应用,以及如何为U-boot增加USB和FAT支持,简化固件更新流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 告别AVR 单片机 大半年了,用hpijs打印驱动做过HP deskjet 2368喷墨打印机、HP P2015激光打印机, ARM 的MMU映射、中断处理,感慨ARM真的是难了很多,贴一贴 嵌入式 软件的一些经历,上个月搞FAT,写写文件名的总结: 
     (1)有短文件名和长文件名之分,为8.3格式,短文件名存储时全部为大写字母,如abcd.txt,存储的时候8.3格式为A B C D 0x20 0x20 0x20 0x20 T X T。 
     (2)如果名字部分大于8个字符,一定当作长文件名处理,如果小于8个,用0x20表示,如果没有扩展名,则扩展名用0x20表示。 
     (3)如果文件名含有“.”,则视为长文件名,如abc.1.txt。 
     (4)如果文件名为大小写混合,则视为长文件名,如aBc.txt,123.tXt。 
     (5)长文件名目录项之后就是短文件名,每个长文件名目录项的开头字节如0x42 0x01,有0x40的是长文件名的最后一个目录项。 
     (6)文件名abcd.TXT、ABCD.txt、ABCD.TXT、abcd.txt表示的是同一个文件,你说windos会怎么显示这个文件名? 其实是用户怎名命名就怎么显示,即:如果用户命名为abcd.TXT,看到的就是abcd.TXT,不会看到ABCD.txt、ABCD.TXT、abcd.txt这三种显示。 再问,这个是长文件名吗? 不是,abcd.TXT、ABCD.txt、ABCD.TXT、abcd.txt都是短文件名,都是同一个文件名,符合8.3格式,是短文件名。 那么windows根据什么信息知道要给用户显示成abcd.TXT,而不是ABCD.txt、ABCD.TXT、abcd.txt呢? FAT规范没有提到这个显示的依据,其实windows是根据短目录项的第12字节来决定如何显示的,如0x00时显示为abcd.txt, 0x18时显示为ABCD.TXT, 好像是这样,具体数值怎么显示我忘记了。 
     其实windows也没有严格遵循FAT规范,如:FAT16规定保留扇区为0,其实不一定,windows将U盘格式化成FAT16格式的时候一般都会有保留扇区。 
     深入研究了FAT,感觉不会太难的。 
     前段时间搞基于USB的FAT16文件系统,像FAT1、FAT2怎么定位,根目录怎么定位,都可以很快算出来。 
     如果一个文件夹内长期使用,会长生许多以0xe5字节开头的无效目录项,比如:如果文件夹内只有一个文件,其实用一个目录项记录这个文件就可以了,但是文件夹的非0扇区可以达到到好几个扇区,甚至好几簇,针对这种情况,我编写了一个函数,专门用来清理U盘的指定文件夹,把0xe5、0x05开头的目录项,无效长目录项,等等,全部清理掉,腾出空间,而不影响原来的有效文件。     
     这个星期搞了uboot,原来只能从TFTP升级自身和ARM程序,每次都要插网线,设IP,很不方便, 现在uboot可以支持读取U盘文件,这样可以把程序文件拷贝到U盘,uboot从U盘读取文件,然后做uboot自我升级、应用程序升级、 FPGA 1和FPGA2的配置 芯片 m25p16、m25p20的升级,节省了原来用编程器给每块芯片烧写程序的大量时间,能提升生产效率。 
    在uboot的include/configs/目录下有一个对应开发板的配置头文件,如smdk2410.h,打开#define CONFIG_COMMANDS语句的USB和FAT功能开关,然后再加上以下语句:
    #define CONFIG_CMD_USB
    #define CONFIG_CMD_FAT

    #define CONFIG_USB_OHCI
    #define CONFIG_USB_STORAGE
    #define CONFIG_USB_KEYBOARD
    #define CONFIG_DOS_PARTITION
    #define CFG_DEVICE_DEREGISTER
    #define CONFIG_SUPPORT_VFAT
    #define LITTLEENDIAN
    这样就给uboot加上了读取U盘的功能,你只要把可以烧写flash的程序文件存到U盘,用fatload命令如fatload usb 0 0x30000000 zimage.img,就可以从U盘把zimage.img文件读取到0x30000000地址的SDRAM处。不过uboot不会自动打开USB功能,所以使用USB功能之前先用usb start命令打开USB功能。用fatls usb 0 命令还可以通过超级终端显示U盘内的文件情况。执行这些命令可以通过超级终端输入命令执行,也可以在程序中设定执行命令,如:
char *s="usb start";//打开USB功能
run(s,0); 
s = "fatload usb 0 0x30000000 zimage.img" ;
run(s,0);
这样就可以运行这条命令了。
    
给uboot增加命令很简单:
int do_mycommand (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
//这里加上你的命令要实现的功能就可以了
}
U_BOOT_CMD(
    mycommand,   2,   1,     do_mycommand ,
    "mycommand - this is my command ",
    "mycommand "
    "    - do mycommand "
);

    可以装virtualBOX虚拟机+fedora来编译uboot,还有交叉编译器cross-x.x.x.tar.bz2和uboot,用tar解压之后简单修改一下编译器路径就能编译。
     有空把FAT和uboot的资料整理共享^_^! 
     争取10、11、12三个月把ADS的圣经ARM Architecture Reference Manual、ADS_AssemblerGuide_B、ADS_DeveloperGuide_D、ADS_LinkerGuide_A、ATPCS啃完,为自己加油o(∩_∩)o..
资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在机器人技术中,轨迹规划是实现机器人从一个位置平稳高效移动到另一个位置的核心环节。本资源提供了一套基于 MATLAB 的机器人轨迹规划程序,涵盖了关节空间笛卡尔空间两种规划方式。MATLAB 是一种强大的数值计算与可视化工具,凭借其灵活易用的特点,常被用于机器人控制算法的开发与仿真。 关节空间轨迹规划主要关注机器人各关节角度的变化,生成从初始配置到目标配置的连续路径。其关键知识点包括: 关节变量:指机器人各关节的旋转角度或伸缩长度。 运动学逆解:通过数学方法从末端执行器的目标位置反推关节变量。 路径平滑:确保关节变量轨迹连续且无抖动,常用方法有 S 型曲线拟合、多项式插值等。 速度加速度限制:考虑关节的实际物理限制,确保轨迹在允许的动态范围内。 碰撞避免:在规划过程中避免关节与其他物体发生碰撞。 笛卡尔空间轨迹规划直接处理机器人末端执行器在工作空间中的位置姿态变化,涉及以下内容: 工作空间:机器人可到达的所有三维空间点的集合。 路径规划:在工作空间中找到一条从起点到终点的无碰撞路径。 障碍物表示:采用二维或三维网格、Voronoi 图、Octree 等数据结构表示工作空间中的障碍物。 轨迹生成:通过样条曲线、直线插值等方法生成平滑路径。 实时更新:在规划过程中实时检测并避开新出现的障碍物。 在 MATLAB 中实现上述规划方法,可以借助其内置函数工具箱: 优化工具箱:用于解决运动学逆解路径规划中的优化问题。 Simulink:可视化建模环境,适合构建仿真复杂的控制系统。 ODE 求解器:如 ode45,用于求解机器人动力学方程轨迹执行过程中的运动学问题。 在实际应用中,通常会结合关节空间笛卡尔空间的规划方法。先在关节空间生成平滑轨迹,再通过运动学正解将关节轨迹转换为笛卡
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值