ARMrunc平台下FATFs文件系统移植教程与应用实例

需积分: 7 1 下载量 13 浏览量 更新于2024-07-21 收藏 421KB PDF 举报
该文档详细介绍了FATFS文件系统的移植方法,针对ARM微控制器平台,如ARC(ARMrunc)环境。FatFs是一个功能强大的、跨平台的文件系统库,专为小型嵌入式系统设计,无需依赖特定硬件,使用ANSI C标准编写,易于移植到不同的微控制器上。 移植过程中需要注意以下关键点: 1. 兼容性:确保使用的编译器支持ANSI C标准,因为FatFs是按照此标准编写的。如果遇到不同数据类型大小的不匹配,可能需要修改integer.h文件来适应。 2. 底层接口:移植时主要需要提供底层的磁盘读写函数,包括但不限于`f_open`, `f_read`, `f_write`, 和 `f_close`等。文档特别提到了在本实例中需要实现的前三个函数,具体实现可以在软件设计部分找到参考。 实际应用示例: 在文档的第20章,作者提供了一个关于在SD卡上操作的实例。这个应用涉及以下几个步骤: - 硬件准备:需要一块可用的SD卡。 - 软件移植:将FatFs库移植到目标平台,实现文件系统的功能。 - 用户交互:通过串口与用户进行交互,指导格式化SD卡、创建文件、删除文件、列出文件列表、管理文件夹以及读取和编辑文件。 - 验证:移植完成后,可以通过连接到电脑读取SD卡上的内容,以测试所有功能是否正常。 这份文档为想要在ARM微控制器上使用FatFs文件系统,特别是ARC平台的开发者提供了一套完整的移植指南和实际操作示例,确保了系统在兼容性和功能实现上的准确性。

请帮我解释这段代码:#include "cmd_parse.h" static int bufed_uart_rcv_1B(void *ref, uint8_t *c) { BUFED_UART_T *h = ref; return bufed_uart_rcv(h, c, 1); } CMD_PARSE_T *cmd_ps_1; osThreadId rx_cmp_tst_hd; extern RNG_HandleTypeDef hrng; void uart1_fast_loopback_test(uint32_t fatfs_ok) { uint8_t *tx_buf, *rx_buf; tx_buf= pvPortMalloc(URT_TST_BUF_LEN); if(tx_buf == NULL){ GS_LOGPRT_ERR("tx_buf pvPortMalloc failed.\r\n"); goto err_00; } rx_buf= pvPortMalloc(URT_TST_BUF_LEN); if(rx_buf == NULL){ GS_LOGPRT_ERR("tx_buf pvPortMalloc failed.\r\n"); goto err_01; } FIL *fp = pvPortMalloc(sizeof(*fp)); if(fp==NULL){ GS_LOGPRT_ERR("tx_buf pvPortMalloc failed.\r\n"); goto err_02; } bfdurt_tst_01.rx_buf = rx_buf; bfdurt_tst_01.tx_buf = tx_buf; bfdurt_tst_01.buf_size = URT_TST_BUF_LEN; bfdurt_tst_01.err_cnt = 0; for(uint32_t i = 0; i < URT_TST_BUF_LEN; i++) tx_buf[i] = HAL_RNG_GetRandomNumber(&hrng); osThreadDef(rx_cmp_tst_tsk, uart_rx_cmp, osPriorityBelowNormal, 0, 200); rx_cmp_tst_hd = osThreadCreate(osThread(rx_cmp_tst_tsk), &(bfdurt_tst_ptr)); osDelay(120); uint32_t lp; cmdprs_init(&cmd_ps_1, 256, &RBFD_UART_GET_UART(urt2), bufed_uart_rcv_1B); uint32_t f_num = 0; size_t n; while(1){ GS_Printf("Input test data length\r\n"); cmdprs_read_1line(cmd_ps_1); char ch; int scn = sscanf((void*)cmd_ps_1->buf->data,"%lu%c", &lp, &ch); if(scn == 2){ if(ch == 'M' || ch == 'm') lp <<= 10U; else if(ch == 'G' || ch == 'g') lp <<= 20U; else if(ch == 'K' || ch == 'k') ; else lp >>= 10U; lp /= (URT_TST_BUF_LEN/1024); }else{ GS_Printf("ERROR\r\n"); break; }

2023-07-14 上传