From d8c1b2018b848b6d8309f91eb2ac999ff21b2d72 Mon Sep 17 00:00:00 2001 From: ranchuan Date: Fri, 26 Sep 2025 16:57:44 +0800 Subject: [PATCH] =?UTF-8?q?usb=5Fnet=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/c_cpp_properties.json | 11 +- Project/Src/Drive/Source/mymem.c | 1101 ++++++++--------- .../net/lwip-2.1.0/src/apps/http/fs.c | 4 +- .../src/apps/http/{fsdata.c => fsdata.txt} | 0 .../{makefsdata.c => makefsdata.tmp} | 0 .../apps/tftp/{tftp_port.c => tftp_port.tmp} | 0 .../tftp/{tftp_server.c => tftp_server.tmp} | 0 .../net/lwip-2.1.0/src/arch/sys_arch.c | 12 +- .../lwip-2.1.0/src/core/{mem.c => mem.tmp} | 0 .../lwip-2.1.0/src/include/netif/ethernetif.h | 6 +- .../netif/{ethernetif.c => ethernetif.tmp} | 0 Project/make.py | 17 +- 12 files changed, 518 insertions(+), 633 deletions(-) rename Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/{fsdata.c => fsdata.txt} (100%) rename Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/makefsdata/{makefsdata.c => makefsdata.tmp} (100%) rename Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/tftp/{tftp_port.c => tftp_port.tmp} (100%) rename Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/tftp/{tftp_server.c => tftp_server.tmp} (100%) rename Project/Src/rt-thread/components/net/lwip-2.1.0/src/core/{mem.c => mem.tmp} (100%) rename Project/Src/rt-thread/components/net/lwip-2.1.0/src/netif/{ethernetif.c => ethernetif.tmp} (100%) diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 0caeb1c..6c8d799 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -30,14 +30,17 @@ "Project/Src/rt-thread/include", "Project/Src/zlib", "Project/Src/NES", - "Project/Src/TinyUSB/examples/device/cdc_dual_ports/src", - "Project/Src/TinyUSB/src/class/cdc", + "Project/Src/TinyUSB/examples/device/net_lwip_webserver/src", + "Project/Src/TinyUSB/src/class/net", "Project/Src/TinyUSB/src/common", "Project/Src/TinyUSB/src/device", "Project/Src/TinyUSB/src/portable/synopsys/dwc2", "Project/Src/TinyUSB/src", "Project/Src/TinyUSB/src/osal", - "Project/Src/TinyUSB/hw" + "Project/Src/TinyUSB/hw", + "Project/Src/TinyUSB/lib/networking", + "Project/Src/rt-thread/components/net/lwip-2.1.0/src/include", + "Project/Src/rt-thread/components/net/lwip-2.1.0/src/arch/include" ], "defines": [ "USE_STDPERIPH_DRIVER", @@ -51,7 +54,7 @@ "PKG_TINYUSB_DEVICE_ENABLE" ], "windowsSdkVersion": "10.0.22621.0", - "compilerPath": "D:/Program Files/arm-gnu-toolchain/bin/arm-none-eabi-gcc", + "compilerPath": "C:/ARM_GCC/bin/arm-none-eabi-gcc", "cStandard": "c17", "cppStandard": "c++17", "intelliSenseMode": "windows-gcc-arm" diff --git a/Project/Src/Drive/Source/mymem.c b/Project/Src/Drive/Source/mymem.c index 8b2dcc2..047a697 100644 --- a/Project/Src/Drive/Source/mymem.c +++ b/Project/Src/Drive/Source/mymem.c @@ -1,701 +1,568 @@ #include "mymem.h" #include "sdram.h" - - // 定义是否使用ccm内存,1,使用,0,不使用 -#define USE_CCM 0 - +#define USE_CCM 0 #ifndef BOOTLOADER - #define OS_RTT - #ifdef OS_RTT - #include "rthw.h" - #define IRQ_DISABLE() rt_enter_critical() - #define IRQ_ENABLE() rt_exit_critical() - #else - #include "os.h" - #define IRQ_DISABLE() {CPU_SR_ALLOC(); CPU_CRITICAL_ENTER();} - #define IRQ_ENABLE() CPU_CRITICAL_EXIT() - #endif +#define OS_RTT +#ifdef OS_RTT +#include "rthw.h" +#define IRQ_DISABLE() rt_enter_critical() +#define IRQ_ENABLE() rt_exit_critical() #else - #define IRQ_DISABLE() { } - #define IRQ_ENABLE() { } +#include "os.h" +#define IRQ_DISABLE() \ + { \ + CPU_SR_ALLOC(); \ + CPU_CRITICAL_ENTER(); \ + } +#define IRQ_ENABLE() CPU_CRITICAL_EXIT() +#endif +#else +#define IRQ_DISABLE() \ + {} +#define IRQ_ENABLE() \ + {} #endif +static void exmem_init(void); // 内存管理初始化函数 +static u32 exmem_malloc(u32 size); // 内存分配 +static u8 exmem_free(u32 offset); // 内存释放 -static void exmem_init(void); //内存管理初始化函数 -static u32 exmem_malloc(u32 size); //内存分配 -static u8 exmem_free(u32 offset); //内存释放 +static void mem_init(void); // 内存管理初始化函数 +static u32 mem_malloc(u32 size); // 内存分配 +static u8 mem_free(u32 offset); // 内存释放 -static void mem_init(void); //内存管理初始化函数 -static u32 mem_malloc(u32 size); //内存分配 -static u8 mem_free(u32 offset); //内存释放 +static void ccm_init(void); -static void ccm_init(void) ; - - - -void mymem_init (void) -{ - mem_init (); - exmem_init( ); -// ccm_init(); +void mymem_init(void) { + mem_init(); + exmem_init(); + // ccm_init(); } +#define EXMEM_BLOCK_SIZE (256) // 内存块大小为64字节 -#define EXMEM_BLOCK_SIZE (256) //内存块大小为64字节 - -#define EXMEM_MAX_SIZE ((uint64_t)((SDRAM_USER_SIZE))*EXMEM_BLOCK_SIZE/(EXMEM_BLOCK_SIZE+2)) -#define EXMEM_ALLOC_TABLE_SIZE ((u32)(EXMEM_MAX_SIZE/EXMEM_BLOCK_SIZE)&(~3)) //内存表大小,必须为偶数,双字对齐 +#define EXMEM_MAX_SIZE \ + ((uint64_t)((SDRAM_USER_SIZE)) * EXMEM_BLOCK_SIZE / (EXMEM_BLOCK_SIZE + 2)) +#define EXMEM_ALLOC_TABLE_SIZE \ + ((u32)(EXMEM_MAX_SIZE / EXMEM_BLOCK_SIZE) & \ + (~3)) // 内存表大小,必须为偶数,双字对齐 - - -//分配的内存都是双字对齐的 -#define EXMEM_BASE ((u8 *)(SDRAM_USER_ADDR+EXMEM_ALLOC_TABLE_SIZE*2)) +// 分配的内存都是双字对齐的 +#define EXMEM_BASE ((u8 *)(SDRAM_USER_ADDR + EXMEM_ALLOC_TABLE_SIZE * 2)) #define EXMEMMAP_BASE ((u16 *)(SDRAM_USER_ADDR)) -//内存管理参数 -u32 exmemtblsize ; //内存表大小 -u32 exmemblksize; //内存分块大小 -uint64_t exmemsize ; //内存总大小 +// 内存管理参数 +u32 exmemtblsize; // 内存表大小 +u32 exmemblksize; // 内存分块大小 +uint64_t exmemsize; // 内存总大小 - -//内存管理控制器 +// 内存管理控制器 struct _m_mallco_dev exmallco_dev; -//复制内存 +// 复制内存 //*des:目的地址 //*src:源地址 -//n:需要复制的内存长度(字节为单位) -void mymemcpy(void *des,void *src,u32 n) -{ - u8 *xdes=des; - u8 *xsrc=src; - while(n--)*xdes++=*xsrc++; -} +// n:需要复制的内存长度(字节为单位) +void mymemcpy(void *des, void *src, u32 n) { + u8 *xdes = des; + u8 *xsrc = src; + while (n--) + *xdes++ = *xsrc++; +} -//设置内存 +// 设置内存 //*s:内存首地址 -//c :要设置的值 -//count:需要设置的内存大小(字节为单位) -void mymemset(void *s,u8 c,u32 count) -{ - u8 *xs = s; - while(count--)*xs++=c; -} +// c :要设置的值 +// count:需要设置的内存大小(字节为单位) +void mymemset(void *s, u8 c, u32 count) { + u8 *xs = s; + while (count--) + *xs++ = c; +} +// 内存管理初始化 +// memx:所属内存块 +static void exmem_init(void) { + exmemtblsize = EXMEM_ALLOC_TABLE_SIZE; // 内存表大小 + exmemblksize = EXMEM_BLOCK_SIZE; // 内存分块大小 + exmemsize = EXMEM_MAX_SIZE; // 内存总大小 + exmallco_dev.membase = EXMEM_BASE; // 内存池 + exmallco_dev.memmap = EXMEMMAP_BASE; // 内存管理状态表 + exmallco_dev.memrdy = 0; // 内存管理未就绪 + mymemset(exmallco_dev.memmap, 0, exmemtblsize * 2); // 内存状态表数据清零 + mymemset(exmallco_dev.membase, 0, exmemsize); // 内存池所有数据清零 + exmallco_dev.memrdy = 1; // 内存管理初始化OK +} +// 获取内存使用率 +// memx:所属内存块 +// 返回值:使用率(0~100) +int exmem_perused(void) { + u32 used = 0; + u32 i; + for (i = 0; i < exmemtblsize; i++) { + if (exmallco_dev.memmap[i]) + used++; + } + return (used * 10000) / (exmemtblsize); +} +// 内存分配(内部调用) +// memx:所属内存块 +// size:要分配的内存大小(字节) +// 返回值:0XFFFFFFFF,代表错误;其他,内存偏移地址 +static u32 exmem_malloc(u32 size) { + signed long offset = 0; + u32 nmemb; // 需要的内存块数 + u32 cmemb = 0; // 连续空内存块数 + u32 i; + // if(!mallco_dev.memrdy)mallco_dev.init();//未初始化,先执行初始化 + if (size == 0) + return 0XFFFFFFFF; // 不需要分配 -//内存管理初始化 -//memx:所属内存块 -static void exmem_init(void) -{ - exmemtblsize = EXMEM_ALLOC_TABLE_SIZE; //内存表大小 - exmemblksize = EXMEM_BLOCK_SIZE; //内存分块大小 - exmemsize = EXMEM_MAX_SIZE; //内存总大小 - - exmallco_dev.membase=EXMEM_BASE; //内存池 - exmallco_dev.memmap=EXMEMMAP_BASE; //内存管理状态表 - exmallco_dev.memrdy=0; //内存管理未就绪 - - - mymemset(exmallco_dev.memmap, 0,exmemtblsize*2);//内存状态表数据清零 - mymemset(exmallco_dev.membase, 0,exmemsize); //内存池所有数据清零 - exmallco_dev.memrdy=1; //内存管理初始化OK -} - -//获取内存使用率 -//memx:所属内存块 -//返回值:使用率(0~100) -int exmem_perused(void) -{ - u32 used=0; - u32 i; - for(i=0;i=0;offset--)//搜索整个内存控制区 - { - if(!exmallco_dev.memmap[offset])cmemb++;//连续空内存块数增加 - else cmemb=0; //连续内存块清零 - if(cmemb==nmemb) //找到了连续nmemb个空内存块 - { - for(i=0;i= 0; offset--) // 搜索整个内存控制区 + { + if (!exmallco_dev.memmap[offset]) + cmemb++; // 连续空内存块数增加 + else + cmemb = 0; // 连续内存块清零 + if (cmemb == nmemb) // 找到了连续nmemb个空内存块 + { + for (i = 0; i < nmemb; i++) // 标注内存块非空 + { + exmallco_dev.memmap[offset + i] = nmemb; + } + return (offset * exmemblksize); // 返回偏移地址 + } + } + return 0XFFFFFFFF; // 未找到符合分配条件的内存块 +} +// 释放内存(内部调用) +// memx:所属内存块 +// offset:内存地址偏移 +// 返回值:0,释放成功;1,释放失败; +static u8 exmem_free(u32 offset) { + u32 i; + if (!exmallco_dev.memrdy) // 未初始化,先执行初始化 + { + // mallco_dev.init(); + return 1; // 未初始化 + } + if (offset < exmemsize) // 偏移在内存池内. + { + u32 index = offset / exmemblksize; // 偏移所在内存块号码 + u32 nmemb = exmallco_dev.memmap[index]; // 内存块数量 + for (i = 0; i < nmemb; i++) // 内存块清零 + { + exmallco_dev.memmap[index + i] = 0; + } + return 0; + } else + return 2; // 偏移超区了. +} //------------------------------------内部SRAM--------------------------------------- - -#define SRAM_USER_SIZE (120*1024) +#define SRAM_USER_SIZE (110 * 1024) u8 g_sram_mem[SRAM_USER_SIZE]; -#define MEM_BLOCK_SIZE (32) //内存块大小为64字节 - -#define MEM_MAX_SIZE (((SRAM_USER_SIZE))*MEM_BLOCK_SIZE/(MEM_BLOCK_SIZE+2)) -#define MEM_ALLOC_TABLE_SIZE ((MEM_MAX_SIZE/MEM_BLOCK_SIZE)&(~3)) //内存表大小,必须为偶数,双字对齐 +#define MEM_BLOCK_SIZE (32) // 内存块大小为64字节 + +#define MEM_MAX_SIZE \ + (((SRAM_USER_SIZE)) * MEM_BLOCK_SIZE / (MEM_BLOCK_SIZE + 2)) +#define MEM_ALLOC_TABLE_SIZE \ + ((MEM_MAX_SIZE / MEM_BLOCK_SIZE) & (~3)) // 内存表大小,必须为偶数,双字对齐 #define SRAM_USER_ADDR ((u32)g_sram_mem) -//分配的内存都是双字对齐的 -#define MEM_BASE ((u8 *)(SRAM_USER_ADDR+MEM_ALLOC_TABLE_SIZE*2)) +// 分配的内存都是双字对齐的 +#define MEM_BASE ((u8 *)(SRAM_USER_ADDR + MEM_ALLOC_TABLE_SIZE * 2)) #define MEMMAP_BASE ((u16 *)(SRAM_USER_ADDR)) +// 内存管理参数 +u32 memtblsize; // 内存表大小 +u32 memblksize; // 内存分块大小 +u32 memsize; // 内存总大小 - - -//内存管理参数 -u32 memtblsize ; //内存表大小 -u32 memblksize; //内存分块大小 -u32 memsize ; //内存总大小 - - -//内存管理控制器 +// 内存管理控制器 struct _m_mallco_dev mallco_dev; +// 内存管理初始化 +// memx:所属内存块 +static void mem_init(void) { + memtblsize = MEM_ALLOC_TABLE_SIZE; // 内存表大小 + memblksize = MEM_BLOCK_SIZE; // 内存分块大小 + memsize = MEM_MAX_SIZE; // 内存总大小 + // mallco_dev.init=mem_init; //内存初始化 + // mallco_dev.perused=mem_perused; //内存使用率 + mallco_dev.membase = MEM_BASE; // 内存池 + mallco_dev.memmap = MEMMAP_BASE; // 内存管理状态表 + mallco_dev.memrdy = 0; // 内存管理未就绪 + mymemset(mallco_dev.memmap, 0, memtblsize * 2); // 内存状态表数据清零 + mymemset(mallco_dev.membase, 0, memsize); // 内存池所有数据清零 + mallco_dev.memrdy = 1; // 内存管理初始化OK +} -//内存管理初始化 -//memx:所属内存块 -static void mem_init(void) -{ - memtblsize = MEM_ALLOC_TABLE_SIZE; //内存表大小 - memblksize = MEM_BLOCK_SIZE; //内存分块大小 - memsize = MEM_MAX_SIZE; //内存总大小 - -// mallco_dev.init=mem_init; //内存初始化 -// mallco_dev.perused=mem_perused; //内存使用率 - mallco_dev.membase=MEM_BASE; //内存池 - mallco_dev.memmap=MEMMAP_BASE; //内存管理状态表 - mallco_dev.memrdy=0; //内存管理未就绪 - - - mymemset(mallco_dev.memmap, 0,memtblsize*2);//内存状态表数据清零 - mymemset(mallco_dev.membase, 0,memsize); //内存池所有数据清零 - mallco_dev.memrdy=1; //内存管理初始化OK -} - - - -//获取内存使用率 -//memx:所属内存块 -//返回值:使用率(0~100) -int mem_perused(void) -{ - u32 used=0; - u32 i; - for(i=0;i=0;offset--)//搜索整个内存控制区 - { - if(!mallco_dev.memmap[offset])cmemb++;//连续空内存块数增加 - else cmemb=0; //连续内存块清零 - if(cmemb==nmemb) //找到了连续nmemb个空内存块 - { - for(i=0;i= 0; offset--) // 搜索整个内存控制区 + { + if (!mallco_dev.memmap[offset]) + cmemb++; // 连续空内存块数增加 + else + cmemb = 0; // 连续内存块清零 + if (cmemb == nmemb) // 找到了连续nmemb个空内存块 + { + for (i = 0; i < nmemb; i++) // 标注内存块非空 + { + mallco_dev.memmap[offset + i] = nmemb; + } + return (offset * memblksize); // 返回偏移地址 + } + } + return 0XFFFFFFFF; // 未找到符合分配条件的内存块 +} +// 释放内存(内部调用) +// memx:所属内存块 +// offset:内存地址偏移 +// 返回值:0,释放成功;1,释放失败; +static u8 mem_free(u32 offset) { + int i; + if (!mallco_dev.memrdy) // 未初始化,先执行初始化 + { + // mallco_dev.init(); + return 1; // 未初始化 + } + if (offset < exmemsize) // 偏移在内存池内. + { + int index = offset / memblksize; // 偏移所在内存块号码 + int nmemb = mallco_dev.memmap[index]; // 内存块数量 + for (i = 0; i < nmemb; i++) // 内存块清零 + { + mallco_dev.memmap[index + i] = 0; + } + return 0; + } else + return 2; // 偏移超区了. +} //------------------------------------内部CCM--------------------------------------- +#if USE_CCM == 1 -#if USE_CCM==1 - -#define CCM_USER_SIZE 64*1024 +#define CCM_USER_SIZE 64 * 1024 u8 g_ccm_mem[CCM_USER_SIZE] __attribute__((at(0x10000000))); -#define CCM_BLOCK_SIZE (32) //内存块大小为64字节 - -#define CCM_MAX_SIZE (((CCM_USER_SIZE))*CCM_BLOCK_SIZE/(CCM_BLOCK_SIZE+2)) -#define CCM_ALLOC_TABLE_SIZE ((CCM_MAX_SIZE/CCM_BLOCK_SIZE)&(~3)) //内存表大小,必须为偶数,双字对齐 +#define CCM_BLOCK_SIZE (32) // 内存块大小为64字节 + +#define CCM_MAX_SIZE (((CCM_USER_SIZE)) * CCM_BLOCK_SIZE / (CCM_BLOCK_SIZE + 2)) +#define CCM_ALLOC_TABLE_SIZE \ + ((CCM_MAX_SIZE / CCM_BLOCK_SIZE) & (~3)) // 内存表大小,必须为偶数,双字对齐 #define CCM_USER_ADDR ((u32)g_ccm_mem) -//分配的内存都是双字对齐的 -#define CCM_BASE ((u8 *)(CCM_USER_ADDR+CCM_ALLOC_TABLE_SIZE*2)) +// 分配的内存都是双字对齐的 +#define CCM_BASE ((u8 *)(CCM_USER_ADDR + CCM_ALLOC_TABLE_SIZE * 2)) #define CCMMAP_BASE ((u16 *)(CCM_USER_ADDR)) +// 内存管理参数 +u32 ccm_memtblsize; // 内存表大小 +u32 ccm_memblksize; // 内存分块大小 +u32 ccm_memsize; // 内存总大小 - - -//内存管理参数 -u32 ccm_memtblsize ; //内存表大小 -u32 ccm_memblksize; //内存分块大小 -u32 ccm_memsize ; //内存总大小 - - -//内存管理控制器 +// 内存管理控制器 struct _m_mallco_dev ccm_mallco_dev; +// 内存管理初始化 +// memx:所属内存块 +static void ccm_init(void) { + ccm_memtblsize = CCM_ALLOC_TABLE_SIZE; // 内存表大小 + ccm_memblksize = CCM_BLOCK_SIZE; // 内存分块大小 + ccm_memsize = CCM_MAX_SIZE; // 内存总大小 + ccm_mallco_dev.membase = CCM_BASE; // 内存池 + ccm_mallco_dev.memmap = CCMMAP_BASE; // 内存管理状态表 + ccm_mallco_dev.memrdy = 0; // 内存管理未就绪 - -//内存管理初始化 -//memx:所属内存块 -static void ccm_init(void) -{ - ccm_memtblsize = CCM_ALLOC_TABLE_SIZE; //内存表大小 - ccm_memblksize = CCM_BLOCK_SIZE; //内存分块大小 - ccm_memsize = CCM_MAX_SIZE; //内存总大小 - - ccm_mallco_dev.membase=CCM_BASE; //内存池 - ccm_mallco_dev.memmap=CCMMAP_BASE; //内存管理状态表 - ccm_mallco_dev.memrdy=0; //内存管理未就绪 - - - mymemset(ccm_mallco_dev.memmap, 0,ccm_memtblsize*2);//内存状态表数据清零 - mymemset(ccm_mallco_dev.membase, 0,ccm_memsize); //内存池所有数据清零 - ccm_mallco_dev.memrdy=1; //内存管理初始化OK -} - - - -//获取内存使用率 -//memx:所属内存块 -//返回值:使用率(0~100) -int ccm_perused(void) -{ - u32 used=0; - u32 i; - for(i=0;i=0;offset--)//搜索整个内存控制区 - { - if(!ccm_mallco_dev.memmap[offset])cmemb++;//连续空内存块数增加 - else cmemb=0; //连续内存块清零 - if(cmemb==nmemb) //找到了连续nmemb个空内存块 - { - for(i=0;i5*1024) - offset=0XFFFFFFFF; - else - offset=mem_malloc(size); - if(offset!=0XFFFFFFFF) - { - ret_addr=(void*)((u32)mallco_dev.membase+offset); - } - else - { - offset=exmem_malloc(size); - if (offset!=0XFFFFFFFF) - { - ret_addr=(void*)((u32)exmallco_dev.membase+offset); - } - } - //printf ("malloc:%#X,%d\r\n",(u32)ret_addr,size); - IRQ_ENABLE(); - return ret_addr; -} - - - -//分配内存(外部调用) -//首先尝试在内部分配,失败后再外部分配 -//size:内存大小(字节) -//返回值:分配到的内存首地址. -void *mymalloc_fast(u32 size) -{ - IRQ_DISABLE(); - u32 offset; - void *ret_addr=NULL; - offset=mem_malloc(size); - if(offset!=0XFFFFFFFF) - { - ret_addr=(void*)((u32)mallco_dev.membase+offset); - } - else - { - offset=exmem_malloc(size); - if (offset!=0XFFFFFFFF) - { - ret_addr=(void*)((u32)exmallco_dev.membase+offset); - } - } - //printf ("malloc:%#X,%d\r\n",(u32)ret_addr,size); - IRQ_ENABLE(); - return ret_addr; -} - - - -//分配外部内存(外部调用) -//首先尝试在内部分配,失败后再外部分配 -//size:内存大小(字节) -//返回值:分配到的内存首地址. -void *mymalloc_exm(u32 size) -{ - IRQ_DISABLE(); - u32 offset; - void *ret_addr=NULL; - offset=exmem_malloc(size); - if (offset!=0XFFFFFFFF) - { - ret_addr=(void*)((u32)exmallco_dev.membase+offset); - } - IRQ_ENABLE(); - return ret_addr; -} - - - - -#if USE_CCM==1 - -//释放CCM内存 -void myfree_ccm(void *ptr) -{ - IRQ_DISABLE(); - u32 free_addr=(u32)ptr; - u32 offset; - if(ptr==NULL) - { - IRQ_ENABLE(); - return;//地址为0. - } - else if ((free_addr&0xf0000000)==0x10000000)//sram - { - offset=(u32)ptr-(u32)ccm_mallco_dev.membase; - ccm_free(offset);//释放内存 - } - else - { - offset=(u32)ptr-(u32)exmallco_dev.membase; - exmem_free(offset);//释放内存 - } - //printf ("free:%#X\r\n",free_addr); - IRQ_ENABLE(); +// 获取内存使用率 +// memx:所属内存块 +// 返回值:使用率(0~100) +int ccm_perused(void) { + u32 used = 0; + u32 i; + for (i = 0; i < ccm_memtblsize; i++) { + if (ccm_mallco_dev.memmap[i]) + used++; + } + return (used * 10000) / (ccm_memtblsize); } +// 内存分配(内部调用) +// memx:所属内存块 +// size:要分配的内存大小(字节) +// 返回值:0XFFFFFFFF,代表错误;其他,内存偏移地址 +static u32 ccm_malloc(u32 size) { + signed long offset = 0; + u16 nmemb; // 需要的内存块数 + u16 cmemb = 0; // 连续空内存块数 + u32 i; + // if(!mallco_dev.memrdy)mallco_dev.init();//未初始化,先执行初始化 + if (size == 0) + return 0XFFFFFFFF; // 不需要分配 - -//分配CCM内存 -void *mymalloc_ccm(u32 size) -{ - IRQ_DISABLE(); - u32 offset; - void *ret_addr=NULL; - offset=ccm_malloc(size); - if(offset!=0XFFFFFFFF) - { - ret_addr=(void*)((u32)ccm_mallco_dev.membase+offset); - } - else - { - offset=exmem_malloc(size); - if (offset!=0XFFFFFFFF) - { - ret_addr=(void*)((u32)exmallco_dev.membase+offset); - } - } - IRQ_ENABLE(); - return ret_addr; -} - - -#endif - - - - -//重新分配内存(外部调用) -//memx:所属内存块 -//*ptr:旧内存首地址 -//size:要分配的内存大小(字节) -//返回值:新分配到的内存首地址. -void *myrealloc(void *ptr,u32 size) -{ - IRQ_DISABLE(); - void *ret_addr; - ret_addr=mymalloc_exm(size); - if(ret_addr!=NULL) - { - if(ptr!=NULL) + nmemb = size / ccm_memblksize; // 获取需要分配的连续内存块数 + if (size % ccm_memblksize) + nmemb++; + for (offset = ccm_memtblsize - 1; offset >= 0; offset--) // 搜索整个内存控制区 + { + if (!ccm_mallco_dev.memmap[offset]) + cmemb++; // 连续空内存块数增加 + else + cmemb = 0; // 连续内存块清零 + if (cmemb == nmemb) // 找到了连续nmemb个空内存块 { - mymemcpy (ret_addr,ptr,size); + for (i = 0; i < nmemb; i++) // 标注内存块非空 + { + ccm_mallco_dev.memmap[offset + i] = nmemb; + } + return (offset * ccm_memblksize); // 返回偏移地址 + } + } + return 0XFFFFFFFF; // 未找到符合分配条件的内存块 +} + +// 释放内存(内部调用) +// memx:所属内存块 +// offset:内存地址偏移 +// 返回值:0,释放成功;1,释放失败; +static u8 ccm_free(u32 offset) { + int i; + if (!ccm_mallco_dev.memrdy) // 未初始化,先执行初始化 + { + // mallco_dev.init(); + return 1; // 未初始化 + } + if (offset < exmemsize) // 偏移在内存池内. + { + int index = offset / ccm_memblksize; // 偏移所在内存块号码 + int nmemb = ccm_mallco_dev.memmap[index]; // 内存块数量 + for (i = 0; i < nmemb; i++) // 内存块清零 + { + ccm_mallco_dev.memmap[index + i] = 0; + } + return 0; + } else + return 2; // 偏移超区了. +} + +#endif + +// 释放内存(外部调用) +// memx:所属内存块 +// ptr:内存首地址 +void myfree(void *ptr) { + IRQ_DISABLE(); + u32 free_addr = (u32)ptr; + u32 offset; + if (ptr == NULL) { + IRQ_ENABLE(); + return; // 地址为0. + } else if ((free_addr & 0xf0000000) == 0x20000000) // sram + { + offset = (u32)ptr - (u32)mallco_dev.membase; + mem_free(offset); // 释放内存 + } else { + offset = (u32)ptr - (u32)exmallco_dev.membase; + exmem_free(offset); // 释放内存 + } + // printf ("free:%#X\r\n",free_addr); + IRQ_ENABLE(); +} + +// 分配内存(外部调用) +// 首先尝试在内部分配,失败后再外部分配 +// size:内存大小(字节) +// 返回值:分配到的内存首地址. +void *mymalloc(size_t size) { + IRQ_DISABLE(); + u32 offset; + void *ret_addr = NULL; + if (size > 5 * 1024) + offset = 0XFFFFFFFF; + else + offset = mem_malloc(size); + if (offset != 0XFFFFFFFF) { + ret_addr = (void *)((u32)mallco_dev.membase + offset); + } else { + offset = exmem_malloc(size); + if (offset != 0XFFFFFFFF) { + ret_addr = (void *)((u32)exmallco_dev.membase + offset); + } + } + // printf ("malloc:%#X,%d\r\n",(u32)ret_addr,size); + IRQ_ENABLE(); + return ret_addr; +} + +// 分配内存(外部调用) +// 首先尝试在内部分配,失败后再外部分配 +// size:内存大小(字节) +// 返回值:分配到的内存首地址. +void *mymalloc_fast(u32 size) { + IRQ_DISABLE(); + u32 offset; + void *ret_addr = NULL; + offset = mem_malloc(size); + if (offset != 0XFFFFFFFF) { + ret_addr = (void *)((u32)mallco_dev.membase + offset); + } else { + offset = exmem_malloc(size); + if (offset != 0XFFFFFFFF) { + ret_addr = (void *)((u32)exmallco_dev.membase + offset); + } + } + // printf ("malloc:%#X,%d\r\n",(u32)ret_addr,size); + IRQ_ENABLE(); + return ret_addr; +} + +// 分配外部内存(外部调用) +// 首先尝试在内部分配,失败后再外部分配 +// size:内存大小(字节) +// 返回值:分配到的内存首地址. +void *mymalloc_exm(u32 size) { + IRQ_DISABLE(); + u32 offset; + void *ret_addr = NULL; + offset = exmem_malloc(size); + if (offset != 0XFFFFFFFF) { + ret_addr = (void *)((u32)exmallco_dev.membase + offset); + } + IRQ_ENABLE(); + return ret_addr; +} + +#if USE_CCM == 1 + +// 释放CCM内存 +void myfree_ccm(void *ptr) { + IRQ_DISABLE(); + u32 free_addr = (u32)ptr; + u32 offset; + if (ptr == NULL) { + IRQ_ENABLE(); + return; // 地址为0. + } else if ((free_addr & 0xf0000000) == 0x10000000) // sram + { + offset = (u32)ptr - (u32)ccm_mallco_dev.membase; + ccm_free(offset); // 释放内存 + } else { + offset = (u32)ptr - (u32)exmallco_dev.membase; + exmem_free(offset); // 释放内存 + } + // printf ("free:%#X\r\n",free_addr); + IRQ_ENABLE(); +} + +// 分配CCM内存 +void *mymalloc_ccm(u32 size) { + IRQ_DISABLE(); + u32 offset; + void *ret_addr = NULL; + offset = ccm_malloc(size); + if (offset != 0XFFFFFFFF) { + ret_addr = (void *)((u32)ccm_mallco_dev.membase + offset); + } else { + offset = exmem_malloc(size); + if (offset != 0XFFFFFFFF) { + ret_addr = (void *)((u32)exmallco_dev.membase + offset); + } + } + IRQ_ENABLE(); + return ret_addr; +} + +#endif + +// 重新分配内存(外部调用) +// memx:所属内存块 +//*ptr:旧内存首地址 +// size:要分配的内存大小(字节) +// 返回值:新分配到的内存首地址. +void *myrealloc(void *ptr, u32 size) { + IRQ_DISABLE(); + void *ret_addr; + ret_addr = mymalloc_exm(size); + if (ret_addr != NULL) { + if (ptr != NULL) { + mymemcpy(ret_addr, ptr, size); myfree(ptr); } - } - IRQ_ENABLE(); - - return ret_addr; -} + } + IRQ_ENABLE(); - -//分配内存并清零 -void *mycalloc (u32 size) -{ - void *ptr=mymalloc(size); - if (ptr) mymemset(ptr,0,size); - return ptr; + return ret_addr; } - - - - +// 分配内存并清零 +void *mycalloc(u32 size) { + void *ptr = mymalloc(size); + if (ptr) + mymemset(ptr, 0, size); + return ptr; +} //////////////////////////////////////////////////////////////////////////////// -//基本调用接口 - - - - -void *malloc(size_t size) -{ - return mymalloc(size); -} - -void free (void *ptr) -{ - myfree(ptr); -} - - -void *realloc(void *ptr,size_t size) -{ - return myrealloc(ptr,size); -} - - -void *calloc(size_t nmemb, size_t size) -{ - return mycalloc(nmemb*size); -} - - - - - - - - - +// 基本调用接口 +void *malloc(size_t size) { return mymalloc(size); } +void free(void *ptr) { myfree(ptr); } +void *realloc(void *ptr, size_t size) { return myrealloc(ptr, size); } +void *calloc(size_t nmemb, size_t size) { return mycalloc(nmemb * size); } diff --git a/Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/fs.c b/Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/fs.c index f15a480..a528f0f 100644 --- a/Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/fs.c +++ b/Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/fs.c @@ -36,7 +36,9 @@ #include -#include HTTPD_FSDATA_FILE +// #include HTTPD_FSDATA_FILE +#include "fsdata.txt" + /*-----------------------------------------------------------------------------------*/ diff --git a/Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/fsdata.c b/Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/fsdata.txt similarity index 100% rename from Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/fsdata.c rename to Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/fsdata.txt diff --git a/Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/makefsdata/makefsdata.c b/Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/makefsdata/makefsdata.tmp similarity index 100% rename from Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/makefsdata/makefsdata.c rename to Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/http/makefsdata/makefsdata.tmp diff --git a/Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/tftp/tftp_port.c b/Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/tftp/tftp_port.tmp similarity index 100% rename from Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/tftp/tftp_port.c rename to Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/tftp/tftp_port.tmp diff --git a/Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/tftp/tftp_server.c b/Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/tftp/tftp_server.tmp similarity index 100% rename from Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/tftp/tftp_server.c rename to Project/Src/rt-thread/components/net/lwip-2.1.0/src/apps/tftp/tftp_server.tmp diff --git a/Project/Src/rt-thread/components/net/lwip-2.1.0/src/arch/sys_arch.c b/Project/Src/rt-thread/components/net/lwip-2.1.0/src/arch/sys_arch.c index ee96249..4165fbb 100644 --- a/Project/Src/rt-thread/components/net/lwip-2.1.0/src/arch/sys_arch.c +++ b/Project/Src/rt-thread/components/net/lwip-2.1.0/src/arch/sys_arch.c @@ -27,7 +27,7 @@ * Change Logs: * Date Author Notes * 2012-12-8 Bernard add file header - * export bsd socket symbol for RT-Thread Application Module + * export bsd socket symbol for RT-Thread Application Module * 2017-11-15 Bernard add lock for init_done callback. * 2018-11-02 MurphyZhao port to lwip2.1.0 */ @@ -52,6 +52,8 @@ #include #include + +#if 0 /* * Initialize the network interface device * @@ -213,6 +215,8 @@ int lwip_system_init(void) } INIT_PREV_EXPORT(lwip_system_init); +#endif + void sys_init(void) { /* nothing on RT-Thread porting */ @@ -220,7 +224,7 @@ void sys_init(void) void lwip_sys_init(void) { - lwip_system_init(); + // lwip_system_init(); } /* @@ -272,7 +276,7 @@ void sys_sem_signal(sys_sem_t *sem) * * @return If the timeout argument is non-zero, it will return the number of milliseconds * spent waiting for the semaphore to be signaled; If the semaphore isn't signaled - * within the specified time, it will return SYS_ARCH_TIMEOUT; If the thread doesn't + * within the specified time, it will return SYS_ARCH_TIMEOUT; If the thread doesn't * wait for the semaphore, it will return zero */ u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) @@ -553,7 +557,7 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) return SYS_ARCH_TIMEOUT; else { - if (ret == RT_EOK) + if (ret == RT_EOK) ret = 1; } diff --git a/Project/Src/rt-thread/components/net/lwip-2.1.0/src/core/mem.c b/Project/Src/rt-thread/components/net/lwip-2.1.0/src/core/mem.tmp similarity index 100% rename from Project/Src/rt-thread/components/net/lwip-2.1.0/src/core/mem.c rename to Project/Src/rt-thread/components/net/lwip-2.1.0/src/core/mem.tmp diff --git a/Project/Src/rt-thread/components/net/lwip-2.1.0/src/include/netif/ethernetif.h b/Project/Src/rt-thread/components/net/lwip-2.1.0/src/include/netif/ethernetif.h index bdad32e..03fa729 100644 --- a/Project/Src/rt-thread/components/net/lwip-2.1.0/src/include/netif/ethernetif.h +++ b/Project/Src/rt-thread/components/net/lwip-2.1.0/src/include/netif/ethernetif.h @@ -18,7 +18,7 @@ struct eth_device { /* inherit from rt_device */ - struct rt_device parent; + // struct rt_device parent; /* network interface for lwip */ struct netif *netif; @@ -29,8 +29,8 @@ struct eth_device rt_uint8_t link_status; /* eth device interface */ - struct pbuf* (*eth_rx)(rt_device_t dev); - rt_err_t (*eth_tx)(rt_device_t dev, struct pbuf* p); + // struct pbuf* (*eth_rx)(rt_device_t dev); + // rt_err_t (*eth_tx)(rt_device_t dev, struct pbuf* p); }; rt_err_t eth_device_ready(struct eth_device* dev); diff --git a/Project/Src/rt-thread/components/net/lwip-2.1.0/src/netif/ethernetif.c b/Project/Src/rt-thread/components/net/lwip-2.1.0/src/netif/ethernetif.tmp similarity index 100% rename from Project/Src/rt-thread/components/net/lwip-2.1.0/src/netif/ethernetif.c rename to Project/Src/rt-thread/components/net/lwip-2.1.0/src/netif/ethernetif.tmp diff --git a/Project/make.py b/Project/make.py index 13fb4b4..eb90830 100644 --- a/Project/make.py +++ b/Project/make.py @@ -77,14 +77,18 @@ INC=[ '-ISrc/zlib', '-ISrc/NES', # '-ISrc/TinyUSB/lib/rt-thread', - '-ISrc/TinyUSB/examples/device/cdc_dual_ports/src', - '-ISrc/TinyUSB/src/class/cdc', + '-ISrc/TinyUSB/examples/device/net_lwip_webserver/src', + '-ISrc/TinyUSB/src/class/net', '-ISrc/TinyUSB/src/common', '-ISrc/TinyUSB/src/device', '-ISrc/TinyUSB/src/portable/synopsys/dwc2', '-ISrc/TinyUSB/src', '-ISrc/TinyUSB/src/osal', '-ISrc/TinyUSB/hw', + '-ISrc/TinyUSB/lib/networking', + + '-ISrc/rt-thread/components/net/lwip-2.1.0/src/include', + '-ISrc/rt-thread/components/net/lwip-2.1.0/src/arch/include' ] SRC_DIR=[ @@ -102,10 +106,14 @@ SRC_DIR=[ 'Src/rt-thread/src', # 'Src/sqlite3', 'Src/TinyUSB/src/class/cdc', + 'Src/TinyUSB/src/class/net', 'Src/TinyUSB/src/common', 'Src/TinyUSB/src/device', 'Src/TinyUSB/src/portable/synopsys/dwc2', + 'Src/TinyUSB/lib/networking', # 'Src/TinyUSB/src', + + 'Src/rt-thread/components/net/lwip-2.1.0/src', ] SRC=[ @@ -156,8 +164,9 @@ SRC=[ 'Src/NES/nes_mapper.c', 'Src/TinyUSB/src/tusb.c', - 'Src/TinyUSB/lib/rt-thread/tusb_rt_thread_port.c', - 'Src/TinyUSB/examples/device/cdc_dual_ports/src/usb_descriptors.c', + # 'Src/TinyUSB/lib/rt-thread/tusb_rt_thread_port.c', + 'Src/TinyUSB/examples/device/net_lwip_webserver/src/main.c', + 'Src/TinyUSB/examples/device/net_lwip_webserver/src/usb_descriptors.c', 'Src/TinyUSB/hw/bsp/board.c' ]