织梦网站打开慢产品营销方案
2026/4/18 0:10:03 网站建设 项目流程
织梦网站打开慢,产品营销方案,四川省建设监督网,制作html5网站这里写目录标题堆栈大小换算与修改说明一、十六进制到十进制的换算1.1 换算公式1.2 换算结果二、修改前后的对比修改前#xff08;原始配置#xff09;#xff1a;修改后#xff08;新配置#xff09;#xff1a;三、STM32F103C8T6的内存限制四、为什么需要调整堆栈大小原始配置修改后新配置三、STM32F103C8T6的内存限制四、为什么需要调整堆栈大小4.1 原始设置(1KB栈0.5KB堆)的问题4.2 建议设置(4KB栈8KB堆)的好处五、完整的startup文件修改示例六、不同内存需求对应的推荐配置七、验证堆栈是否足够的方法7.1 在代码中添加堆栈使用检查7.2 在Keil/IDE中查看内存使用八、针对您之前报错的解决方案九、修改建议总结堆栈大小换算与修改说明一、十六进制到十进制的换算1.1 换算公式十六进制到十进制换算 0x400 4 × 16² 4 × 256 1024 0x1000 1 × 16³ 1 × 4096 4096 0x200 2 × 16² 2 × 256 512 0x2000 2 × 16³ 2 × 4096 81921.2 换算结果十六进制十进制字节KB0x40010241024字节1KB0x100040964096字节4KB0x200512512字节0.5KB0x200081928192字节8KB二、修改前后的对比修改前原始配置Stack_Size 0x400 1KB栈大小Heap_Size 0x200 0.5KB堆大小总计1.5KB RAM修改后新配置Stack_Size 0x1000 4KB栈大小Heap_Size 0x2000 8KB堆大小总计12KB RAM三、STM32F103C8T6的内存限制STM32F103C8T6的RAM大小为20KB0x5000字节内存区域地址范围大小总RAM0x20000000-0x20004FFF20KB栈(Stack)向下生长4KB修改后堆(Heap)向上生长8KB修改后全局/静态变量中间区域8KB剩余内存布局示意图修改后 0x20005000 ↑ │ 栈(Stack) - 4KB (向下生长) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 0x20004000 ├─────────┤ │ 全局变量 │ │ 静态变量 │ │ 已分配内存 │ ├─────────┤ 0x20002000 ↑ │ 堆(Heap) - 8KB (向上生长) │ 0x20000000四、为什么需要调整堆栈大小4.1 原始设置(1KB栈0.5KB堆)的问题栈太小函数调用层次有限局部变量不能太大中断嵌套可能溢出cJSON递归解析可能溢出堆太小cJSON动态分配内存不够网络数据缓冲区不足字符串操作受限无法使用标准库的malloc4.2 建议设置(4KB栈8KB堆)的好处栈(4KB)支持较深的函数调用可定义较大的局部数组中断处理更安全支持cJSON的递归解析堆(8KB)cJSON有足够内存解析完整JSON可创建较大的动态缓冲区支持标准库函数网络数据处理更灵活五、完整的startup文件修改示例; startup_stm32f103xe.s ; 堆栈配置部分 IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap LDR R0, Heap_Mem LDR R1, (Stack_Mem Stack_Size) LDR R2, (Heap_Mem Heap_Size) LDR R3, Stack_Mem BX LR ALIGN ENDIF ; ; 修改前Stack_Size EQU 0x00000400 ; 修改后Stack_Size EQU 0x00001000 Stack_Size EQU 0x00001000 ; ← 修改这里改为4KB AREA STACK, NOINIT, READWRITE, ALIGN3 Stack_Mem SPACE Stack_Size __initial_sp ; ; 修改前Heap_Size EQU 0x00000200 ; 修改后Heap_Size EQU 0x00002000 Heap_Size EQU 0x00002000 ; ← 修改这里改为8KB AREA HEAP, NOINIT, READWRITE, ALIGN3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit PRESERVE8 THUMB六、不同内存需求对应的推荐配置应用场景栈大小堆大小总RAM需求说明裸机简单应用1KB0.5KB1.5KB无动态分配简单控制中等复杂度2KB4KB6KB有动态分配简单网络JSON解析网络4KB8KB12KB推荐配置FreeRTOS简单4KB8KB12KB多任务需要更多栈FreeRTOS复杂6KB12KB18KB接近芯片极限七、验证堆栈是否足够的方法7.1 在代码中添加堆栈使用检查// 在main.c中添加堆栈使用检查externuint32_t__heap_base;externuint32_t__heap_limit;externuint32_t__initial_sp;externuint32_t__StackTop;externuint32_t__StackLimit;voidcheck_stack_heap_usage(void){// 获取当前栈指针registeruint32_t*stack_ptrasm(sp);// 计算栈使用量uint32_tstack_top(uint32_t)__StackTop;// 栈顶uint32_tstack_usagestack_top-(uint32_t)stack_ptr;uint32_tstack_free(uint32_t)stack_ptr-(uint32_t)__StackLimit;// 计算堆使用量uint32_theap_base(uint32_t)__heap_base;uint32_theap_limit(uint32_t)__heap_limit;printf( 内存使用情况 \r\n);printf(栈大小: %lu bytes (%.1fKB)\r\n,Stack_Size,Stack_Size/1024.0);printf(栈已用: %lu bytes\r\n,stack_usage);printf(栈剩余: %lu bytes\r\n,stack_free);printf(堆大小: %lu bytes (%.1fKB)\r\n,Heap_Size,Heap_Size/1024.0);printf(堆起始: 0x%08lX\r\n,heap_base);printf(堆结束: 0x%08lX\r\n,heap_limit);printf(\r\n);}// 在main函数中定期调用intmain(void){// 初始化...while(1){check_stack_heap_usage();HAL_Delay(10000);// 每10秒检查一次}}7.2 在Keil/IDE中查看内存使用1. 编译后查看.map文件 2. 查找以下信息 Total RO Size (Code RO Data) xxxx Total RW Size (RW Data ZI Data) xxxx Total ROM Size (Code RO Data RW Data) xxxx 3. RW ZI ≈ RAM使用量八、针对您之前报错的解决方案您之前的编译错误确实与startup文件有关但不是堆栈设置的问题而是中文字符编码问题字符串中的中文字符导致编译器无法识别解决方案使用纯ASCII字符的JSON字符串进行测试// 错误的有中文字符char*json_data{\name\:\合肥\,\weather\:\阴\};// 正确的纯ASCIIchar*json_data{\name\:\Beijing\,\weather\:\Cloudy\};九、修改建议总结必须修改Stack_Size: 0x400 → 0x1000 (1KB → 4KB)Heap_Size: 0x200 → 0x2000 (0.5KB → 8KB)原因cJSON需要动态内存分配网络数据需要缓冲区函数调用需要栈空间注意事项STM32F103C8T6只有20KB RAM修改后总共使用12KB还有8KB给全局变量实际使用中监控堆栈使用情况如果还不够用优化代码减少栈使用使用静态分配代替动态分配减少递归深度优化网络缓冲区大小这样修改后您的JSON解析和网络通信应该就能正常工作了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询