ucosIII+Fatfs MDK编译内存不足

文章讨论了使用STM32mini板移植uCOSIII与Fatfs过程中遇到的内存不足问题,并详细分析了.map文件来定位内存占用过大的原因,最终通过调整malloc内存池大小解决了问题。

使用正点原子的stm32mini板,按照原子的教程先移植好ucosIII,使用正常,移植好Fatfs,只跑fatfs,也正常,但两者一起使用编译,就出问题了。


MDK编辑器件报错,内存不足。为了查看是什么文件占用了这么大内存,我更换了大内存device,编译成功后查看 .map文件



    Total RO  Size (Code + RO Data)                42160 (  41.17kB)
    Total RW  Size (RW Data + ZI Data)             52256 (  51.03kB)
    Total ROM Size (Code + RO Data + RW Data)      42492 (  41.50kB)

原子的mini板用的是stm32f103rct6,sram为48k,而此处的RW Size为51.03K,超了。继续查看.map文件,发现

       300         30          0         20      38080       4873   malloc.o
       144         16          0          0          0       1869   misc.o

主要是malloc.c中的 
//ÄÚ´æ²ÎÊýÉ趨.
#define MEM_BLOCK_SIZE			32  	  						
#define MEM_MAX_SIZE			35*1024  						
#define MEM_ALLOC_TABLE_SIZE	MEM_MAX_SIZE/MEM_BLOCK_SIZE 	
太占用内存了。

因而我将malloc的内存池改小点,便可以编译成功了。

通过对比原子的综合例程,发现,原子的综合例程也占用了sram 44.80k,我的工程与其的主要SRAM占用区别在于系统,原子用的为UCOSII,我的工程为UCOSIII,UCOSII系统文件所用SRAM较小,而UCOSIII的几个文件的SRAM占用较大,因而导致了超出48K。

### UCOSII、FATFS 和 LWIP 组合使用 对于嵌入式系统的开发,UCOSII 是一种实时操作系统 (RTOS),而 FATFS 提供了文件系统支持,LWIP 则是一个轻量级 TCP/IP 协议栈。三者的组合可以实现复杂的网络应用和数据存储功能。 #### 文件系统集成 为了使 UCOSII 支持 FATFS 文件系统,在初始化阶段需要配置并启动这两个模块: ```c #include "ff.h" #include "os.h" void FileSys_Init(void){ FRESULT res; // 初始化 FatFs 模块 res = f_mount(&FatFs, "", 0); if(res != FR_OK){ // 错误处理逻辑 } } ``` 此部分代码展示了如何通过 `f_mount` 函数挂载 FATFS 实例到指定驱动器路径上[^1]。 #### 网络协议栈设置 针对 LWIP 的初始化工作通常涉及创建任务来管理 IP 层面的操作以及定时器服务: ```c extern void lwip_init(void); // 创建 LwIP 定时器任务 static void TimerTask(void *arg){ while(1){ sys_check_timeouts(); OSTimeDlyHMSM(0, 0, 0, 5); } } int main(){ OSInit(); /* Initialize uC/OS-II */ ... lwip_init(); /* Initialize the lwIP stack */ OSTaskCreate(TimerTask, NULL, &Timer_Task_Stack[TIMER_TASK_STK_SIZE - 1], TIMER_TASK_PRIORITY); StartOS(OSDEFAULTAPPMODE); } ``` 上述片段说明了怎样在应用程序入口处调用 `lwIP_init()` 进行必要的准备工作,并建立一个用于执行周期性操作的任务实例。 #### 数据传输示例 当涉及到实际的数据交换过程时,可以通过如下方式读取本地文件并通过网络发送出去: ```c #define SERVER_PORT 7 /* 发送函数定义 */ err_t send_file(struct netconn *conn, const char* filename){ FIL file; /* 文件句柄 */ UINT bytesread=0; /* 已经读取字节数 */ static uint8_t buffer[256]; /* 缓冲区 */ if(f_open(&file,filename,FA_READ)!=FR_OK)return ERR_VAL; do{ f_read(&file,buffer,sizeof(buffer),&bytesread); if(bytesread>0){ netconn_write(conn, buffer, bytesread, NETCONN_COPY); }else break; }while(bytesread==sizeof(buffer)); f_close(&file); return ERR_OK; } ``` 这段程序实现了打开特定名称的文件对象,循环地将其内容加载至内存缓冲区内再利用 `netconn_write` 方法向远端主机传递这些二进制流的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值