嵌入式开发:这几个知识点让你少走 3 年弯路

B站影视 内地电影 2025-03-20 10:24 1

摘要:// 直接赋值指针(危险操作)void shallow_copy(Student* dest, const Student* src) { dest->id = src->id; dest->name = src->name; // 共享同一内存地址}Stud

本次给大家整理一些嵌入式软件开发中重要的理论概念。

堆栈水印检测是一种动态监测任务堆栈使用情况的技术。在任务初始化时,将整个堆栈空间填充特定的标识模式(如 0xDEADBEEF)。

随着任务运行,堆栈指针逐渐覆盖这些预设值。通过定期检查未被覆盖的残留标识位置,可精确计算堆栈的历史最大使用量

相较于静态代码分析,该方法能真实反映中断嵌套、递归调用等动态行为的影响。实际应用中需注意两点:

标识模式需避免与正常数据冲突;检测时机应选在任务空闲或切换时,避免干扰实时性。

浅拷贝(Shallow copy)仅复制对象本身的值(指针变量的值),不复制指针指向的实际数据。拷贝后,新旧对象的指针成员指向同一内存地址。

深拷贝(Deep Copy)不仅复制对象本身的值,还会递归复制指针指向的所有数据。拷贝后,新旧对象的指针成员指向独立的内存地址。

关键差异:

浅拷贝例子:

// 直接赋值指针(危险操作)void shallow_copy(Student* dest, const Student* src) { dest->id = src->id; dest->name = src->name; // 共享同一内存地址}Student s1;s1.id = 100;s1.name = malloc(6);strcpy(s1.name, "Alice");Student s2;shallow_copy(&s2, &s1);printf("浅拷贝结果:\n");printf("s1.name=%p: %s\n", s1.name, s1.name); // 输出相同地址printf("s2.name=%p: %s\n\n", s2.name, s2.name);// 修改s1会影响s2strcpy(s1.name, "Bob");printf("修改后:\n");printf("s1.name: %s\n", s1.name); // Bobprintf("s2.name: %s\n", s2.name); // Bob

深拷贝例子:

// 完全独立的数据副本void deep_copy(Student* dest, const Student* src) { dest->id = src->id; dest->name = malloc(strlen(src->name) + 1); // 新分配内存 strcpy(dest->name, src->name); // 复制内容}Student s3;s3.id = 200;s3.name = malloc(6);strcpy(s3.name, "Carol");Student s4;deep_copy(&s4, &s3);printf("深拷贝结果:\n");printf("s3.name=%p: %s\n", s3.name, s3.name); // 不同地址printf("s4.name=%p: %s\n\n", s4.name, s4.name);// 修改s3不影响s4strcpy(s3.name, "Dave");printf("修改后:\n");printf("s3.name: %s\n", s3.name); // Daveprintf("s4.name: %s\n", s4.name); // Carol// 必须分别释放内存free(s1.name);free(s3.name);free(s4.name);

同步处理(Synchronous Processing)任务按顺序执行,当前任务未完成时,后续任务处于阻塞状态。如:

// 同步UART发送(阻塞式)void uart_send_sync(uint8_t *data, uint16_t len) { for(int i=0; i

异步处理(Asynchronous Processing)任务启动后立即返回,通过中断、回调或事件通知结果,不阻塞后续任务。如:

void ADC_IRQHandler { if(ADC_GetITStatus(ADC1, ADC_IT_EOC)) { uint16_t result = ADC_GetConversionValue(ADC1); // 读取结果 process_adc_result(result); // 回调处理 ADC_ClearITPendingBit(ADC1, ADC_IT_EOC); }}

关键差异:

内存屏障(Memory Barriers)是确保内存操作顺序性的底层机制。在弱一致性内存模型中,编译器/处理器可能重排指令,内存屏障强制特定操作顺序。关键场景包括多核通信、外设寄存器访问等。

以上就是本次的分享,如果觉得文章有帮助,帮忙转发!谢谢

来源:嵌入式大杂烩

相关推荐