一些嵌入式软件开发中重要的理论概念


大家好,我是杂烩君。

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

什么是堆栈水印检测?

堆栈水印检测是一种动态监测任务堆栈使用情况的技术。在任务初始化时,将整个堆栈空间填充特定的标识模式(如 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会影响s2
strcpy(s1.name, "Bob");
printf("修改后:\n");
printf("s1.name: %s\n", s1.name);  // Bob
printf("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不影响s4
strcpy(s3.name, "Dave");
printf("修改后:\n");
printf("s3.name: %s\n", s3.name);  // Dave
printf("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<len; i++) 
    {
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // 等待发送完成
        USART_SendData(USART1, data[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)是确保内存操作顺序性的底层机制。在弱一致性内存模型中,编译器/处理器可能重排指令,内存屏障强制特定操作顺序。关键场景包括多核通信、外设寄存器访问等。

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



文章作者: 杂烩君
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 杂烩君 !
  目录