大家好,我是杂烩君。
本次给大家整理一些嵌入式软件开发中重要的理论概念。
什么是堆栈水印检测?
堆栈水印检测是一种动态监测任务堆栈使用情况的技术。在任务初始化时,将整个堆栈空间填充特定的标识模式(如 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)是确保内存操作顺序性的底层机制。在弱一致性内存模型中,编译器/处理器可能重排指令,内存屏障强制特定操作顺序。关键场景包括多核通信、外设寄存器访问等。
以上就是本次的分享,如果觉得文章有帮助,帮忙转发!谢谢