一、位运算与布尔代数应用场景:寄存器配置、通信协议解析、硬件状态管理
数学原理:通过逻辑与(&)、或(|)、异或(^)及位移(<< / >>)实现位级操作,属于布尔代数的实际应用。
源码实例:// 位反转函数
unsigned int reverse_bits(unsigned int num) {
unsigned int numOfBits = sizeof(num) * 8;
unsigned int reverseNum = 0;
for (unsigned int i = 0; i < numOfBits; i++) {
if (num & (1 << i))
reverseNum |= (1 << ((numOfBits - 1) - i));
}
return reverseNum;
}
此函数通过遍历每一位实现二进制逆序,常用于数据编码(如CRC校验)或特殊外设(如LED矩阵驱动)。
二、定点数运算
应用场景:无浮点单元(FPU)的MCU中实现小数运算(如电机控制、传感器校准)
数学原理:将浮点数映射到整数空间,通过缩放因子(如Q格式)保留精度,本质是线性变换。
源码实例:// 定点数乘法
typedef int16_t fixed_t;
#define FIXED_SHIFT 8
fixed_t fixed_multiply(fixed_t a, fixed_t b) {
return (fixed_t)(((int32_t)a * (int32_t)b) >> FIXED_SHIFT);
}
该代码通过32位中间结果避免溢出,适用于温度补偿、PID控制器等需高效计算的场景。
三、模运算与环形缓冲区
应用场景:串口数据缓存、循环任务调度
数学原理:利用取模(%)操作实现索引循环,避免缓冲区越界。
源码实例:#define BUFFER_SIZE 64
uint8_t buffer[BUFFER_SIZE];
uint8_t read_ptr = 0, write_ptr = 0;
void push_data(uint8_t data) {
buffer[write_ptr % BUFFER_SIZE] = data;
write_ptr++;
}
uint8_t pop_data() {
uint8_t val = buffer[read_ptr % BUFFER_SIZE];
read_ptr++;
return val;
}
此结构在UART接收中断服务程序中广泛使用,确保数据流的连续性。
四、线性代数与滤波算法
应用场景:传感器信号去噪(如加速度计、陀螺仪)
数学原理:滑动平均滤波、卡尔曼滤波等均基于矩阵运算和统计学原理。
源码实例:// 滑动平均滤波
#define WINDOW_SIZE 5
float moving_average(float new_sample) {
static float samples[WINDOW_SIZE] = {0};
static uint8_t index = 0;
samples[index] = new_sample;
index = (index + 1) % WINDOW_SIZE;
float sum = 0;
for (uint8_t i = 0; i < WINDOW_SIZE; i++)
sum += samples;
return sum / WINDOW_SIZE;
}
此算法通过窗口内数据均值抑制高频噪声,常见于ADC采样后处理。
五、数值分析与控制算法
应用场景:电机调速、温度闭环控制
数学原理:PID控制器依赖积分(误差累积)、微分(误差变化率)的离散化计算。
源码实例:typedef struct {
float Kp, Ki, Kd;
float integral;
float prev_error;
} PIDController;
float pid_update(PIDController *pid, float setpoint, float actual) {
float error = setpoint - actual;
pid->integral += error;
float derivative = error - pid->prev_error;
pid->prev_error = error;
return pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative;
}
该实现通过离散化公式将连续系统转化为嵌入式可执行的迭代算法。
|