单位 3 / 9

嵌入式系统和微控制器代码

收益:

  • 能够通过清晰的提示定义微控制器的寄存器、中断和时序要求
  • 能够检查 AI 生成的 C/Arduino 代码的寄存器设置、缓冲区溢出和实时约束
  • 能够养成通过在硬件(示波器、串行端口)上测量来验证生成的代码的习惯

嵌入式系统开发是软件和硬件交叉的地方:即使代码“编译”并运行,错误设置寄存器位、保持中断时间过长或缓冲区溢出都会导致奇怪的、难以重现的故障。人工智能确实是该领域的加速器;它可以生成初始骨架、硬件抽象函数、状态机和通信例程。但人工智能看不到你的卡的数据表,不知道你的时钟频率,也感知不到你的实时限制。在本单元中,我们将介绍如何明确定义微控制器对 AI 的工作、如何检查生成的 C/Arduino 代码,以及为什么应该在硬件中测量所有内容。

明确定义要求:套准、切割、计时

让人工智能“点亮 LED”是行不通的;哪个卡、哪个引脚、哪个时钟频率、哪个时序?当向 AI 分配嵌入式任务时,请使用此框架:硬件(MCU 系列、时钟、引脚)、功能(将发生什么)、约束(时序、电源、内存)和接口(寄存器、HAL、Arduino 库)。

弱提示/强提示

弱:“用 STM32 产生 PWM。” (结果:哪个定时器、哪个频率、哪个引脚不清楚;一般来说,可能是错误的寄存器命名代码。) 强:“在 STM32F103(72 MHz 系统时钟)的 TIM3 CH1 (PA6) 上生成 20 kHz、0-100% 可调占空比 PWM。在寄存器级别写入(不是 HAL)。 - 20 kHz 的预分频器和 ARR 值计算并在注释行中显示计算结果。 - 设置占空比0-100 之间的函数参数 - 注释您使用的每个寄存器位,如果您的时钟假设错误,这些值将会改变。”

不同的是,强大的提示使模型显示计算并揭示时钟假设。因此您可以独立检查预分频器/ARR 值:

对于 20 kHz PWM(72 MHz 时钟):Timer_clock = 72 MHz 如果我们想要预分频器 = 72-1 → 计数器时钟 = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49验证:1e6 / (49+1) = 20 000 Hz ✓

审计人工智能代码:要寻找什么?

仅仅因为生成的代码可以编译并不意味着它可以正常工作。请遵循此清单:

控制区

寻找什么

寄存器/位设置

与数据表完全兼容,正确的位掩码

中断(ISR)

短吗?没有拦截延迟?是否使用了挥发性?

缓冲区/数组

有边境管制吗?溢出风险?

时机

带有延迟或定时器?是否满足实际时间限制?

类型和宽度

8/16/32 位溢出、有符号/无符号混淆

电源/看门狗

无限循环喂养看门狗?

中断服务例程 (ISR) 是最常见的错误源。 AI有时会在ISR中放置delay()或长循环。这会导致错过其他中断并导致看门狗复位。规则:ISR 应尽可能短;主要工作应该是设置一个标志并将其移至主循环。

// 弱(AI 有时会产生这种情况):ISR 中的阻塞函数 void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; 读取传感器(); // 可能需要很长时间 - BAD CASE_Delay(10); // ISR 延迟 - 非常糟糕 }}// 强:ISR 短;作业移至主循环 volatile uint8_t tick_flag = 0; // 易失性 CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; 刻度标志= 1; //只需在主循环中设置标志 }}//:if (tick_flag) { tick_flag = 0;读取传感器(); }

注意:中断和主循环之间共享的任何变量都必须是易失性的。否则,编译器可能会将变量缓存在寄存器中并错过更新。 AI经常忘记这个关键词;看代码的时候专门找一下。

缓冲区溢出和类型错误

AI可以将数据从串口复制到固定大小的数组中,无需进行边界检查。在嵌入式系统中,这意味着破坏连续内存和无法解释的崩溃。确保在每个 strcpy、数组索引和 DMA 缓冲区处检查限制。同样,8 位计数器在 255 后复位; AI 可以忽略这一点并依赖于溢出的帐户。

硬件验证:“工作”是测量出来的,而不是假设的

在嵌入式系统中,最可靠的证据是仪表,而不是编译器。通过以下三种方式验证生成的代码:

  1. 示波器/逻辑分析仪:测量 PWM 频率、信号时序和通信波形。如果您需要 20 kHz,请在屏幕上查看 20 kHz。
  2. 串行端口 (UART) 日志:打印变量值、状态转换和错误计数器,并与预期行为进行比较。
  3. 绑定和压力测试:测试系统在最高负载、最快数据和最差时序下是否能够正常运行。

如果测量值与计算不符,则说明时钟假设、预分频器值或寄存器设置不正确;追赶。

迷你包

一组学生让 AI 使用 HC-SR04 超声波传感器打印距离测量代码。代码可以编译,但距离总是给出荒谬的值。当他们将其连接到示波器时,他们看到回波腿以毫秒而不是微秒为单位计算其计时; AI 使用 millis() 而不是 micros()。这个单字错误使整个测量结果混乱了 1000 倍。当他们将原始回波时间打印到串行日志中并将其与真实标尺进行比较时,他们发现了错误并修复了它。教训:编译后的代码不是正确的代码;硬件测量立即揭示错误。

常见错误

  • 接受寄存器名称和位掩码,而不将它们与数据表进行比较。
  • 允许 ISR 内阻塞延迟或长时间处理。
  • 忘记共享变量上的 易失性。
  • 绕过缓冲区和数组边界检查;没有看到溢出。
  • 依赖时钟频率和时序假设而不对其进行验证。
  • 考虑代码“工作”而不使用示波器/串行日志进行测量。

综上所述

  • 从硬件、功能、约束和接口方面明确定义嵌入式任务。
  • 让AI计算预分频器/ARR等时序值并独立验证。
  • 保持 ISR 简短,在共享变量上使用 volatile。
  • 特别查找寄存器、缓冲区限制和类型宽度错误。
  • “它有效”是通过示波器、逻辑分析仪和串行日志而不是编译器来证明的。
  • 如果测量值与计算值不符,则追随假设。

应用任务

使用您拥有的微控制器(Arduino、STM32、ESP32),向 AI 请求 PWM 或特定频率的周期性任务。在加载代码之前:(1)在注释行中验证独立于帐户的频率/计时值,(2)检查ISR和共享变量中的易失性和阻塞性。上传后,用示波器或逻辑分析仪测量实际频率并与目标进行比较。如果存在偏差,找到根源并纠正它,并记下假设的错误。