RTOS 高频问点这份笔记用于准备 RT-Thread、FreeRTOS、Zephyr 等实时操作系统相关面试。重点是任务调度、同步通信、中断配合、资源保护和常见问题排查。
1. RTOS 是什么?RTOS 是 Real-Time Operating System,实时操作系统。它为嵌入式系统提供任务调度、任务间通信、同步机制、定时器和内存管理等能力。
RTOS 不等于“速度一定更快”,它的重点是:
让多个任务结构更清晰。
提供可控的实时响应。
管理任务优先级。
提供任务间通信和同步机制。
面试答法:
RTOS 主要解决复杂嵌入式程序的结构和实时性问题。裸机程序通常依靠主循环和中断,业务复杂后会变得难维护;RTOS 可以把通信、采集、控制、显示等功能拆成不同任务,通过队列、信号量、事件等机制协作。
2. RTOS 和裸机程序的区别裸机程序特点:
一个 while(1) 主循环。
外设事件通常靠中断处理。
程序结构简单。
适合小项目、逻辑简单的设备。
缺点:
多功能并发时结构容易混乱。
延时函数可能阻塞其他逻辑。
任务优先级不好管理。
RTOS 程序特点:
多任务并发运 ...
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120# 嵌入式外设高频问点这份笔记按外设分类整理:GPIO、UART、I2C、SPI、PWM、ADC、定时器、中断、DMA。每章都包含概念、面试问法、常见追问和排查思路。## 1. 外设问题的通用排查思路嵌入式外设调试不要一上来就改代码,建议按下面顺序:1. 看原理图:确认引脚、供电、电平、上下拉、外设连接。2. 看芯片手册:确认引脚复用、寄存器、时序、最大频率。3. 看代码配置:确认时钟、GPIO 模式、外设参数、初始化顺序。4. 看运行现象:日志、返回值、状态寄存器、中断标志。5. 看信号: ...
1234567891011121314151617181920212223242526272829303132# 嵌入式 C 语言高频问点这份笔记面向嵌入式方向面试,重点不是单纯背 C 语言语法,而是把 C 语言和 MCU、寄存器、中断、内存、驱动代码联系起来讲。## 1. 面试回答思路回答嵌入式 C 问题时,尽量使用这个结构:1. 先说概念:这个关键字、语法或机制是什么。2. 再说嵌入式场景:它在 MCU、寄存器、外设、中断、RTOS 中怎么用。3. 补充风险点:容易踩什么坑。4. 给一个小例子:用代码或排查场景证明自己会用。例如回答 `volatile`:> `volatile` 告诉编译器变量可能被当前代码之外的因素改变,不能把读写随意优化掉。嵌入式里常用于硬件寄存器、中断共享变量、DMA 缓冲区状态标志。它解决的是编译器优化可见性问题,不等于线程安全;如果多个任务或中断同时修改变量,还需要临界区、互斥锁或原子操作保护。## 2. 基本数据类型### 高频问点:C 语言中 `int` 一定是 32 位吗?不一定。C 标准只规定了类型之间的最小范围和大小关系,不保证 `int ...
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758# 嵌入式构建系统高频问点这份笔记对应岗位要求中的“使用过 Make、CMake、xmake、SCons 等构建系统中的一种”。面试时不要只说“我用过 CMake”,更重要的是能说明构建系统在嵌入式项目里负责什么、常见错误怎么排查、交叉编译和链接脚本是什么。## 1. 构建系统是做什么的?构建系统负责把源代码变成可运行或可烧录的目标文件。它通常管理:- 源文件列表:哪些 `.c`、`.cpp`、`.s` 文件参与编译。- 头文件路径:`include` 目录在哪里。- 宏定义:例如芯片型号、功能开关、调试开关。- 编译参数:优化等级、警告选项、CPU 架构。- 汇编参数:启动文件、底层汇编代码。- 链接参数:链接脚本、库文件、内存布局。- 输出文件:`.elf`、`.bin`、`.hex`、`.map`。- 烧录命令:把固件下载到开发板。面试答法:> 构建系统不是简单地 ...
1.在SiFli-SDK中创建Borad请参考SiFli Wiki,链接https://docs.sifli.com/projects/sdk/latest/sf32lb52x/app_development/create_board.html
2.修改自己Borad中的PinMux以下为本人设计板子所使用的IO
(1)bsp_lcd_tp.c12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061#include "bsp_board.h"#define LCD_RESET_PIN (0) //LCD复位#define TP_RESET (41) //TP复位#define LCD_VADD_EN (1) //LCD电源#define LCD_POWER_EN (9) //LCD开关/***************************LCD ************************* ...
service服务
代码解析广播设备名称123456/* 获取设备蓝牙地址并生成包含MAC地址的设备名称 */ret = ble_get_public_address(&addr);if (ret == HL_ERR_NO_ERROR) rt_snprintf(local_name, 31, "E_Badge"); // 扫描出来的设备名称else memcpy(local_name, DEFAULT_LOCAL_NAME, sizeof(DEFAULT_LOCAL_NAME));
自定义服务UUID(Unknown Service)12345678910111213/* 自定义服务UUID定义*/#define app_svc_uuid { \ 0x73, 0x69, 0x66, 0x6c, \ 0x69, 0x5f, 0x61, 0x70, \ 0x70, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00};/* 自定义特征UUID定义 */#def ...
1.1、堆栈1、堆:即heap,一块空闲的内存,提供管理函数
malloc:从堆里面划出一块空间给程序使用
free:用完之后,标记空闲,可以再次使用
2、栈:即stack,函数调用时局部变量保存在栈中,当前程序环境可以保存在栈中,可以分配一块空间用作栈
堆(heap)意思就是被管理就叫做堆,栈(stack)就是栈寄存器指向的就叫做栈
1.3FreeRTOS内存管理方法1、Heap_1只实现了pvPortMalloc,没有实现vPortFree。
**pvPortMalloc**:用来分配内存的函数。你需要多少内存,它就给你分配,并返回一个指针指向这块内存。
**vPortFree**:用来释放之前分配的内存的函数。当你不再需要某块内存时,调用它把内存还给系统。
即:适合分配一次内存后就一直使用的场景,不需要频繁释放内存。
(1)数组定义:
123456789/* Allocate the memory for the heap. */##if ( configAPPLICATION_ALLOCATED_HEAP == 1 )/* The application writer ha ...
1.1FreeRTOS目录结构
核心文件有两个:
FreeRTOS/Source/tasks 必选,任务操作
FreeRTOS/Source/list.c 必选,列表
FreeRTOS/Source/queue.c 基本必需,提供队列操作、信号量操作
FreeRTOS/Source/timer.c 可选,重置事件
FreeRTOS/Source/event_groups.c 可选,提供时间组(event froup)
FreeRTOS/Source/croutine.c 可选,过时了
1.2头文件1、FreeRTOSConfig.c
FreeRTOS的配置文件,例如:选择跳读算法 configUSE_PREEMPTION,每个DEMO都必定含有,修改demo的时候是修改这个文件
2、FreeRTOS.h
调用API必需含有此文件,在包含其他头文件例 ...
串的定义串是由零个或者多个字符组成的有限序列,又叫字符串。
一般记为s=”a1a2…an”(n≥0),s是串的名字,引号中的字符序列是串的值而不是内容。ai(1≤i≤n)可以是字母、数字等,i是改字符在串中的位置。
串中的字符数目n称为串的长度,定义中谈到“有限”指的是长度n是有一个有限的数值。
零个字符的串称为空串,长度为0,直接用两个“”””表示。
所谓的序列,说明串的相邻字符之间有前驱和后继的关系。
空格串:只是包含空格的串。
字串和主串:串中任意个数的连续字符组成的子序列称为该串的子串,包含字串的串称为主串。
字串在珠串的位置就是字串的第一个字符在主串的序号。
串的比较对于两个不相等的串进行判断大小:
给定义两个串:s=“a1a2…an”,t=“b1b2…bm”,当满足以下条件之一时,s<t。
(1)n<m,且ai = bi(i=1,2,…,n)
例如:s=“hap”,t=“happy”,s<t
(2)存在某个≤min(m,n),使得ai=bi(i=1,2,…,k-1), ...
栈的定义栈(stack)是限定仅在表尾进行插入和删除操作的线性表。(指的是栈顶)栈顶:插入和删除的一端栈底:另外一段空栈:不含任何数据元素的栈栈又称:后进先出的线性表,简称LIFO结构
注意:栈元素具有线性表关系,即前驱后继关系。特殊之处就是这个线性表的插入和删除位置,只能在栈顶进行。栈底是固定的,最先进栈的只能在栈底。
栈的插入操作叫做进栈,也叫压栈、入栈。
栈的删除操作,叫做出栈,也叫弹栈。
栈的抽象数据类型push:插入(进栈) pop:删除(出栈)
123456789101112ADT 栈(stack)Data 同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。operation InitStack(*S):初始化操作,建立一个空栈s。 DestroyStack(*S):若栈存在,则销毁它。 CleanrStack(*S):将栈清空。 StackEmpyt(S):若栈为空,返回true,否则返回false。 GetTop(S,*e):若栈存在且非空,用e返回s的栈元素 Push(*S,e):若栈s存在,插入新元素e到 ...


















