news 2026/9/25 5:41:38

Langchain .. 学习 --- LCEL和Runnable粗

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Langchain .. 学习 --- LCEL和Runnable粗

一、什么是 Q 饱和运算?

1. 核心痛点:普通运算的 “数值回绕”

普通算术运算(如 ADD/SUB)溢出时,数值会按补码规则 “回绕”,导致结果完全错误:

示例:int8_t 类型最大值 127 + 1 → 结果变成 -128(而非预期的 127);

示例:int8_t 类型最小值 -128 - 1 → 结果变成 127。

2. Q 饱和运算的本质

Q 饱和运算(Saturating Arithmetic)是 ARM 指令集中带 Q 前缀的特殊运算,核心逻辑:

运算结果超出目标数据类型的数值范围(上限 / 下限) 时,结果被 “钳位” 到该类型的极值;

同时置位 APSR 寄存器的 Q 标志位(溢出标记)。

二、核心基础:APSR 的 Q 标志位

Q 饱和运算的 “溢出标记” 依赖 APSR(应用程序状态寄存器)的 Q 位,这是使用饱和运算的核心要点:

1. Q 标志位关键属性

特性 说明

位位置 APSR 的 Bit 27(唯一标识位)

触发条件 仅当 Q 前缀的饱和运算指令溢出时置 1,普通运算溢出不触发

粘性位特性 一旦置 1,不会自动清零,必须通过显式指令 / 代码清除,否则会持续标记溢出

2. 饱和运算的 “上下限”(触发阈值)

Q 位触发的本质是运算结果超出目标数据类型的数值范围:

数据类型 符号性 下限 上限

8 位整数 有符号 -128 127

8 位整数 无符号 0 255

16 位整数 有符号 -32768 32767

32 位整数 有符号 -2147483648 2147483647

三、核心用法:饱和运算指令 / 函数

1. 汇编层面(直接操作,深入底层)

ARM 提供了一系列带 Q 前缀的饱和运算指令,入门常用指令如下:

指令 功能 适用场景

QADD/QSUB 32 位有符号数饱和加 / 减 32 位整型数据运算

UQADD8 无符号 8 位按字节饱和加法 多字节无符号数据(如 RGB)

SQXTB 32 位→8 位有符号饱和转换 数据类型降位(如 32→8 位)

UQXTB 32 位→8 位无符号饱和转换 无符号数据降位

汇编示例:32 位有符号饱和加法(溢出场景)

; 目标:计算int32_t上限值+1,验证饱和效果

MOV R0, #2147483647 ; R0 = int32_t上限值

MOV R1, #1 ; 加1,超出上限

QADD R2, R0, R1 ; 饱和加法:R2被钳位到2147483647,Q位置1

; 检测Q标志位

MRS R3, APSR ; 读取APSR到R3

TST R3, #(1<<27) ; 检测Bit27(Q位)

BNE overflow_handle ; Q=1则跳转到溢出处理

overflow_handle:

MSR APSR_nzcvq, #0 ; 显式清除Q位(关键:避免后续误判)

2. C 语言层面(快速入门,推荐)

ARM GCC 编译器提供内置函数,无需手写汇编,底层自动生成 Q 前缀指令,入门必用函数如下:

函数名 功能

__qadd(a, b) 32 位有符号饱和加法

__qsub(a, b) 32 位有符号饱和减法

__sqxtb(a) 32 位→8 位有符号饱和转换

__uqxtb(a) 32 位→8 位无符号饱和转换

__SSAT(x, sat) 有符号数饱和至 sat 位

__USAT(x, sat) 无符号数饱和至 sat 位

C 语言完整示例(含 Q 位检测 / 清除)

#include

#include

// 读取APSR寄存器,检测Q标志位

static inline uint32_t get_apsr(void) {

uint32_t apsr;

__asm__ volatile ("mrs %0, apsr" : "=r" (apsr));

return apsr;

}

// 判断Q位是否置1(溢出)

static inline int is_q_flag_set(void) {

return (get_apsr() & (1U << 27)) != 0;

}

// 清除Q标志位

static inline void clear_q_flag(void) {

__asm__ volatile ("msr apsr_nzcvq, #0");

}

int main(void) {

// 示例:限幅

int32_t pid_output = 50000; // 计算结果超出了16位变量范围

// 将结果饱和限制在 16 位有符号数范围内 (-32768 ~ 32767)

int16_t motor_output = (int16_t)__SSAT(pid_output, 16);

// 示例:32位有符号饱和加法(超出上限)

int32_t a = 2147483647; // int32_t上限

int32_t b = 1;

int32_t res1 = __qadd(a, b); // 饱和加法:结果钳位到2147483647

printf("32位饱和加法结果:%d(预期:2147483647)\n", res1);

printf("Q位状态:%s\n", is_q_flag_set() ? "溢出(置1)" : "未溢出(置0)");

clear_q_flag(); // 清除Q位

return 0;

}

手动实现饱和运算(兼容非 ARM GCC 场景)

若编译器不支持内置函数,可手动判断范围实现简易饱和逻辑:

// 8位有符号数饱和加法

int8_t sat_add_int8(int8_t a, int8_t b) {

int16_t temp = (int16_t)a + (int16_t)b; // 用16位避免中间溢出

if (temp > 127) return 127; // 上限钳位

if (temp < -128) return -128; // 下限钳位

return (int8_t)temp;

}

四、总结

Q 饱和运算的核心是溢出时钳位到数据类型极值 + 置位 Q 标志位,解决普通运算的 “数值回绕” 问题;

优先使用 ARM GCC 内置函数(如__qadd),深入调试可通过汇编操作 Q 位,检测溢出需读取 APSR 的 Bit27;

关键注意点:Q 位需手动清除、指令 / 函数匹配数据类型,避免误判和结果错误。们鸦劫游

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 23:24:20

嵌入式按钮事件处理库:多类型去抖与状态机驱动设计

1. 项目概述 r89m Buttons 是一个面向嵌入式系统的轻量级、可移植按钮事件处理库&#xff0c;专为统一管理多种物理形态与电气特性的按钮输入而设计。其核心目标并非仅实现“按下/释放”电平检测&#xff0c;而是构建一套 事件驱动的抽象层 &#xff0c;将底层硬件差异&…

作者头像 李华
网站建设 2026/9/21 18:00:37

STM32驱动ST25R3911B实现多协议NFC开发指南

1. 项目概述 ST25R3911B 是意法半导体&#xff08;STMicroelectronics&#xff09;推出的高性能多协议 NFC/RFID 收发器芯片&#xff0c;专为工业级、医疗级及高可靠性嵌入式系统设计。其核心价值在于支持全协议栈——从 106–848 kbps 的 ISO/IEC 14443 A/B、ISO/IEC 15693、…

作者头像 李华
网站建设 2026/9/21 17:19:12

Faiss实战:从零构建Python向量检索系统

1. 为什么需要向量检索系统&#xff1f; 最近几年&#xff0c;随着深度学习技术的普及&#xff0c;向量检索变得越来越重要。你可能不知道的是&#xff0c;我们每天都在使用基于向量检索的服务。比如你在电商平台搜索商品时&#xff0c;系统会根据你的浏览记录推荐相似商品&…

作者头像 李华
网站建设 2026/9/21 16:48:00

Kubernetes 故障排查实战手册:从 Pod 异常定位到生产级稳定性治理

Kubernetes 故障排查实战手册:从 Pod 异常定位到生产级稳定性治理 核心目标:不只会“查 Pod”,而是建立一套可复制、可扩展、适用于高并发生产环境的 Kubernetes 故障定位与治理体系。 一、为什么很多团队会卡在 Kubernetes 故障排查上 多数团队第一次系统性接触 Kubernete…

作者头像 李华
网站建设 2026/9/18 19:52:02

低代码平台能承载复杂业务吗?我用接口引擎验证了一下

低代码平台能承载复杂业务吗&#xff1f;我用接口引擎验证了一下 背景&#xff1a;为什么我开始关注低代码 说实话&#xff0c;几年前我对低代码是嗤之以鼻的。标签满天飞、实际用起来处处受限、稍微复杂的业务就卡壳——这是大多数低代码平台的通病。但最近公司有个紧急项目&a…

作者头像 李华
网站建设 2026/9/20 3:40:33

SWDSerial:基于SWD通道的轻量级半主机串口输出方案

1. SWDSerial&#xff1a;基于SWD调试通道的半主机串行输出库深度解析1.1 技术定位与工程价值SWDSerial 是一个轻量级嵌入式输出流库&#xff0c;其核心设计目标是在无物理UART外设、无调试器串口桥接、甚至无标准调试接口&#xff08;如JTAG/SWD虚拟COM端口&#xff09;的严苛…

作者头像 李华