首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >嵌入式软件八股文C 语言、硬件与操作系统基础核心知识(面试必看,建议收藏!!!),建议对照问题做一遍在于答案进行对照

嵌入式软件八股文C 语言、硬件与操作系统基础核心知识(面试必看,建议收藏!!!),建议对照问题做一遍在于答案进行对照

作者头像
紫昭
发布2025-11-29 08:49:30
发布2025-11-29 08:49:30
450
举报

引言

在嵌入式开发和系统编程领域,对 C 语言、硬件与处理器以及操作系统相关知识的深入理解至关重要。本文将详细解析一系列关键概念,包括staticvolatile关键字、内存对齐、中断、硬件术语、字节序、实时操作系统特性以及死锁与同步机制等,旨在帮助开发者夯实基础,提升编程能力。

问题

请解释 static 关键字在 C 语言中的作用(变量、函数、局部变量)。

volatile 关键字的作用是什么?举一个嵌入式场景中的使用例子。

什么是内存对齐(Memory Alignment)?为什么在嵌入式系统中需要关注它?

硬件与处理器

什么是中断(Interrupt)?在编写中断服务程序(ISR)时需要注意哪些问题?

解释以下术语:GPIO、PWM、ADC、DMA。

大端(Big-Endian)和小端(Little-Endian)的区别是什么?如何用代码检测当前系统的字节序?

操作系统与实时性 实时操作系统(RTOS)中的“实时性”如何保证?举例说明任务调度机制(如优先级抢占)。

什么是死锁(Deadlock)?如何避免死锁?

请解释信号量(Semaphore)和互斥锁(Mutex)的区别及使用场景。

一、C 语言基础

1. static关键字
2. 术语解释
3. 大端和小端
2. 死锁
3. 信号量和互斥锁

静态局部变量:在函数内部使用static修饰的局部变量,仅在首次调用函数时初始化,后续调用保留上次结束时的值。示例代码如下:

代码语言:javascript
复制
#include <stdio.h>

void func() {
    static int count = 0;
    count++;
    printf("count: %d\n", count);
}

int main() {
    func(); 
    func(); 
    return 0;
}

静态全局变量:全局变量前加static,其作用域局限于定义它的源文件,其他源文件无法通过extern引用。

静态函数:用static修饰的函数,作用域限于定义它的源文件,避免不同源文件函数名冲突。

2. volatile关键字

该关键字用于防止系统对变量访问进行优化。在嵌入式系统中,硬件寄存器的值可能被硬件自行修改,编译器的优化可能导致错误。例如读取硬件定时器计数值:

代码语言:javascript
复制
volatile unsigned int *timer_register = (volatile unsigned int *)0x40000000; 
unsigned int timer_value;

timer_value = *timer_register;
3. 内存对齐

概念:数据在内存中的起始地址须为特定值(通常是数据类型大小的整数倍)的整数倍。

原因:现代计算机内存按字(如 4 字节或 8 字节)访问,未对齐数据可能需多次访问内存,增加访问时间。部分处理器只能访问对齐数据,否则可能出现硬件异常或性能下降。

规则:基本数据类型对齐值通常等于自身大小,结构体对齐值为其成员中最大对齐值,成员间可能存在填充字节。

示例

代码语言:javascript
复制
#include <stdio.h>

struct Example1 {
    char c;    
    int i;     
    short s;   
};

int main() {
    printf("sizeof(struct Example1): %zu\n", sizeof(struct Example1));
    return 0;
}

此结构体中,char c占 1 字节,为满足int i(对齐值 4)的对齐要求,c后填充 3 字节,i从地址 4 开始占 4 字节,short s(对齐值 2)从地址 8 开始占 2 字节,结构体总大小为 12 字节。

还可通过调整结构体成员顺序减少内存占用,也能使用#pragma pack指令手动控制对齐,但可能影响性能。

二、硬件与处理器

1. 中断

定义:程序运行中接收到中断信号,打断原执行流程,进入中断服务函数,执行完毕后返回原逻辑。

编写注意事项

  • 执行时间:应短小精悍,避免过长影响系统实时性,因执行时其他中断可能被屏蔽。
  • 禁用不必要操作:避免复杂计算、I/O 操作或调用可能阻塞的函数。
  • 保存和恢复上下文:进入和退出中断服务程序时,分别保存和恢复处理器上下文(如寄存器值)。
  • 临界区保护:若与主程序或其他中断服务程序共享资源,需保护临界区,防止数据竞争。

GPIO:通用输入输出,可通过软件配置为输入或输出功能的引脚,用于控制外部设备或读取信号。

PWM:脉冲宽度调制,通过控制脉冲信号占空比实现对模拟信号的控制,常用于电机调速、灯光调光。

ADC:模数转换器,将模拟信号转换为数字信号供微控制器或计算机处理。

DMA:直接内存访问,无需 CPU 干预即可实现内存和外设间的数据传输,提高效率,减轻 CPU 负担。

区别:大端模式高字节在低地址,小端模式低字节在低地址。

检测代码

代码语言:javascript
复制
#include <stdio.h>

int isLittleEndian() {
    int num = 1;
    char *ptr = (char *)&num;
    return (*ptr == 1);
}

int main() {
    if (isLittleEndian()) {
        printf("当前系统是小端模式\n");
    } else {
        printf("当前系统是大端模式\n");
    }
    return 0;
}

三、操作系统与实时性

1. 实时操作系统的实时性保证

中断机制:快速响应外部中断信号,及时处理紧急事件。

任务调度算法:采用优先级抢占调度算法,维护任务就绪列表,高优先级任务就绪时,暂停低优先级任务并执行高优先级任务,直至其完成或主动放弃 CPU 资源。

时间管理:提供精确时间管理功能,如定时器、延时函数,确保任务按预定时间执行。

定义:多个进程因争夺资源而互相等待,若无外力作用无法推进。

避免方法

  • 破坏互斥条件:允许资源被多进程同时访问,但部分资源特性决定必须互斥访问,适用范围有限。
  • 破坏占有并等待条件:进程申请资源时一次性申请所需全部资源。
  • 破坏不剥夺条件:进程占有资源又申请其他资源无法满足时,操作系统可剥夺其已占资源。
  • 破坏循环等待条件:对资源编号,要求进程按编号顺序申请资源。

信号量:分二进制信号量和计数型信号量。二进制信号量用于同步,控制任务执行顺序;计数型信号量用于资源管理,记录可用资源数量。

互斥锁:保护临界区,确保同一时间只有一个任务访问共享资源,避免数据竞争。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 问题
    • 一、C 语言基础
      • 1. static关键字
      • 2. 术语解释
      • 3. 大端和小端
      • 2. 死锁
      • 3. 信号量和互斥锁
      • 2. volatile关键字
      • 3. 内存对齐
    • 二、硬件与处理器
      • 1. 中断
    • 三、操作系统与实时性
      • 1. 实时操作系统的实时性保证
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档