立下flag

本系列将分享C语言编程题目及CTF中web与misc类题目的解题经验。作者HappySuperman将以连载形式发布,内容涵盖基础知识与实战技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hello,各位大家好,我是happy Superman。今天把这篇文章写在最前面是打算开一个系列专题,在未来的一段时间内,我将会持续更新一些关于C语言的一系列题目的做题心得,以及ctf关于web和misc方面的一些题目的做题体验。

希望各位千万不要往下细看,可能没法系统的得到你想要的东西;

但与此同时,写这些文章也绝对不是一件毫无意义的事情,反而它可以作为你一直在追的一部小说,每天一篇,去补充丰富你的知识,在这里,由于我本人的性格,一些细小点的内容,我可能会讲解的比较细致,可能会解开你一直以来的困惑,这一系列文章最终能发展到什么程度我在这没法保证,可能我会越写越好,逐渐进阶成为一个大佬,也可能没过几天就会放弃,让我们一起拭目以待!

/* * limit.c * * Created on: Apr 13, 2018 * Author: Administrator */ #include "limit.h" extern uint HighPos; // 最大高度 extern uint LowPos; // 最低高度 extern uchar M_Num; extern uchar M_Flag; extern PWM_M PWM_M1; extern PWM_M PWM_M2; extern HALL_M HALL_M1; extern HALL_M HALL_M2; extern PID_M PID_M1; extern PID_M PID_M2; extern uchar Hall_Buffer; // 停止缓冲脉冲数 extern uint Hall_Slow; // 到限位前减速 extern uchar Hall_BufferX2; // 3倍停止缓冲脉冲数 extern uint Hall_SlowX2; // 2倍到限位前减速 extern uchar Get_hall_half; extern uint M_I_Delay_cnt; void Limit_Slow(uchar m_flag, uint mhalldata,PID_M *LM_PID) //上下限位到达提前减速 { if((m_flag&0x0f)!=0) // 立柱上升 { if(mhalldata > HighPos - Hall_Slow) { M_I_Delay_cnt = 0; // 进入慢停止后不再执行遇阻回退 LM_PID->get_halltemp = Get_hall_half; } } if((m_flag&0xf0)!=0) // 立柱下降 { if(mhalldata < LowPos + Hall_Slow) { M_I_Delay_cnt = 0; // 进入慢停止后不再执行遇阻回退 LM_PID->get_halltemp = Get_hall_half; } } } uchar Get_Limit(uchar m_flag,uint mhalldata) //获取上下限位的标记 { uchar mpos_flag = 0; if((m_flag&0x0f)!=0) // 立柱上升 { if(mhalldata > HighPos) { mpos_flag = mpos_flag|0x02; } } if((m_flag&0xf0)!=0) // 立柱下降 { if(mhalldata < LowPos + Hall_Buffer) { mpos_flag = mpos_flag|0x20; } } return (mpos_flag); } uchar Limit_Off(uchar mpos_flag,uchar m_flag) // 到达限位后停止判断 { uchar pwm_step = 0; if((m_flag&0x0f)!=0) // 立柱上升 { if((mpos_flag&0x02)==0x02) //到达上限位 { pwm_step = 5; // 进入慢停止 } } if((m_flag&0xf0)!=0) // 立柱下降 { if((mpos_flag&0x20)==0x20) //到达上限位 { pwm_step = 5; // 进入慢停止 } } return (pwm_step); } void DoLimitPos(void) // 上下限位执行 { uchar pwm_step_temp = 0; if(M_Num>=1) // M1上下限位 { if((M_Flag&0x11)!=0) { HALL_M1.pos_flag = Get_Limit(M_Flag,HALL_M1.halldata); // 获取上下限位的标记 Limit_Slow(M_Flag, HALL_M1.halldata,&PID_M1); // 上下限位到达提前减速 pwm_step_temp = Limit_Off(HALL_M1.pos_flag,M_Flag); // 到达限位后停止
03-19
<think>好的,我需要帮助用户理解C代码中的上下限位处理函数,包括Get_Limit、Limit_Slow和Limit_Off,以及它们的工作原理。首先,我要回忆用户提供的引用内容,看看有没有相关的信息可以整合。 根据引用[1],限位功能的状态是通过返回值来判断的,其中1表示触发,0表示未触发。而Get_Limit函数直接返回0,说明默认状态是未触发。这可能意味着当前代码中没有实际读取硬件限位传感器的逻辑,或者该功能尚未实现,只是暂时用默认值代替。 接下来,用户提到了system.cpp文件中修改了system_init()函数,可能与系统初始化相关,但具体如何影响限位处理还不清楚。不过结合引用[2]中的内嵌汇编知识,可能在某些底层函数中会使用到内嵌汇编来读取硬件状态,但当前示例中的Get_Limit并未使用这些技术,只是简单返回0。 现在需要解析这三个函数的功能: 1. **Get_Limit**:显然是获取当前限位状态的函数。根据引用[1],它直接返回0,所以现在只是一个占位函数,实际应用中可能需要从硬件读取传感器数据,比如通过GPIO端口或某种寄存器值。可能的实现方式是检查某个硬件寄存器的位状态,使用内嵌汇编或硬件库函数来获取实际值。 2. **Limit_Slow**:可能是在检测到限位触发后,系统进入减速状态的逻辑。比如,当某个轴接近限位开关时,需要逐渐降低电机速度,防止机械冲击。实现上可能需要调整控制参数,如PWM占空比,或者发送减速指令给驱动器。 3. **Limit_Off**:可能是完全停止的逻辑,当限位触发后,彻底关闭电机或执行机构的电源,确保系统停止。这可能涉及切断电源信号或发送紧急停止命令。 工作原理方面,通常限位处理分为几个阶段:检测、响应(减速或停止)、状态恢复。例如,当Get_Limit检测到限位触发(返回1),系统调用Limit_Slow开始减速,如果继续触发,则调用Limit_Off完全停止。之后可能需要手动或自动复位才能重新启动。 需要注意的是,当前的Get_Limit实现可能不完整,用户可能需要根据实际硬件接口修改该函数,比如使用内嵌汇编读取特定内存地址或端口的状态,如引用[2]中的例子,将C变量与汇编操作数结合,获取硬件信号。 总结时,要指出各函数的作用,当前代码中的占位实现,以及可能的改进方向,比如结合硬件读取和状态处理逻辑。同时,用户可能需要检查其他部分如中断处理或定时器轮询,确保限位状态被及时检测和处理。</think>### C语言上下限位处理函数解析 #### 1. **Get_Limit函数** - **功能**:获取硬件限位开关的触发状态(例如机械运动是否到达边界)。 - **实现细节**: - 根据引用[1],当前代码中直接返回0,表示默认未触发限位状态。 - 实际应用中,应通过**硬件寄存器或传感器信号**读取状态。例如: ```c // 伪代码:通过内嵌汇编读取GPIO状态(引用[2]) uint8_t Get_Limit() { uint32_t port_value; asm __volatile__("ldr %0, [gpio_addr]": "=r"(port_value)); // 读取硬件地址 return (port_value & LIMIT_MASK) ? 1 : 0; // 判断限位触发位 } ``` #### 2. **Limit_Slow函数** - **功能**:在触发限位时启动减速逻辑,防止硬件撞击。 - **实现逻辑**: - 降低电机速度(如调整PWM占空比)。 - 示例代码: ```c void Limit_Slow() { motor_pwm = MAX_PWM * 0.2; // 保留20%速度缓停 log("限位触发,进入减速状态"); } ``` #### 3. **Limit_Off函数** - **功能**:紧急停止输出,彻底关闭动力。 - **实现逻辑**: - 直接切断电机电源或发送停机指令。 - 示例代码: ```c void Limit_Off() { motor_pwm = 0; // PWM归零 disable_motor_driver(); // 关闭驱动器 log("限位触发,已强制停机"); } ``` #### 4. **工作原理总结** 1. **状态检测**:`Get_Limit` 轮询或通过中断获取限位开关电平[^1]。 2. **分级响应**: - 若触发限位,先调用 `Limit_Slow` 减速缓冲。 - 若持续触发,则调用 `Limit_Off` 完全停机。 3. **硬件交互**:实际开发中需结合硬件接口(如内嵌汇编操作寄存器[^2])。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值