网站底部html代码网站建设二公司

张小明 2026/1/9 4:19:10
网站底部html代码,网站建设二公司,小程序软件定制开发,建网站用什么服务器前提介绍静态内存池的具体作用以及为什么要使用静态内存池就不做介绍#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进行投诉反馈,一经查实,立即删除!

咸阳个人兼职网站建设wordpress百度已收录

ComfyUI工作流管理实战:5个高效迁移与分享技巧 【免费下载链接】ComfyUI 最强大且模块化的具有图形/节点界面的稳定扩散GUI。 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI ComfyUI作为模块化的稳定扩散GUI,其节点式工作流设计让AI…

张小明 2026/1/7 3:59:52 网站建设

wordpress 显示pdfseo在线诊断工具

Windows 10 设备管理与更新全解析 一、业务需求的演变与 MDM 的兴起 在当今数字化时代,业务需求正随着工业 4.0 的发展而发生深刻变化。员工的工作模式从传统的朝九晚五、局限于企业局域网内的计算机办公,转变为 724 小时的工作与个人活动模糊边界、随时随地使用多台设备办…

张小明 2026/1/7 4:09:47 网站建设

高新公司网站建设电话网站建设找哪里

第一章:Open-AutoGLM 异常访问监控配置在部署 Open-AutoGLM 服务时,启用异常访问监控是保障系统安全与稳定运行的关键环节。通过合理配置日志采集、行为阈值和告警机制,可有效识别暴力破解、高频请求或非授权访问等潜在威胁。配置日志采集路径…

张小明 2026/1/7 3:29:58 网站建设

兰州网站建设ulezhi唐山网站建设公司哪家好

面对智慧职教平台繁重的课程任务,你是否也在寻找一种更高效的解决方案?这款智能学习助手通过革命性的自动化技术,彻底改变了传统的手动学习模式,为职业教育学生提供了全新的学习体验。 【免费下载链接】hcqHome 简单好用的刷课脚本…

张小明 2026/1/8 5:09:11 网站建设

做网站贵凡科网

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快通常Jmeter的 GUI 模式仅用于调试,在实际的压测项目中,为了让压测机有更好的性能,多用 Jmeter 命令行来进行压测。同时&#xff…

张小明 2026/1/6 12:12:06 网站建设

请公司做网站没有做好可以退钱吗wordpress屏蔽優酷廣告

前言 哇,大家好!上次分享了整体搭建和策略管理的体验,这次我从另一个角度切入,重点围绕统一应用分发和多集群网络治理这两个核心功能进行深入实战。作为一个对分布式应用部署特别感兴趣的开发者,我特别欣赏Kurator在这…

张小明 2026/1/7 4:46:31 网站建设