机器学习在大数据质量检测中的应用案例
2026/1/18 21:42:31
十六进制到十进制换算: 0x400 = 4 × 16² = 4 × 256 = 1024 0x1000 = 1 × 16³ = 1 × 4096 = 4096 0x200 = 2 × 16² = 2 × 256 = 512 0x2000 = 2 × 16³ = 2 × 4096 = 8192| 十六进制 | 十进制 | 字节 | KB |
|---|---|---|---|
| 0x400 | 1024 | 1024字节 | 1KB |
| 0x1000 | 4096 | 4096字节 | 4KB |
| 0x200 | 512 | 512字节 | 0.5KB |
| 0x2000 | 8192 | 8192字节 | 8KB |
STM32F103C8T6的RAM大小为20KB(0x5000字节)
| 内存区域 | 地址范围 | 大小 |
|---|---|---|
| 总RAM | 0x20000000-0x20004FFF | 20KB |
| 栈(Stack) | 向下生长 | 4KB(修改后) |
| 堆(Heap) | 向上生长 | 8KB(修改后) |
| 全局/静态变量 | 中间区域 | 8KB(剩余) |
内存布局示意图(修改后): 0x20005000 ↑ │ 栈(Stack) - 4KB (向下生长) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 0x20004000 ├─────────┤ │ 全局变量 │ │ 静态变量 │ │ 已分配内存 │ ├─────────┤ 0x20002000 ↑ │ 堆(Heap) - 8KB (向上生长) │ 0x20000000栈太小:
堆太小:
栈(4KB):
堆(8KB):
; 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, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ; ========================================================================== ; 修改前:Heap_Size EQU 0x00000200 ; 修改后:Heap_Size EQU 0x00002000 Heap_Size EQU 0x00002000 ; ← 修改这里,改为8KB AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit PRESERVE8 THUMB| 应用场景 | 栈大小 | 堆大小 | 总RAM需求 | 说明 |
|---|---|---|---|---|
| 裸机简单应用 | 1KB | 0.5KB | 1.5KB | 无动态分配,简单控制 |
| 中等复杂度 | 2KB | 4KB | 6KB | 有动态分配,简单网络 |
| JSON解析+网络 | 4KB | 8KB | 12KB | 推荐配置 |
| FreeRTOS简单 | 4KB | 8KB | 12KB+ | 多任务需要更多栈 |
| FreeRTOS复杂 | 6KB | 12KB | 18KB+ | 接近芯片极限 |
// 在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_usage=stack_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秒检查一次}}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文件有关,但不是堆栈设置的问题,而是:
// 错误的(有中文字符):char*json_data="{\"name\":\"合肥\",\"weather\":\"阴\"}";// 正确的(纯ASCII):char*json_data="{\"name\":\"Beijing\",\"weather\":\"Cloudy\"}";必须修改:
原因:
注意事项:
如果还不够用:
这样修改后,您的JSON解析和网络通信应该就能正常工作了。