收企业做网站备案临海受欢迎营销型网站建设

张小明 2026/1/11 9:14:01
收企业做网站备案,临海受欢迎营销型网站建设,做个app,wordpress主题 秀前提介绍静态内存池的具体作用以及为什么要使用静态内存池就不做介绍#xff0c;不清楚的博友可以网上找找介绍或者AI简单了解一下#xff0c;这里的实现为固定大小的静态内存池#xff0c;仅为我自己的一个想法#xff0c;如果有更好的方法与实现逻辑可在评论区指正。整体…前提介绍静态内存池的具体作用以及为什么要使用静态内存池就不做介绍不清楚的博友可以网上找找介绍或者AI简单了解一下这里的实现为固定大小的静态内存池仅为我自己的一个想法如果有更好的方法与实现逻辑可在评论区指正。整体思路流程假设有100个字节的大小我需要按照10个字节为一块一共10组。每次我做申请的时候我就只能获取其中一组使用结束后释放又将其返回到之前容器里面。这里的容器我打算使用链表的数据结构将其管理10组数据我的链表结点就是10个除开头结点而链表本身也需要空间来存储这里就需要使用malloc申请了吗当然不是以下就是我这个设计的妙点。我这里的内存池空间是一个全局变量数组它的生命周期是整个程序。当空闲块没有使用时这块空间可以用来当作链表的结点如下图这里的一个块空间大小是上面描述的10个字节而每个结点则就只是一个指针如果指针按照4字节大小的话那么实际占用的空间就只是前4个字节就必须保证每个块的大小至少为4个字节才能正常构建链表。那么正常构建完成链表后就会是如下所示这样就把一个连续的全局变量数组构建成了一个链表。此时如果需要申请一块内存就会使用头减的方式把head的下一个结点首地址分配出去既分配结点1出去然后把head的下一个结点指向结点2。释放的方法和申请类似使用头插的方式把释放的地址重新放入结点中。示例流程部分代码实现这里我实现了四个对应的API函数mem_pool_init负责对这块全局变量内存进行链表化以及相关特征值的计算并返回相关handle等。mem_pool_status_t mem_pool_init(stc_mem_pool_handle_t *handle, void *mem_pool, uint16_t mem_pool_size, uint16_t node_lenth) { if(handle NULL || mem_pool NULL || mem_pool_size 0 || node_lenth 0 || mem_pool_size%node_lenth ! 0) { mem_pool_log(mem_pool_init error, handle is null or mem_pool is null or mem_pool_size is 0 or node_lenth is 0 or mem_pool_size mod node_lenth! 0\n); return MEM_POOL_PRARMETER_ERROR; } if(handle-is_init) { mem_pool_log(mem_pool_init error, handle is init\n); return MEM_POOL_IS_INIT; } handle-list_head.next_node NULL; handle-list_lenth node_lenth; handle-crr_remaining_lenth node_lenth; handle-mem_pool_size mem_pool_size; handle-node_size mem_pool_size/node_lenth; handle-is_init 1; handle-mem_start_addr (void *)mem_pool; //mem_pool_log(mem_pool start addr:%x, mem_pool_size:%d, node_lenth:%d, node_size:%d\n, handle-mem_start_addr, handle-mem_pool_size, handle-list_lenth, handle-node_size); uint16_t node_size mem_pool_size/node_lenth; uint8_t *start_addr (uint8_t *)mem_pool; mem_node_t *crr_node handle-list_head; for(int i 0; i handle-list_lenth; i) { crr_node-next_node (mem_node_t *)(start_addr i * node_size); crr_node-next_node-next_node NULL; crr_node crr_node-next_node; } #if USE_RTOS_SYS mem_pool_mutex_init(handle-mutex); #endif return MEM_POOL_SUCCESS; }mem_pool_deinit销毁内存池对handle进行一些清空等。mem_pool_status_t mem_pool_deinit(stc_mem_pool_handle_t *handle) { // 如果使用了rtos可以使用一个临界区来保护内存池的初始化和释放 if(handle NULL || handle-is_init 0) { mem_pool_log(mem_pool_deinit error, handle is null or handle is not init\n); return MEM_POOL_PRARMETER_ERROR; } handle-list_head.next_node NULL; handle-crr_remaining_lenth 0; handle-is_init 0; handle-mem_pool_size 0; handle-node_size 0; handle-list_lenth 0; handle-mem_start_addr NULL; #if USE_RTOS_SYS mem_pool_mutex_deinit(handle-mutex); #endif return MEM_POOL_SUCCESS; }mem_pool_alloc通过传入handle申请内存空间。void *mem_pool_alloc(stc_mem_pool_handle_t *handle) { if(handle NULL || handle-is_init 0) { mem_pool_log(mem_pool_alloc error, handle is null or handle is not init\n); return NULL; } #if USE_RTOS_SYS MEM_POOL_MUTEX_LOCK(handle-mutex); #endif void *ret NULL; mem_node_t *crr_node handle-list_head.next_node; if(crr_node NULL) { mem_pool_log(mem_pool_alloc error, crr_node is null\n); return NULL; } ret (void *)crr_node; handle-list_head.next_node crr_node-next_node; handle-crr_remaining_lenth--; #if USE_RTOS_SYS MEM_POOL_MUTEX_UNLOCK(handle-mutex); #endif return ret; }mem_pool_free通过传入handle与释放地址做相关释放。mem_pool_status_t mem_pool_free(stc_mem_pool_handle_t *handle, void *mem) { if(handle NULL || mem NULL) { mem_pool_log(mem_pool_free error, handle is null or handle is not init or mem is null\n); return MEM_POOL_PRARMETER_ERROR; } if(handle-is_init 0) { mem_pool_log(mem_pool_free error, handle is not init\n); return MEM_POOL_IS_NOT_INIT; } uintptr_t mem_addr (uintptr_t)mem; uintptr_t pool_start (uintptr_t)(handle-mem_start_addr); uintptr_t pool_end pool_start handle-mem_pool_size; //if(mem handle-mem_start_addr || mem (handle-mem_start_addr handle-mem_pool_size)) { if(mem_addr pool_start || mem_addr pool_end) { mem_pool_log(mem_pool_free error, mem is out of mem_pool\n); return MEM_POOL_PRARMETER_ERROR; } //if((mem - handle-mem_start_addr) % handle-node_size ! 0) { if((mem_addr - pool_start) % handle-node_size ! 0) { mem_pool_log(mem_pool_free error, this not node addr\n); return MEM_POOL_PRARMETER_ERROR; } #if USE_RTOS_SYS MEM_POOL_MUTEX_LOCK(handle-mutex); #endif memset(mem, 0, handle-node_size); mem_node_t *free_node (mem_node_t *)mem; free_node-next_node handle-list_head.next_node; handle-list_head.next_node free_node; handle-crr_remaining_lenth; #if USE_RTOS_SYS MEM_POOL_MUTEX_UNLOCK(handle-mutex); #endif return MEM_POOL_SUCCESS; }示例应用这里我写了一个简单的测试用例使用260个字节全局变量分成10个块每个块空间占用26给字节。#define TEST_MEM_POOL_NODE_LENTH (10) static uint8_t test_data[260]; static stc_mem_pool_handle_t test_handle; typedef struct { char name[10]; char number[11]; char sex[2]; char age[3]; long long c; } test_t; typedef struct { test_t va; int a; } cs; int main(void) { printf(%d,%d\n, sizeof(cs), sizeof(test_t)); mem_pool_init(test_handle, test_data, sizeof(test_data), TEST_MEM_POOL_NODE_LENTH); test_node_info(test_handle); test_t *xiao_m (test_t *)mem_pool_alloc(test_handle); if(xiao_m NULL) { printf(mem_pool_alloc error %p\n, xiao_m); } test_t *xiao_h (test_t *)mem_pool_alloc(test_handle); if(xiao_h NULL) { printf(mem_pool_alloc error %p\n, xiao_h); } test_t *xiao_l (test_t *)mem_pool_alloc(test_handle); if(xiao_l NULL) { printf(mem_pool_alloc error %p\n, xiao_l); } printf(xiao_m: %p\n, xiao_m); printf(xiao_h: %p\n, xiao_h); printf(xiao_l: %p\n, xiao_l); memcpy(xiao_m-name, xiao_m, sizeof(xiao_m)); memcpy(xiao_h-name, xiao_h, sizeof(xiao_h)); memcpy(xiao_l-name, xiao_l, sizeof(xiao_l)); memcpy(xiao_m-number, 10086, sizeof(10086)); memcpy(xiao_h-number, 1008611, sizeof(1008611)); memcpy(xiao_l-number, 10010, sizeof(10010)); memcpy(xiao_m-age, 20, sizeof(20)); memcpy(xiao_h-age, 19, sizeof(19)); memcpy(xiao_l-age, 18, sizeof(18)); memcpy(xiao_m-sex, n, sizeof(n)); memcpy(xiao_h-sex, n, sizeof(n)); memcpy(xiao_l-sex, l, sizeof(l)); printf(xiao_m-name: %s\n, xiao_m-name); printf(xiao_h-name: %s\n, xiao_h-name); printf(xiao_l-name: %s\n, xiao_l-name); printf(xiao_m-number: %s\n, xiao_m-number); printf(xiao_h-number: %s\n, xiao_h-number); printf(xiao_l-number: %s\n, xiao_l-number); printf(xiao_m-sex: %s\n, xiao_m-sex); printf(xiao_h-sex: %s\n, xiao_h-sex); printf(xiao_l-sex: %s\n, xiao_l-sex); printf(xiao_m-age: %s\n, xiao_m-age); printf(xiao_h-age: %s\n, xiao_h-age); printf(xiao_l-age: %s\n, xiao_l-age); test_node_info(test_handle); if(mem_pool_free(test_handle, xiao_m) ! MEM_POOL_SUCCESS) { printf(mem_pool_free error %p\n, xiao_m); } if(mem_pool_free(test_handle, xiao_h) ! MEM_POOL_SUCCESS) { printf(mem_pool_free error %p\n, xiao_h); } if(mem_pool_free(test_handle, xiao_l) ! MEM_POOL_SUCCESS) { printf(mem_pool_free error %p\n, xiao_l); } test_node_info(test_handle); return 0; } void test_node_info(stc_mem_pool_handle_t *handle) { printf(\r\n); mem_node_t *crr_node handle-list_head.next_node; for(int i 0; i handle-crr_remaining_lenth; i) { if(crr_node NULL) { //printf(crr_node is null\n); break; } printf(crr_addr:%p\n, crr_node); crr_node crr_node-next_node; } }后面还有释放后的链表打印图太长了就不展示了。最后我使用我的这套静态内存池的方案自己写了一个AT指令驱动库使用ESP8266 WIFI 模块做的例子。使用收发循环队列静态内存池UART DMA接收的方案做的支持URC专用回调与注册已经跑通了onenet的mqtt方案以及http ota升级证明这套静态内存池方案可用。上面说的后续我都会以博客的方式分享出来。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

高端公司网站设计个人租车网站源码

音乐文件加密处理神器:一站式管理你的数字音乐收藏 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://…

张小明 2026/1/11 0:03:41 网站建设

做网站的意义是什么用xml可不可以做网站

基于6G的物联网绿色移动边缘计算 1. 引言 5G及5G之后(B5G)的移动通信框架是当今世界新兴的通信框架。众多设备和管理系统参与到现代通信以及计算框架的发展中。云、边缘和雾计算范式的引入,使通信和计算系统更加高效。这种分层计算的优势在于能优化能源和资源的利用。 在…

张小明 2026/1/1 13:02:33 网站建设

广州骏域网站建设专家 V国产十大erp软件

为何测试工程师必须掌握内存泄漏定位 在持续集成与敏捷开发成为主流的当下,内存泄漏已不再是纯粹的开发问题。根据行业数据,约23%的线上故障源于渐进式内存泄漏,而这些泄漏中近六成可通过系统化的测试方法在发布前捕获。作为质量守门人&…

张小明 2026/1/11 4:33:13 网站建设

培训行业网站建设的重要性福州网站建设索q479185700

7个OptiSystem高效仿真技巧:从基础操作到实战应用 【免费下载链接】OptiSystem仿真实例分享 OptiSystem仿真实例欢迎来到OptiSystem仿真实例资源页面 项目地址: https://gitcode.com/Open-source-documentation-tutorial/5e61e 在现代光纤通信系统设计中&…

张小明 2025/12/27 3:47:25 网站建设

罗湖区住房和建设网站做电商网站需要注册什么公司

免费试用额度发放:吸引新用户尝试GPUtoken服务 在AI应用落地的“最后一公里”,最常听到的问题不是“模型够不够强”,而是:“我该怎么快速验证它能不能解决我的问题?” 尤其是中小团队或独立开发者,面对动辄…

张小明 2026/1/9 4:27:48 网站建设

网站侧边栏菜单珠海建网站的网络公司

国内私有化音视频SDK领域五家领先企业推荐在当今时代,音视频技术正以惊人的速度迅猛发展,音视频SDK在众多行业中所起到的作用愈发关键。无论是教育、医疗、金融领域,还是社交、娱乐等行业,音视频SDK都为企业打造了高效且稳定的音视…

张小明 2026/1/10 19:19:46 网站建设