程序跑飞原因总结 && 引脚配置&&中断&&while循环&&数组越界 &&硬件原因

本文总结了项目开发中遇到的技术挑战,包括引脚配置错误、中断使用不当、while循环的超时处理、数组越界和硬件问题。重点介绍了如何在FreeRTOS中正确处理中断、优化循环结构和防止数组溢出,以提升程序稳定性和效率。

2023.11月开始做了新项目,技术不到家导致程序多次跑飞,现在总结如下

一、引脚配置错误

错误原因同一个引脚初始化两次

1.硬件原理图变更,引脚功能变动,改动时不仔细

2.代码规范不好:对于引脚的宏定义封装不好,除了.h文件还在其他地方出现数字引脚

错误现象:

1.程序跑飞

2.调试时将新增引脚初始化挪动位置程序就会正常:原因时挪动位置后初始化正确了

解决办法:

1.做好引脚定义的宏封装,避免在.c文件里还出现数字引脚,如pin3,一律在.h文件中就封装完成



二、中断的使用

开发过程中需要使用一个新得芯片,芯片要求在数据传输时使用CPU级得中断

错误原因:误用不属于freertos的CPU中断

 __get_PRIMASK();
__set_PRIMASK(cpu_key);

错误现象:一旦芯片开始数据传输调用到该中断,程

<think>好的,我现在需要解释用户提供的C语言代码中`while(RX==1&& CF==0);`这一语句的功能和作用,特别是在超声波测距场景下的意义。首先,我需要理解这段代码所在的上下文。用户之前提供的代码是一个用于超声波测距的函数`Get_Distance`。在函数中,首先初始化了PCA定时器,发送了触发方波,然后启动定时器,接着执行`while(RX==1&& CF==0);`循环。之后停止定时器,根据是否溢出返回距离或0。现在,用户的问题集中在`while(RX==1 &&CF==0);`这一行。需要解释这个循环的条件和作用。首先,分解条件:RX是否为1,同时CF是否为0。循环会持续执行,直到这两个条件中的任意一个不满足,即RX变为0或者CF变为1。接下来,结合超声波测距的工作原理。超声波模块通常有一个Trig引脚用于触发信号,Echo引脚用于接收回波。当发送触发信号后,模块会发出超声波,并检测回波。Echo引脚会在接收到回波时变为高电平,持续时间为超声波往返时间。因此,Echo引脚的高电平时间需要被测量,以计算距离。 在代码中,可能RX对应的是Echo引脚的状态。因此,当RX为1时,表示回波信号仍在持续,即超声波还未返回或者仍在返回中。此时,定时器在持续计数。CF是PCA定时器的溢出标志,当定时器计数溢出时,CF会被置1。因此,循环的条件是:当Echo引脚为高电平且定时器未溢出时,持续等待。一旦Echo引脚变为低电平(RX==0)或者定时器溢出(CF==1),循环退出。在超声波测距中,这个循环的作用是等待Echo信号的高电平结束,同时监控定时器是否溢出。如果Echo信号的高电平持续时间过长,导致定时器溢出,说明距离超过了最大测量范围,此时需要处理溢出情况,返回0或最大距离。否则,正常计算时间,进而得到距离。需要确认RX是否确实对应Echo引脚。假设如此,那么循环的意义就是等待Echo信号由高变低,或者定时器溢出。这样设计可以防止程序在未收到回波时无限等待,通过溢出标志来中断循环,保证程序的健壮性。同时,结合用户提供的引用内容,测频法和测周法的误差情况,这里可能涉及到定时器测量时间的精度问题。由于超声波测距的时间可能较长,使用PCA定时器的溢出处理可以扩展定时器的计数范围,避免因为时间过长导致计数溢出而无法正确测量。总结:`while(RX==1&& CF==0);`的作用是在超声波测距过程中,等待回波信号结束(RX变为0)或定时器溢出(CF变为1),从而确保能够准确测量高电平持续时间,或在超出测量范围时及时处理。</think>### `while(RX==1 && CF==0);` 语句解析 #### 基本语法含义 该语句是一个**空循环体**的`while`循环,其功能是: - 持续检测两个条件: 1. `RX == 1`:接收引脚为高电平 2. `CF == 0`:定时器未溢出 - 当**任一条件不满足**时跳出循环 #### 超声波测距场景下的作用 1. **信号捕获阶段** - `RX=1`表示超声波模块的$Echo$引脚处于高电平状态,即超声波正在传播或已触达障碍物但尚未返回[^1] - 通过保持循环等待,实现**高电平持续时间的精确测量** 2. **溢出保护机制** - `CF=0`表示PCA定时器未溢出 - 当障碍物距离超出量程时,定时器溢出标志$CF$会被硬件置1,强制退出循环避免死等 3. **时间测量范围** $$T_{max} = \frac{0xFFFF \times T_{cycle}}{12}$$ 其中$T_{cycle}$为时钟周期时间。例如12MHz晶振时$T_{max}=65.535ms$,对应最大测量距离约$11.2m$[^1] #### 典型时序逻辑 ```c // 发送触发脉冲 Wave_Send(); // 开始计时并等待信号变化 CR = 1; // 启动PCA定时器 while(RX==1 && CF==0); // 关键等待逻辑 CR = 0; // 停止计时 // 后续处理 if(!CF) { /* 正常计算距离 */ } else { /* 处理溢出 */ } ``` ### 应用场景示例 假设超声波模块的$Echo$信号时序如下: ``` |<----- 高电平时间T ----->| Echo: ___/^^^^^^^^^^^^^^^^^^^^^^^^^\_____ ``` - 当$T < T_{max}$时:`RX`会先变为0,循环正常退出 - 当$T \geq T_{max}$时:`CF`会先被置1,触发溢出保护 ### 相关问题 1. 如何通过PCA定时器的分频配置调整最大测量距离? 2. 为什么超声波测距需要严格限制最大测量时间? 3. 如何优化`while`循环提高代码执行效率? 4. 超声波模块的盲区距离与哪些因素有关?[^1] [^1]: 引用内容描述了测距方法的时间测量范围与误差特性,与本文讨论的定时器溢出保护机制直接相关。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值