活动介绍

错误:计算机已经从检测错误后重新启动。检测错误: 0x0000009f (0x0000000000000003, 0xffff9a8da17e6360, 0xfffffd0e1177f738, 0xffff9a8db3e1b9a0)。已将转储的数据保存在: C:\WINDOWS\MEMORY.DMP。报告 ID: d5058880-ddad-460f-9af0-61e62a24580e。

时间: 2025-07-11 17:47:24 浏览: 22
<think>嗯,用户之前问过关于DHCP错误的问题,现在又遇到了一个蓝屏错误,错误代码是0x0000009f。这个错误通常和电源管理有关,可能涉及驱动或硬件问题。用户可能对技术不是很熟悉,所以需要解释清楚原因,并提供逐步的解决方法。 首先,要确认错误代码0x9F对应的含义,即DRIVER_POWER_STATE_FAILURE。这说明在系统电源状态转换时,驱动程序没有正确处理。需要让用户理解这可能和驱动程序有关,特别是外设的驱动,比如显卡、声卡、网卡等,或者某些软件冲突。 接下来,用户可能需要一步步的指导来解决这个问题。我应该先建议他们检查最近的系统更改,比如新安装的软件或硬件,这可能引起冲突。然后引导他们进入安全模式,进行干净启动,排除第三方软件的干扰。 然后是关于驱动更新的部分。用户可能需要指导如何手动更新驱动程序,或者使用设备管理器回滚驱动。如果用户不太懂如何操作,可能需要详细说明步骤,比如按Win+X打开设备管理器,找到有问题的设备等。 另外,系统文件检查和内存诊断也是关键步骤。用户可能需要运行sfc /scannow和DISM命令来修复系统文件,以及使用Windows内置的内存诊断工具检查内存是否有问题。需要提醒他们备份数据,以防万一。 还有,分析转储文件可能会帮助定位问题,但对于普通用户来说可能比较复杂,所以建议他们使用WinDbg工具,或者将文件提交给专业人士。如果用户有技术背景,可以指导他们如何操作,但大部分情况下可能需要简化步骤。 最后,如果以上方法都无效,可能需要考虑硬件故障,比如电源或主板问题,这时候建议联系专业维修人员。同时,系统还原或重置也是最后的选项,但需要提醒用户备份重要数据。 要确保回答结构清晰,步骤明确,避免使用过于专业的术语,让用户容易理解和操作。同时,要检查是否有遗漏的常见解决方法,比如检查电源设置、禁用快速启动等,确保覆盖所有可能的解决方案。</think>以下是针对 **蓝屏错误 `0x0000009F`(DRIVER_POWER_STATE_FAILURE)** 的详细分析与解决方案: --- ### 一、错误原因解析 错误代码 `0x0000009F` 表示系统在电源状态转换(如睡眠、休眠、关机)时,某个驱动程序或硬件未能正确处理电源管理请求。常见原因包括: 1. **驱动程序兼容性问题**(尤其是显卡、声卡、网卡或外设驱动) 2. **硬件故障**(电源供应不稳定、主板/内存问题) 3. **系统文件损坏**(关键驱动或系统组件丢失) 4. **第三方软件冲突**(杀毒软件、优化工具或后台进程干扰电源管理) --- ### 二、紧急处理步骤 1. **立即备份重要数据** 蓝屏可能伴随系统不稳定,建议优先备份文件到外部存储设备。 2. **检查硬件连接** - 拔掉所有非必要外设(如USB设备、扩展坞) - 重新插拔内存条和显卡(针对台式机) - 检查电源线是否接触良好(尤其是笔记本电池老化时) --- ### 三、逐步排查与修复方法 #### ▶ 第一步:分析转储文件(C:\WINDOWS\MEMORY.DMP) 1. 下载 **WinDbg工具**(Windows调试工具) - 从 [Microsoft Store](https://apps.microsoft.com/detail/9pgjgd53tn86) 安装 2. 打开MEMORY.DMP文件 ```batch WinDbg -z C:\Windows\MEMORY.DMP ``` 3. 输入以下命令定位故障驱动: ```batch !analyze -v ``` **关键输出**:查找 `FAILURE_BUCKET_ID` 或 `MODULE_NAME` 字段,会直接指出导致崩溃的驱动文件名(如 `nvlddmkm.sys` 对应NVIDIA显卡驱动)。 #### ▶ 第二步:更新/回滚驱动程序 1. **通过设备管理器更新驱动** - 按 `Win + X` → 选择 **设备管理器** - 展开以下类别,右键选择 **更新驱动程序**: - 显示适配器(显卡) - 网络适配器(网卡) - 声音、视频和游戏控制器(声卡) 2. **手动回滚驱动** - 在设备管理器中右键问题设备 → **属性** → **驱动程序** → **回退驱动程序**(如果可用) 3. **卸载冲突驱动** - 对第三方驱动(如杀毒软件虚拟驱动)右键选择 **卸载设备** → 勾选 **删除此设备的驱动程序软件** #### ▶ 第三步:禁用快速启动与电源管理 1. **关闭快速启动** - 进入 **控制面板 → 电源选项 → 选择电源按钮的功能** - 点击 **更改当前不可用的设置** → 取消勾选 **启用快速启动** 2. **调整电源计划** - 按 `Win + R` 输入 `powercfg.cpl` - 选择 **高性能** 计划 → 点击 **更改计划设置 → 还原此计划的默认设置** #### ▶ 第四步:系统与硬件检测 1. **运行系统文件检查** ```batch sfc /scannow DISM /Online /Cleanup-Image /RestoreHealth ``` 2. **内存诊断工具** - 按 `Win + R` 输入 `mdsched.exe` → 选择 **立即重新启动并检查问题** 3. **检查磁盘健康状态** - 按 `Win + X` → Windows PowerShell(管理员) - 输入 `chkdsk C: /f /r` → 重启后自动扫描 #### ▶ 第五步:干净启动排除软件冲突 1. 按 `Win + R` 输入 `msconfig` - 在 **服务** 选项卡中勾选 **隐藏所有Microsoft服务** → 点击 **全部禁用** - 在 **启动** 选项卡中点击 **打开任务管理器** → 禁用所有启动项 - 重启电脑观察是否仍出现蓝屏 --- ### 四、高级修复方案 #### 1. 重置电源管理模块 ```batch powercfg /restoredefaultschemes powercfg /h off # 禁用休眠(针对休眠相关崩溃) ``` #### 2. 检查ACPI兼容性 - 进入BIOS → 找到 **Advanced Configuration and Power Interface (ACPI)** 设置 - 确保模式为 **Enabled** 或 **Auto** #### 3. 硬件压力测试 - 使用 **Prime95** 测试CPU稳定性 - 使用 **FurMark** 测试显卡负载能力 - 使用 **CrystalDiskInfo** 检查硬盘健康状态 --- ### 五、企业环境特殊处理 若为办公电脑,还需检查: 1. **组策略限制** → 联系IT部门确认电源管理策略是否冲突 2. **虚拟化软件** → 禁用VMware/VirtualBox的虚拟驱动 3. **加密软件** → 暂时卸载全盘加密工具测试 --- ### 六、终极解决方案 如果以上步骤无效: 1. **系统还原** - 按 `Win + R` 输入 `rstrui` → 选择蓝屏出现之前的还原点 2. **重置Windows** - 进入 **设置 → 系统 → 恢复 → 重置此电脑** 3. **联系硬件厂商** - 提供MEMORY.DMP文件及错误报告ID(`d5058880-ddad-460f-9af0-61e62a24580e`)请求技术支持 --- ### 附:技术细节参考 - **错误参数解析**: - 参数1 (`0x0000000000000003`) → 表示电源操作类型(此处为睡眠到关机过渡) - 参数2 (`0xffff9a8da17e6360`) → 指向问题驱动的内存地址 - 参数3 (`0xfffffd0e1177f738`) → 当前线程的栈指针 - 参数4 (`0xffff9a8db3e1b9a0`) → 电源管理器内部结构指针 建议定期清理系统更新缓存(`C:\Windows\SoftwareDistribution\Download`)以避免更新残留引发冲突。
阅读全文

相关推荐

I (553) AFE4300: AFE4300 初始化完成 I (553) AFE4300: AFE任务开始运行 I (553) AFE4300: AFE任务创建成功 I (563) gpio: GPIO[16]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:2  I (563) main_task: Returned from app_main() E (623) AFE4300: 无效数据: 0x031A @ 0x00 E (623) AFE4300: 无效数据: 0x0331 @ 0x00 E (633) AFE4300: 无效数据: 0x0383 @ 0x00 E (633) AFE4300: 无效数据: 0x03CA @ 0x00 E (633) AFE4300: 无效数据: 0x03DA @ 0x00 E (643) AFE4300: 无效数据: 0x0413 @ 0x00 E (643) AFE4300: 无效数据: 0x0443 @ 0x00 E (653) AFE4300: 无效数据: 0x046E @ 0x00 E (653) AFE4300: 无效数据: 0x0499 @ 0x00 E (653) AFE4300: 无效数据: 0x0499 @ 0x00 E (653) AFE4300: 无效数据: 0x04B0 @ 0x00 E (663) AFE4300: 无效数据: 0x04CB @ 0x00 E (663) AFE4300: 无效数据: 0x04E2 @ 0x00 E (673) AFE4300: 无效数据: 0x04F5 @ 0x00 E (673) AFE4300: 无效数据: 0x0502 @ 0x00 E (683) AFE4300: 无效数据: 0x0510 @ 0x00 E (683) AFE4300: 无效数据: 0x051E @ 0x00 E (693) AFE4300: 无效数据: 0x0528 @ 0x00 E (693) AFE4300: 无效数据: 0x0531 @ 0x00 E (703) AFE4300: 无效数据: 0x053A @ 0x00 E (703) AFE4300: 无有效数据 E (723) AFE4300: 无效数据: 0xFF74 @ 0x00 E (723) AFE4300: 无效数据: 0xFF74 @ 0x00 E (733) AFE4300: 无效数据: 0xFF74 @ 0x00 E (733) AFE4300: 无效数据: 0xFF74 @ 0x00 E (743) AFE4300: 无效数据: 0xFF73 @ 0x00 E (743) AFE4300: 无效数据: 0xFF73 @ 0x00 E (743) AFE4300: 无效数据: 0xFF73 @ 0x00 E (753) AFE4300: 无效数据: 0xFF71 @ 0x00 E (753) AFE4300: 无效数据: 0xFF72 @ 0x00 E (763) AFE4300: 无效数据: 0xFF72 @ 0x00 E (763) AFE4300: 无效数据: 0xFF73 @ 0x00 E (763) AFE4300: 无效数据: 0xFF72 @ 0x00 E (763) AFE4300: 无效数据: 0xFF72 @ 0x00 E (773) AFE4300: 无效数据: 0xFF71 @ 0x00 E (773) AFE4300: 无效数据: 0xFF71 @ 0x00 E (783) AFE4300: 无效数据: 0xFF71 @ 0x00 E (783) AFE4300: 无效数据: 0xFF71 @ 0x00 E (793) AFE4300: 无效数据: 0xFF71 @ 0x00 E (793) AFE4300: 无效数据: 0xFF72 @ 0x00 E (793) AFE4300: 无效数据: 0xFF71 @ 0x00 E (803) AFE4300: 无有效数据 E (813) AFE4300: 无效数据: 0x009B @ 0x00 E (813) AFE4300: 无效数据: 0x05F8 @ 0x00 E (813) AFE4300: 无效数据: 0x069C @ 0x00 E (823) AFE4300: 无效数据: 0x0726 @ 0x00 E (823) AFE4300: 无效数据: 0x079A @ 0x00 E (833) AFE4300: 无效数据: 0x07FE @ 0x00 E (833) AFE4300: 无效数据: 0x0852 @ 0x00 E (833) AFE4300: 无效数据: 0x089B @ 0x00 E (843) AFE4300: 无效数据: 0x08CB @ 0x00 E (843) AFE4300: 无效数据: 0x0904 @ 0x00 E (853) AFE4300: 无效数据: 0x0935 @ 0x00 E (853) AFE4300: 无效数据: 0x095E @ 0x00 E (863) AFE4300: 无效数据: 0x0982 @ 0x00 E (863) AFE4300: 无效数据: 0x09A2 @ 0x00 E (873) AFE4300: 无效数据: 0x09BC @ 0x00 E (873) AFE4300: 无效数据: 0x09D3 @ 0x00 E (883) AFE4300: 无效数据: 0x09E8 @ 0x00 E (883) AFE4300: 无效数据: 0x09FA @ 0x00 E (893) AFE4300: 无效数据: 0x0A08 @ 0x00 E (893) AFE4300: 无效数据: 0x0A15 @ 0x00 E (893) AFE4300: 无有效数据 E (903) AFE4300: 无效数据: 0xFEC8 @ 0x00 E (913) AFE4300: 无效数据: 0xFEC7 @ 0x00 E (923) AFE4300: 无效数据: 0xFEC8 @ 0x00 E (923) AFE4300: 无效数据: 0xFEC7 @ 0x00 E (923) AFE4300: 无效数据: 0xFEC6 @ 0x00 E (933) AFE4300: 无效数据: 0xFEC7 @ 0x00 E (933) AFE4300: 无效数据: 0xFEC7 @ 0x00 E (943) AFE4300: 无效数据: 0xFEC5 @ 0x00 E (943) AFE4300: 无效数据: 0xFEC6 @ 0x00 E (953) AFE4300: 无效数据: 0xFEC6 @ 0x00 E (953) AFE4300: 无效数据: 0xFEC6 @ 0x00 E (953) AFE4300: 无效数据: 0xFEC5 @ 0x00 E (953) AFE4300: 无效数据: 0xFEC4 @ 0x00 E (963) AFE4300: 无效数据: 0xFEC5 @ 0x00 E (963) AFE4300: 无效数据: 0xFEC4 @ 0x00 E (973) AFE4300: 无效数据: 0xFEC4 @ 0x00 E (973) AFE4300: 无效数据: 0xFEC4 @ 0x00 E (983) AFE4300: 无效数据: 0xFEC4 @ 0x00 E (983) AFE4300: 无效数据: 0xFEC3 @ 0x00 E (993) AFE4300: 无效数据: 0xFEC4 @ 0x00 E (993) AFE4300: 无有效数据 E (1003) AFE4300: 无效数据: 0x054B @ 0x00 E (1003) AFE4300: 无效数据: 0x0CA2 @ 0x00 E (1003) AFE4300: 无效数据: 0x106C @ 0x00 E (1013) AFE4300: 无效数据: 0x12E9 @ 0x00 E (1013) AFE4300: 无效数据: 0x150F @ 0x00 E (1023) AFE4300: 无效数据: 0x16E9 @ 0x00 E (1023) AFE4300: 无效数据: 0x1884 @ 0x00 E (1033) AFE4300: 无效数据: 0x19EA @ 0x00 E (1033) AFE4300: 无效数据: 0x1B23 @ 0x00 E (1043) AFE4300: 无效数据: 0x1C34 @ 0x00 E (1043) AFE4300: 无效数据: 0x1D24 @ 0x00 E (1053) AFE4300: 无效数据: 0x1DF4 @ 0x00 E (1053) AFE4300: 无效数据: 0x1EAD @ 0x00 E (1053) AFE4300: 无效数据: 0x1F4E @ 0x00 E (1063) AFE4300: 无效数据: 0x1FDB @ 0x00 E (1063) AFE4300: 无效数据: 0x2057 @ 0x00 E (1073) AFE4300: 无效数据: 0x20C5 @ 0x00 E (1073) AFE4300: 无效数据: 0x2125 @ 0x00 E (1083) AFE4300: 无效数据: 0x2179 @ 0x00 E (1083) AFE4300: 无效数据: 0x21C4 @ 0x00 E (1093) AFE4300: 无有效数据 E (1103) AFE4300: 无效数据: 0xFB89 @ 0x00 E (1113) AFE4300: 无效数据: 0xFB87 @ 0x00 E (1113) AFE4300: 无效数据: 0xFB85 @ 0x00 E (1113) AFE4300: 无效数据: 0xFB84 @ 0x00 E (1123) AFE4300: 无效数据: 0xFB80 @ 0x00 E (1123) AFE4300: 无效数据: 0xFB80 @ 0x00 E (1133) AFE4300: 无效数据: 0xFB7F @ 0x00 E (1133) AFE4300: 无效数据: 0xFB7D @ 0x00 E (1133) AFE4300: 无效数据: 0xFB7D @ 0x00 E (1133) AFE4300: 无效数据: 0xFB7C @ 0x00 E (1143) AFE4300: 无效数据: 0xFB7B @ 0x00 E (1143) AFE4300: 无效数据: 0xFB79 @ 0x00 E (1153) AFE4300: 无效数据: 0xFB78 @ 0x00 E (1153) AFE4300: 无效数据: 0xFB78 @ 0x00 E (1163) AFE4300: 无效数据: 0xFB77 @ 0x00 E (1163) AFE4300: 无效数据: 0xFB77 @ 0x00 E (1173) AFE4300: 无效数据: 0xFB75 @ 0x00 E (1173) AFE4300: 无效数据: 0xFB75 @ 0x00 E (1183) AFE4300: 无效数据: 0xFB74 @ 0x00 E (1183) AFE4300: 无效数据: 0xFB75 @ 0x00 E (1183) AFE4300: 无有效数据 E (1203) AFE4300: 无效数据: 0x278C @ 0x00 E (1213) AFE4300: 无效数据: 0x28AD @ 0x00 E (1213) AFE4300: 无效数据: 0x29A8 @ 0x00 E (1223) AFE4300: 无效数据: 0x2A84 @ 0x00 E (1223) AFE4300: 无效数据: 0x2B6F @ 0x00 E (1223) AFE4300: 无效数据: 0x2B6F @ 0x00 E (1233) AFE4300: 无效数据: 0x2C12 @ 0x00 E (1233) AFE4300: 无效数据: 0x2CA1 @ 0x00 E (1243) AFE4300: 无效数据: 0x2D1D @ 0x00 E (1243) AFE4300: 无效数据: 0x2D3C @ 0x00 E (1243) AFE4300: 无效数据: 0x2D56 @ 0x00 E (1243) AFE4300: 无效数据: 0x2DBF @ 0x00 E (1253) AFE4300: 无效数据: 0x2E1A @ 0x00 E (1253) AFE4300: 无效数据: 0x2E6A @ 0x00 E (1263) AFE4300: 无效数据: 0x2EB1 @ 0x00 E (1263) AFE4300: 无效数据: 0x2EEF @ 0x00 E (1273) AFE4300: 无效数据: 0x2F25 @ 0x00 E (1273) AFE4300: 无效数据: 0x2F56 @ 0x00 E (1273) AFE4300: 无效数据: 0x2F81 @ 0x00 E (1283) AFE4300: 无效数据: 0x2FA6 @ 0x00 E (1283) AFE4300: 无有效数据 E (1293) AFE4300: 无效数据: 0xF9D5 @ 0x00 E (1303) AFE4300: 无效数据: 0xF9D5 @ 0x00 E (1303) AFE4300: 无效数据: 0xF9D3 @ 0x00 E (1303) AFE4300: 无效数据: 0xF9D3 @ 0x00 E (1313) AFE4300: 无效数据: 0xF9D2 @ 0x00 E (1313) AFE4300: 无效数据: 0xF9D1 @ 0x00 E (1323) AFE4300: 无效数据: 0xF9D0 @ 0x00 E (1323) AFE4300: 无效数据: 0xF9CF @ 0x00 E (1333) AFE4300: 无效数据: 0xF9CF @ 0x00 E (1333) AFE4300: 无效数据: 0xF9CD @ 0x00 E (1333) AFE4300: 无效数据: 0xF9CE @ 0x00 E (1343) AFE4300: 无效数据: 0xF9CD @ 0x00 E (1343) AFE4300: 无效数据: 0xF9CC @ 0x00 E (1353) AFE4300: 无效数据: 0xF9CD @ 0x00 E (1353) AFE4300: 无效数据: 0xF9CC @ 0x00 E (1363) AFE4300: 无效数据: 0xF9CC @ 0x00 E (1363) AFE4300: 无效数据: 0xF9CB @ 0x00 E (1373) AFE4300: 无效数据: 0xF9CA @ 0x00 E (1373) AFE4300: 无效数据: 0xF9CB @ 0x00 E (1383) AFE4300: 无效数据: 0xF9CB @ 0x00 E (1383) AFE4300: 无有效数据 E (1423) AFE4300: 无效数据: 0x14FD @ 0x00 E (1423) AFE4300: 无效数据: 0x13DA @ 0x00 E (1433) AFE4300: 无效数据: 0x1208 @ 0x00 E (1433) AFE4300: 无效数据: 0x1070 @ 0x00 E (1433) AFE4300: 无效数据: 0x1013 @ 0x00 E (1443) AFE4300: 无效数据: 0x0EB7 @ 0x00 E (1443) AFE4300: 无效数据: 0x0D88 @ 0x00 E (1453) AFE4300: 无效数据: 0x0C7A @ 0x00 E (1453) AFE4300: 无效数据: 0x0B8E @ 0x00 E (1453) AFE4300: 无效数据: 0x0B58 @ 0x00 E (1453) AFE4300: 无效数据: 0x0B23 @ 0x00 E (1463) AFE4300: 无效数据: 0x0A5C @ 0x00 E (1463) AFE4300: 无效数据: 0x09AF @ 0x00 E (1473) AFE4300: 无效数据: 0x0915 @ 0x00 E (1473) AFE4300: 无效数据: 0x088D @ 0x00 E (1483) AFE4300: 无效数据: 0x0815 @ 0x00 E (1483) AFE4300: 无效数据: 0x07AC @ 0x00 E (1493) AFE4300: 无效数据: 0x0750 @ 0x00 E (1493) AFE4300: 无效数据: 0x06FE @ 0x00 E (1493) AFE4300: 无效数据: 0x06B6 @ 0x00 E (1503) AFE4300: 无有效数据 E (1503) AFE4300: 无效数据: 0xFFE1 @ 0x00 E (1513) AFE4300: 无效数据: 0xFF60 @ 0x00 E (1513) AFE4300: 无效数据: 0xFF62 @ 0x00 E (1523) AFE4300: 无效数据: 0xFF64 @ 0x00 E (1523) AFE4300: 无效数据: 0xFF66 @ 0x00 E (1533) AFE4300: 无效数据: 0xFF68 @ 0x00 E (1533) AFE4300: 无效数据: 0xFF69 @ 0x00 E (1543) AFE4300: 无效数据: 0xFF6A @ 0x00 E (1543) AFE4300: 无效数据: 0xFF6A @ 0x00 E (1543) AFE4300: 无效数据: 0xFF6A @ 0x00 E (1553) AFE4300: 无效数据: 0xFF6C @ 0x00 E (1553) AFE4300: 无效数据: 0xFF6D @ 0x00 E (1563) AFE4300: 无效数据: 0xFF6C @ 0x00 E (1563) AFE4300: 无效数据: 0xFF6D @ 0x00 E (1573) AFE4300: 无效数据: 0xFF6C @ 0x00 E (1573) AFE4300: 无效数据: 0xFF6E @ 0x00 E (1583) AFE4300: 无效数据: 0xFF6E @ 0x00 E (1583) AFE4300: 无效数据: 0xFF6E @ 0x00 E (1593) AFE4300: 无效数据: 0xFF6F @ 0x00 E (1593) AFE4300: 无效数据: 0xFF70 @ 0x00 E (1603) AFE4300: 无有效数据 E (1613) AFE4300: 无效数据: 0x0641 @ 0x00 E (1623) AFE4300: 无效数据: 0x06A9 @ 0x00 E (1623) AFE4300: 无效数据: 0x071E @ 0x00 E (1633) AFE4300: 无效数据: 0x0783 @ 0x00 E (1633) AFE4300: 无效数据: 0x079B @ 0x00 E (1633) AFE4300: 无效数据: 0x07ED @ 0x00 E (1643) AFE4300: 无效数据: 0x0833 @ 0x00 E (1643) AFE4300: 无效数据: 0x086F @ 0x00 E (1653) AFE4300: 无效数据: 0x08A2 @ 0x00 E (1653) AFE4300: 无效数据: 0x08AF @ 0x00 E (1653) AFE4300: 无效数据: 0x08B8 @ 0x00 E (1653) AFE4300: 无效数据: 0x08E3 @ 0x00 E (1663) AFE4300: 无效数据: 0x0906 @ 0x00 E (1663) AFE4300: 无效数据: 0x0926 @ 0x00 E (1673) AFE4300: 无效数据: 0x093F @ 0x00 E (1673) AFE4300: 无效数据: 0x0956 @ 0x00 E (1683) AFE4300: 无效数据: 0x0968 @ 0x00 E (1683) AFE4300: 无效数据: 0x097A @ 0x00 E (1683) AFE4300: 无效数据: 0x0988 @ 0x00 E (1693) AFE4300: 无效数据: 0x0995 @ 0x00 E (1693) AFE4300: 无有效数据 E (1703) AFE4300: 无效数据: 0xFE82 @ 0x00 E (1703) AFE4300: 无效数据: 0xFE82 @ 0x00 E (1713) AFE4300: 无效数据: 0xFE81 @ 0x00 E (1713) AFE4300: 无效数据: 0xFE7F @ 0x00 E (1723) AFE4300: 无效数据: 0xFE7D @ 0x00 E (1723) AFE4300: 无效数据: 0xFE7B @ 0x00 E (1733) AFE4300: 无效数据: 0xFE7A @ 0x00 E (1733) AFE4300: 无效数据: 0xFE7A @ 0x00 E (1743) AFE4300: 无效数据: 0xFE7A @ 0x00 E (1743) AFE4300: 无效数据: 0xFE78 @ 0x00 E (1743) AFE4300: 无效数据: 0xFE79 @ 0x00 E (1753) AFE4300: 无效数据: 0xFE79 @ 0x00 E (1753) AFE4300: 无效数据: 0xFE79 @ 0x00 E (1763) AFE4300: 无效数据: 0xFE79 @ 0x00 E (1763) AFE4300: 无效数据: 0xFE7A @ 0x00 E (1773) AFE4300: 无效数据: 0xFE7A @ 0x00 E (1773) AFE4300: 无效数据: 0xFE7A @ 0x00 E (1783) AFE4300: 无效数据: 0xFE7A @ 0x00 E (1783) AFE4300: 无效数据: 0xFE7A @ 0x00 E (1793) AFE4300: 无效数据: 0xFE79 @ 0x00 E (1793) AFE4300: 无有效数据 E (1813) AFE4300: 无效数据: 0x078B @ 0x00 E (1813) AFE4300: 无效数据: 0x075E @ 0x00 E (1823) AFE4300: 无效数据: 0x06C4 @ 0x00 E (1823) AFE4300: 无效数据: 0x0640 @ 0x00 E (1833) AFE4300: 无效数据: 0x05B5 @ 0x00 E (1833) AFE4300: 无效数据: 0x05B5 @ 0x00 E (1833) AFE4300: 无效数据: 0x0556 @ 0x00 E (1843) AFE4300: 无效数据: 0x0507 @ 0x00 E (1843) AFE4300: 无效数据: 0x04C1 @ 0x00 E (1843) AFE4300: 无效数据: 0x04B2 @ 0x00 E (1843) AFE4300: 无效数据: 0x0486 @ 0x00 E (1853) AFE4300: 无效数据: 0x0454 @ 0x00 E (1853) AFE4300: 无效数据: 0x0429 @ 0x00 E (1863) AFE4300: 无效数据: 0x0404 @ 0x00 E (1863) AFE4300: 无效数据: 0x03E5 @ 0x00 E (1873) AFE4300: 无效数据: 0x03CA @ 0x00 E (1873) AFE4300: 无效数据: 0x03B4 @ 0x00 E (1883) AFE4300: 无效数据: 0x039F @ 0x00 E (1883) AFE4300: 无效数据: 0x038E @ 0x00 E (1893) AFE4300: 无效数据: 0x037F @ 0x00 E (1893) AFE4300: 无有效数据 E (1903) AFE4300: 无效数据: 0xFDB8 @ 0x00 E (1913) AFE4300: 无效数据: 0xFDB9 @ 0x00 E (1913) AFE4300: 无效数据: 0xFDB8 @ 0x00 E (1913) AFE4300: 无效数据: 0xFDB7 @ 0x00 E (1913) AFE4300: 无效数据: 0xFDB7 @ 0x00 E (1923) AFE4300: 无效数据: 0xFDB6 @ 0x00 E (1923) AFE4300: 无效数据: 0xFDB5 @ 0x00 E (1933) AFE4300: 无效数据: 0xFDB5 @ 0x00 E (1933) AFE4300: 无效数据: 0xFDB4 @ 0x00 E (1943) AFE4300: 无效数据: 0xFDB4 @ 0x00 E (1943) AFE4300: 无效数据: 0xFDB3 @ 0x00 E (1953) AFE4300: 无效数据: 0xFDB3 @ 0x00 E (1953) AFE4300: 无效数据: 0xFDB2 @ 0x00 E (1963) AFE4300: 无效数据: 0xFDB2 @ 0x00 E (1963) AFE4300: 无效数据: 0xFDB2 @ 0x00 E (1973) AFE4300: 无效数据: 0xFDB1 @ 0x00 E (1973) AFE4300: 无效数据: 0xFDB2 @ 0x00 E (1973) AFE4300: 无效数据: 0xFDB1 @ 0x00 E (1983) AFE4300: 无效数据: 0xFDB1 @ 0x00 E (1983) AFE4300: 无效数据: 0xFDB0 @ 0x00 E (1993) AFE4300: 无有效数据 I (1993) AFE4300: 0x3fc97a4c ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| I (2003) AFE4300: 0x3fc97a5c ff ff ff ff ff ff ff ff ff ff ff ff 00 00 00 00 |................| I (2013) AFE4300: 0x3fc97a6c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| I (2023) AFE4300: 校准通道0: I=-1, Q=-1, mag=1.4 I (2033) AFE4300: 校准通道1: I=-1, Q=-1, mag=1.4 I (2033) AFE4300: 校准通道2: I=-1, Q=-1, mag=1.4 I (2043) AFE4300: 校准通道3: I=-1, Q=-1, mag=1.4 I (2043) AFE4300: 校准: mag_r0=1.4->100.0Ω, mag_r1=1.4->200.0Ω I (2053) AFE4300: 通道1原始: I=-1, Q=-1, mag=1.4 I (2053) AFE4300: 通道2原始: I=-1, Q=-1, mag=1.4 I (2063) AFE4300: 通道3原始: I=-1, Q=-1, mag=1.4 I (2073) AFE4300: 通道 1: Z = nan Ω, θ = -135.00° I (2073) AFE4300: 通道 2: Z = nan Ω, θ = -135.00° I (2083) AFE4300: 通道 3: Z = nan Ω, θ = -135.00°

ol.py -f OtterCTF.vmem --profile Win7SP1x64 dlllist -p 3720 Volatility Foundation Volatility Framework 2.6.1 ************************************************************************ vmware-tray.ex pid: 3720 Command line : "C:\Users\Rick\AppData\Local\Temp\RarSFX0\vmware-tray.exe" Base Size LoadCount LoadTime Path ------------------ ------------------ ------------------ ------------------------------ ---- 0x0000000000ec0000 0x6e000 0xffff 1970-01-01 00:00:00 UTC+0000 C:\Users\Rick\AppData\Local\Temp\RarSFX0\vmware-tray.exe 0x00000000776f0000 0x1a9000 0xffff 1970-01-01 00:00:00 UTC+0000 C:\Windows\SYSTEM32\ntdll.dll 0x0000000075210000 0x3f000 0x3 2018-08-04 19:33:03 UTC+0000 C:\Windows\SYSTEM32\wow64.dll 0x00000000751b0000 0x5c000 0x1 2018-08-04 19:33:03 UTC+0000 C:\Windows\SYSTEM32\wow64win.dll 0x00000000751a0000 0x8000 0x1 2018-08-04 19:33:03 UTC+0000 C:\Windows\SYSTEM32\wow64cpu.dll 0x0000000000ec0000 0x6e000 0xffff 1970-01-01 00:00:00 UTC+0000 C:\Users\Rick\AppData\Local\Temp\RarSFX0\vmware-tray.exe 0x00000000778d0000 0x180000 0xffff 1970-01-01 00:00:00 UTC+0000 C:\Windows\SysWOW64\ntdll.dll 0x0000000074f60000 0x4a000 0xffff 2018-08-04 19:33:03 UTC+0000 C:\Windows\SYSTEM32\MSCOREE.DLL 0x00000000772f0000 0x110000 0xffff 2018-08-04 19:33:03 UTC+0000 C:\Windows\syswow64\KERNEL32.dll 0x0000000075d30000 0x46000 0xffff 2018-08-04 19:33:03 UTC+0000 C:\Windows\syswow64\KERNELBASE.dll 0x00000000755e0000 0xa0000 0x28 2018-08-04 19:33:03 UTC+0000 C:\Windows\syswow64\ADVAPI32.dll 0x0000000076160000 0xac000 0xb1 2018-08-04 19:33:03 UTC+0000 C:\Windows\syswow64\msvcrt.dll 这dillist的结果说明了什么?

帮我写出下面结构体成员的偏移量:typedef struct OWS_SHD_CTRL_CMD { unsigned short header1;//帧起始标志 固定为0x5555 固定为0x5555 unsigned short header2;//帧起始标志 固定为0xAAAA 固定为0xAAAA unsigned short dppsn; //数据处理序列号 0~65535,顺序增加,发一帧加1 数据处理填 0~65535,顺序增加,发一帧加1 unsigned short len;//32位数据长度 1024 固定 1024 unsigned char packetType; //B7~B0 数据包类型 "0x10:工作数据包; unsigned char bak; //B15~B8 备份 "数据处理填 /* 0x30:初始化数据包; 0x40:空包(用于DBF状态回读) " "0x10:工作数据包; 0x30:初始化数据包; 0x40:空包(用于DBF状态回读) " */ unsigned short rcsn;//雷控序列号 0~65535 雷控填 0~65535 unsigned char year; // 6 1 B15~B8 月 值域:[1,12] 雷控填 值域:[1,12] unsigned char month; // B7~B0 年 值域:[0,99] 雷控填 值域:[0,99] unsigned char day; // 7 1 B15~B8 时 值域:[0,23] 雷控填 值域:[0,23] unsigned char hour; // B7~B0 日 值域:[1,31] 雷控填 值域:[1,31] unsigned char minute; // 8 1 B15~B8 秒 值域:[0,59] 雷控填 值域:[0,59] unsigned char second; // B7~B0 分 值域:[0,59] 雷控填 值域:[0,59] unsigned short us100;//秒以下单位 秒以下,单位:100us 雷控填 秒以下,单位:100us unsigned char testMode : 4;// unsigned char taskMode : 4;// /*B7~B4 任务模式 "0x0:工作模式(不监测) 0x1:发监测; 0x2:收监测; 0x3:模拟目标测试; 注:当要使用模拟目标时必须要控制模拟目标模式,频率源响应此字决定是否输出模拟目标 " "0x0:工作模式(不监测) 0x1:发监测; 0x2:收监测; 0x3:模拟目标测试; 注:当要使用模拟目标时必须要控制模拟目标模式,频率源响应此字决定是否输出模拟目标 "*/ unsigned char workMode;//B15~B8 工作模式 "0x00:工作模式A(工作模式0) unsigned char bak103; // B7~B0 备份 unsigned char bitMode;// /* 11 1 B15~B8 BIT工作方式 "0x00:开机测试; 0x01:在线测试(全机);0x02:在线测试(DBF);0x03:在线测试(备份);0x04:在线测试(信号处理);0x05:在线测试(数据处理); 0x06:在线测试(光传与控制);0x07:在线测试(频率源);0x08:在线测试(伺服);0x09:在线测试(电源);0x0A:在线测试(阵面冷却); 0x0B:反干扰前记录数据的回放;0x80:外码元;0x81:全阵面数据采集;0x82:数字单元BITE传送;0x83:备份; " "0x00:开机测试; 0x01:在线测试(全机);0x02:在线测试(DBF);0x03:在线测试(备份);0x04:在线测试(信号处理);0x05:在线测试(数据处理);0x06:在线测试(光传与控制); 0x07:在线测试(频率源);0x08:在线测试(伺服);0x09:在线测试(电源);0x0A:在线测试(阵面冷却); 0x0B:反干扰前记录数据的回放; 0x80:外码元; 0x81:全阵面数据采集; 0x82:数字单元BITE传送; 0x83:备份; " */ unsigned short bak1; //备份 unsigned short pitch; //阵面姿态 默认阵面倾角 资源调度或显控填 默认阵面倾角 unsigned short txBeamEle;//发射波束指向 量化单位0 .1° 资源调度或显控填 量化单位0.1° unsigned short rxBaseBeamEle;//本帧接收的最低一个俯仰波束指向 -2°~90°,量化单位0 .1° 资源调度或显控填 -2°~90°,量化单位0.1° unsigned short rxEleNum;//本帧俯仰同时接收波束个数(有效波束数) 俯仰面同时接收波束个数,0X01:1个;…0X05:5个;…0X0A:10个;…0x14:20个 资源调度或显控填 俯仰面同时接收波束个数,0X01:1个;…0X05:5个;…0X0A:10个;…0x14:20个 unsigned short rxEleStep;//本帧接收的俯仰波束间隔 0~5°,量化单位0 .01° 资源调度或显控填 0~5°,量化单位0.1° unsigned short bak2; //备份 unsigned short sweepNum; //波位总数 当前工作模式一共多少个波位 资源调度填 unsigned short beamPos; //当前波位号 当前为第几个波位 资源调度填 unsigned short scanBeamTxEle;//波瓣测试发射仰角 角度值*100 显控填 角度值*100 unsigned short scanBeamRxEle;//波瓣测试接收仰角 角度值*100 显控填 角度值*100 unsigned short bak3[2]; //备份 unsigned short srvAzA; //伺服A方位角码 960伺服双机热备,所以有两个方位角码,需与张宏超沟通更改程序 雷控填 960伺服双机热备,所以有两个方位角码,需与张宏超沟通更改程序 unsigned short srvAzB; //伺服B方位角码 雷控填 unsigned short bak4[5]; //备份 unsigned char workMod;// /*32 K 1 B7~B0 工作模式 "0x80: 正常工作模式 0x91: 发射监测模式 0x92: 接收监测模式 0xEA: DDS复位、BIT总清 0xCC:指令BIT参数回读(见BIT回读)(b7~b0为0xCC时进行指令BIT参数回读,其他模式则为周期BIT回读) " 阵面控制工作模式总览 "0x80: 正常工作模式 0x91: 发射监测模式 0x92: 接收监测模式 0xEA: DDS复位、BIT总清 0xCC:指令BIT参数回读(见BIT回读)(b7~b0为0xCC时进行指令BIT参数回读,其他模式则为周期BIT回读) "*/ unsigned char bak5; //B15~B8 备份 保留、填0 保留、填0 unsigned short antType; //阵面重构类型 保留、填0 阵面重构类型选择 保留、填0 unsigned char bak6; unsigned char freqNum : 3;//频率分集分组循环参数 unsigned char freqREn : 1;//频率分集分组循环参数使能 unsigned char bakold : 4;//频率分集分组循环参数 unsigned short calEn : 1; //35 K+3 1 b0 天线阵面发射相位、接收幅度、相位补偿使能 0:补偿 1:不调用补偿值///////(单元级用本bit)0 "补偿使能开关 unsigned short subAntEn : 1;//b1 阵面级收发通道接收幅度加权旁路使能 "0:使能 1:不调用补偿值///////(子阵级用本bit)1 /* 接收做组件内DBF时相应此字,如不调用补偿,则对八个通道数据不进行幅度加权,如调用补偿,则进行幅度加权,加权信息对应96字b5-b8及之后波束对应字 " "0:使能 1:不调用补偿值///////(子阵级用本bit)1 接收做组件内DBF时相应此字,如不调用补偿,则对八个通道数据不进行幅度加权,如调用补偿,则进行幅度加权,加权信息对应96字b5-b8及之后波束对应字 " */ unsigned short antTxW : 1;// b2 天线阵面发射展宽 0:展宽 1:不展宽 0 0:展宽 1:不展宽 0 unsigned short chlNorEn : 1; // b3 组件收发幅相归一化补偿使能。953首套置1,正常置0。 "0:归一化 1:不使能 9531测雨0 //暗室测试时为了取原始数据会置1,正常使用时置0 //组件级补偿,通常在微电子时会先烧好,如果一个产品各个组件的组件级补偿烧好了,那么B0代表的阵面级补偿就只补偿组件以外的东西,这样的好处是组件故障后可以直接更换,如不烧组件级补偿,那组件更换后要再进行阵面补偿 " "0:归一化 1:不使能 9531测雨0 //暗室测试时为了取原始数据会置1,正常使用时置0 " unsigned short actChlEn : 1; //b4 数字通道均衡旁路使能 保留、填0 保留、填0 unsigned short actChlEn2 : 1; //b5 数字时延处理旁路使能 保留、填0 保留、填0 unsigned short actChlEn3 : 1; //b6 DDC窄带频率分集旁路使能,除A模式外其他模式置1 0:无频率分集;1有频率分集 0:无频率分集;1有频率分集 unsigned short actChlEn4 : 1; //b7 数字时延误差补偿旁路使能 保留、填0 保留、填0 unsigned short powerMngEn : 1; //b8 能量管理码 调用使能 Q "0:调用能量管理 1:不调用能量管理 0 与96字(及之后的几个发射脉冲字段)的能量管理类型,即开单极化或双极化关联。置0时能量管理类型字有效,置1时无效" unsigned short bak7 : 3; //b11~b9 备份 保留、填0 保留、填0 unsigned short baktxPhaseSig : 1; //b12 发射频移极性 保留、填0 保留、填0 unsigned short bakrxPhaseSig : 1; //b13 接收频移极性 保留、填0 保留、填0 unsigned short txPhaseSig : 1; //b14 发射移相极性 控制发射移相正反,1,0 保留、填0 unsigned short rxPhaseSig : 1; //b15 接收移相极性 保留、填0 保留、填0 // unsigned short subdbf : 4; //36 K+4 1 b3~b0 数字板打包选择 "0x0:不进行组件内DBF合成; //unsigned short subdbfEn:1;//0x4:进行组件DBF合成,0x4 =4通道合1;(953,2201) //unsigned short doubleFreqEn:1;//0x8:按频率分集,8通道合1;(中南S) unsigned short waveCode : 2; //b5~b4 码元控制 0:AD,1:码元1 0:AD,1:码元1 unsigned short iqRev : 1; //b6 IQ正反 "960此处有效,可用来调试,正常填0,如发现下行数据IQ反了,则可置1将它再反过来 unsigned short bak8 : 1; //b7 备份 备份 备份 unsigned short dbf : 3; //b10~b8 DBF打包输出选择 "0:按b3-b0设置执行DBF或不合成; /* 1:保留 2:合成单通道模式,仅被字39选择单通道移相,加权输出。 其余保留。 正常工作时置0,置2是为了验证当组件内DBF合成时各通道幅度相位加权的正确性的,即:当b3-b0置8时,此处可置2,置2后根据39字的设置选择单独下行某一个通道的加权结果,而不是8通道加权合一的结果,进行验证。正常工作时不需置2 . " "0:按b3-b0设置执行DBF或不合成; 1:保留 2:合成单通道模式,仅被字39选择单通道移相,加权输出。 其余保留。 正常工作时置0,置2是为了验证当组件内DBF合成时各通道幅度相位加权的正确性的,即:当b3-b0置8时,此处可置2,置2后根据39字的设置选择单独下行某一个通道的加权结果,而不是8通道加权合一的结果,进行验证。正常工作时不需置2 . " */ unsigned short externWaveCode : 1; //b11 外码元 "0x1:外码元 0x0:IQ数据 unsigned short packetMode : 3; //b14~b12 打包模式 "0x0:中心频点IQ数据打包 /* 0x1:接收5分集40通道IQ数据打包 0x2:合成模式打包(打包合成后5通道,可配合合成单通道模式) " "0x0:中心频点IQ数据打包 0x1:接收5分集40通道IQ数据打包 0x2:合成模式打包(打包合成后5通道,可配合合成单通道模式) " */ unsigned short exWaveCode : 1; //b15 外码元 0x1:外码元 0x0:IQ数据 0x1:外码元 0x0:IQ数据 unsigned short paraChl0; //参数提取单通道数据下传选择阵面ID 保留、填0 保留、填0 unsigned short paraChl1; //参数提取单通道数据下传选择阵面ID 保留、填0 保留、填0 unsigned short paraChl2; //参数提取选择通道(组件内DBF功能) "可下传0~N-1中任一单个数字通道的加权结果,N代表数字组件数字通道数,当且仅当36字:b11~b8为2时起效 //此字为测试用,当36字b11-b8置2时,根据此字的数值选择使组件单独下传数值对应通道的加权结果,用于组件内DBF合成验证,正常工作时不使用此字,置0即可 " 组件内DBF模块负载实现 "可下传0~N-1中任一单个数字通道的加权结果,N代表数字组件数字通道数,当且仅当36字:b11~b8为2时起效 //此字为测试用,当36字b11-b8置2时,根据此字的数值选择使组件单独下传数值对应通道的加权结果,用于组件内DBF合成验证,正常工作时不使用此字,置0即可 " unsigned short bak9[2]; //备份 保留、填0 保留、填0 unsigned short ddcfir : 4;//42 K+10 1 B3~B0 DDC FIR滤波器带宽/采样率 0x0:1M/2M 0x1: 2M/2M 0x2:4M/4M DDC采样滤波器选择 0x0:1M/2M 0x1: 2M/2M 0x2:4M/4M unsigned short bak10 : 12;// unsigned short bak11[12]; //备份 保留、填0 保留、填0 unsigned short stc : 6;//b5~b0 数字组件接收衰减 "b4-b0有效,b0代表1dB衰减,b1代表2dB衰减,以此类推,b4代表16dB衰减,衰减范围0-31dB 1:不衰减 0:衰减 例如:11110(二进制),代表衰减1dB unsigned short stcMethod : 1; //b6 数字组件衰减控制方式选择 0:从上述指令中选取 1:衰减可变(从可变STC字段选取) 0:从上述指令中选取 1:衰减可变(从可变STC字段选取) unsigned short txForce : 1; //b7 发射强制开启 保留、填0 保留、填0 unsigned short bak21 : 1; //b8 中频滤波器选择 保留、填0 保留、填0 unsigned short bak22 : 1; //b9 DDS声表滤波器选择 保留、填0 保留、填0 unsigned short bak23 : 1; //b10 中频发射直通选择 保留、填0 保留、填0 unsigned short bak24 : 1; //b11 本振切换 保留、填0 保留、填0 unsigned short bak25 : 1; //b12 宽窄带滤波器控制 保留、填0 保留、填0 unsigned short txFilterSel : 3; //b15~b13 射频滤波器选择 "B15:收发射频滤波器设置方式切换,目前根据频点分为两种滤波器,频点0-124为滤波器1,频点125-300为滤波器2。0:根据96字(及之后几个发射脉冲对应字)b7的设置切换,1:手动根据b14-b13的值切换。 /* 正常使用时b15置0,这样可以对每个发射脉冲根据频率单独设置滤波器,更加灵活。要进行相关测试时可以置1进行手动切换统一使用一种滤波器 B14-B13:手动设置滤波器,B15为1时生效。00:滤波器1,01:滤波器2 " "B15:收发射频滤波器设置方式切换,目前根据频点分为两种滤波器,频点0-124为滤波器1,频点125-300为滤波器2。0:根据96字(及之后几个发射脉冲对应字)b7的设置切换,1:手动根据b14-b13的值切换。 正常使用时b15置0,这样可以对每个发射脉冲根据频率单独设置滤波器,更加灵活。要进行相关测试时可以置1进行手动切换统一使用一种滤波器 B14-B13:手动设置滤波器,B15为1时生效。00:滤波器1,01:滤波器2 " */ unsigned short stcIndex; //STC曲线号 保留、填0 保留、填0 unsigned short bak54[3]; //备份 保留、填0 保留、填0 unsigned int basePulseWidth; //基带信号脉宽 保留、填0 保留、填0 unsigned short txOff; //发射关断模式字 关断时,填写0x9A,其余时刻不填。 "用来在调试时对模拟前端的收发、自激、拖尾进行检测。 //正常工作时不用 " 9x5不用,960应该也不用 关断时,填写0x9A,其余时刻不填。 unsigned short trunOffID; //关断或开启通道的用户ID[15:0] 要关断或开启的通道用户ID号(开启时,若为0xFFFFFFFF,则全阵开,否则是单板开) 要关断或开启的通道用户ID号(开启时,若为0xFFFFFFFF,则全阵开,否则是单板开) unsigned short trunOffID2;//关断或开启通道的用户ID[31:0] unsigned short trunOffChlNum; //关闭通道号 1-16通道,分别对应b0~b15,0x1代表关断 1-16通道,分别对应b0~b15,0x1代表关断 unsigned char rxSelfExcitTh;//B7~B0 接收自激检测门限 0x0-0x90:对应1-90dB;0x0时默认为80dB; 0x0-0x90:对应1-90dB;0x0时默认为80dB; unsigned char txTrailTh;//B15~B8 发射拖尾检测门限 0x0-0x90:对应1-90dB;0x0时默认为80dB; 0x0-0x90:对应1-90dB;0x0时默认为80dB; unsigned short rxSelfExcitEn : 1; //b0 接收自激检测使能 0x0:无效,0x1:有效 0x0:无效,0x1:有效 unsigned short rxSelfExcitS : 1; //b1 接收自激检测判别方法 0x0:绝对门限法,0x1:相对门限法 0x0:绝对门限法,0x1:相对门限法 unsigned short rxSelfExcitChlEn : 1; //b2 接收自激异常通道关断方式 0x0:手动,0x1:自动 0x0:手动,0x1:自动 unsigned short rxSelfExcitStaRet : 1; //b3 接收自激状态复位 0x0:保持原状,0x1:关断通道恢复开启 0x0:保持原状,0x1:关断通道恢复开启 unsigned short rxSelfExcitExcFlagEn : 1; //b4 接收自激异常标志清除 0x0:保持原状,0x1:标志清除 0x0:保持原状,0x1:标志清除 unsigned short rxSelfExcitDtcStartPos : 4; //b8~b5 接收自激检测起始位置(从波门起始开始算起,步进500us) 0:500us;1:1ms;···14:7 .5ms;15:0ms(监测时用) 0:500us;1:1ms;···14:7.5ms;15:0ms(监测时用) unsigned short rxSelfExcitChlDiffThl : 3;//b11~b9 接收自激检测通道间差异阈值 "0x0:30dB;0x1:27dB;0x2:24dB; //0x3:21dB;0x4:18dB;0x5:15dB; //0x6:12dB;0x7:9dB; " "0x0:30dB;0x1:27dB;0x2:24dB; //0x3:21dB;0x4:18dB;0x5:15dB; //0x6:12dB;0x7:9dB; " unsigned short adRevDtcEn : 1; // b12 AD翻转检测使能 0x0:无效,0x1:有效 0x0:无效,0x1:有效 unsigned short adRevDtcSel : 1; //b13 AD翻转检测方式 0x0:高位,0x1:全部 0x0:高位,0x1:全部 unsigned short txTrailEn : 1; //b14 发射拖尾检测使能 0x0:无效,0x1:有效 0x0:无效,0x1:有效 unsigned short txTrailExFlagEn : 1; //b15 发射拖尾异常标志清除 0x0:保持原状,0x1:标志清除 0x0:保持原状,0x1:标志清除 unsigned short checkSum; //校验码 关断或开启时,填写0xaa55,其余时刻不填。 关断或开启时,填写0xaa55,其余时刻不填。 unsigned short bak53[2];//备份 无 无 unsigned short bakpulseWidth;//脉冲宽度 无 无 unsigned short rxFeqNco[10][2]; //由低到高依次为:接收分集NCO1的 低16位 高16位, NCO2 ...NCO10 "前5个频点为第一组 /*中频-奈奎斯特最大值 " "10个NCO字, 接收频率分集使能时起效,每个NCO字为32BIT, 72-73是频率分集1; NCO =((480-实际接收中频频率)/120)*2^32 实际接收中频频率计算方式: 频率 =接收本振-回波频率 " "前5个频点为第一组 中频-奈奎斯特最大值 "*/ RCV_BEAM_PARA DBF_beta[10];//0水平,1 垂直,然后10个表示10个角度的beta码。由低到高分别是水平波束1 2 3 10。,然后是垂直极化的波束1 2 3 10。 unsigned short beta[2][10]; //备份 unsigned short bak12[16]; //备份 unsigned short mnBak[4]; //MN预留 unsigned int txCalChlID;//发射监测模式下被监测数字组件用户ID[15:0] "发射监测时选定阵面数字组件,接收监测时填写0xFFFF? //根据用户ID,字32选发射监测,即可对对应ID的数字组件进行发射监测 " 监测选定数字组件,接收监测时填写0xFFFF,选中用户ID,字32选发射,即可发射 unsigned short txCalChlSet;//发射监测模式下被监测数字组件数发射通道设置 发射监测时选定数字组件的发射通道号,0-7代表1-8通道 监测选定数字组件,接收监测时填写0xFFFF unsigned short txCalAntID; //监测子阵波控板用户ID[15:0] 保留,备份 保留,备份 unsigned short txCalAnalogChl; //监测有源子阵内模拟通道号 保留,备份 保留,备份 unsigned short txCalDigitalChl; //监测组件发射数字通道号 保留,备份 保留,备份 unsigned short mntADFalg : 1; //1 B0 监测:数字/模拟链路 缺省填1,数字组件 缺省填1,数字组件 unsigned short mntHVFalg : 2; // b2~b1 监测极化控制 保留,填0 保留,填0 unsigned short mntCalPAStat : 2; // b4~b3 监测通道幅相置位状态 保留,填0 保留,填0 unsigned short mntCalCalTxRxStat : 2; // b6~b5 监测通道收发状态 保留,填0 保留,填0 unsigned short bak13 : 9; // b15~b7 备份 保留,填0 保留,填0 unsigned short calCoefAddr : 8;//200 R+12 1 B7~B0 监测频率对应的补偿地址 "当字32选择发射监测或接收监测时,要想调用补偿值,在此字调用的补偿值,调用方法同字94 unsigned short calCoefAddr2 : 8; // B15~B8 补偿地址备份 unsigned short bak14[10]; //备份 unsigned short bak15; //备份 保留,备份 保留,备份 unsigned short calTRMod;//监测组件工作模式 "监测组件工作模式:接收内监测0x0002 接收外监测0x0040 发射内监测0x0000 发射外监测0x8000 /*监测组件工作模式: 外接收监测0x0009 外发射监测0x0010 内接收监测0x000c 内发射监测0x0090 模拟目标0x800a 噪声源0x4000 匿影0x0000 其余保留,缺省为匿影 "*/ unsigned short calTRAtten : 7; // B6~B0 监测组件发射衰减值 监测组件发射衰减0-XXXdB,单位1dB 只需直接填入想要衰减的值即可,具体衰减实现由组件内部根据填入的值自适应进行 "b6~b0:模拟目标衰减 unsigned short simTgtFreq : 2;//b9~b7:模拟目标频率选择 其余保留 " unsigned short calTRTxFreqSel : 7; // B14~B8 监测组件发射频率段索引 "同一衰减下,监测组件在不同发射频率下其衰减补偿值不同,此字段用来选择监测组件发射频率段索引,对应不同衰减补偿值 //将301个频点按4M划分(以除以四后四舍五入为准则),分为76个频率段,用0-75表示,0代表频点号0、1对应频率,1代表2、3、4、5对应频率,以此类推 " "设此频率段索引为F,监测组件发射频率为f,则此字段填入 //F =四舍五入(f/4) " unsigned short stc1Value : 5;// B4~B0 监测组件接收衰减控制STC1 b4:1 =16dB衰减,b3:1=8,b2:1=4,b1:1=2,b0:1=1, STC1控制0-31dB衰减,STC2控制0-31 .5dB衰减,两者可叠加 b4:1=16dB衰减b3:1=8,b3:1=8,b2:1=4,b1:1=2,b0:1=1, unsigned short bak42 : 3;//b5-b7 备份 保留置0 1开,0关 unsigned short stc2Value : 6;// b8-b13 监测组件接收衰减控制STC2 b13:1 =16dB衰减,b12:1=8,b2:11=4,b1:10=2,b9:1=1,b8:1=0 .5 1关,0开 unsigned short bak43 : 1;//b14 备份 保留置0 1关,0开 unsigned short bak44 : 1; //b15 备份 保留置0 保留置0 unsigned short bak45 : 7; //b15~b8 备份 保留,填0 保留,填0 unsigned int calTRID; //监测参考数字组件阵面ID[15:0] 保留,填0 保留,填0 unsigned short calTRCalNum; //监测参考数字组件数字通道号 保留,填0 保留,填0 unsigned short bitModSel : 8;// B7~B0 BIT模式选择 "0x7:数字收发BIT //(字32:0xCC时,为指令BIT参数回读,其他模式则为周期BIT回读) " "0x7:数字收发BIT //(字32:0xCC时,为指令BIT参数回读,其他模式则为周期BIT回读) " unsigned short bitSubModSel : 8; //b15~b8 BIT模式子集选择 "工作模式为0xCC指令BIT参数回读 unsigned short txrxBitMod : 8; //b7~b0为0x7数字收发BIT模式 /*0x0:数字通道全局列坐标M 0x1:数字通道全局行坐标N 0x2:模拟通道全局列坐标M 0x7F: 厂家ID及FLASH信息 0x81:数字收发时钟链路、光链路工作状态 0x83:指令接收状态 0x91:数字收发接收通道工作状态 0x92:数字收发发射通道工作状态 0x93:数字收发AD寄存器数据回读 0x94:数字收发DA寄存器数据回读*/ unsigned int bitParaAddr;//参数BIT回读地址[15:0] unsigned short readCalNum : 8; // b7~b0 回读通道数 unsigned short readCeofAddr : 8; // b15~b8 回读补偿地址数(频点数/点数/阶数) unsigned short dbfCtrlBit[4];//波控指令BIT控制字(详见右) 指令BIT控制[15:0] 指令BIT控制[15:0] unsigned short bak46[16]; //备份 备份 备份 unsigned short cycleFreqNum2;//循环二接收本振频点号(FR2) 0-200;9300~9500MHz,1MHz一个点,共201个 0-200;9300~9500MHz,1MHz一个点,共201个 unsigned short cycleFreqNum1;//循环一接收本振频点号(FR1) 0-200;9300~9500MHz,1MHz一个点,共201个 0-200;9300~9500MHz,1MHz一个点,共201个 unsigned char clockSel; //B7~B0 晶振选择(频率源A) 0:自发自收 1:自关收外 暂不使用 0:自发自收 1:自关收外 unsigned char clockWaveNum; //B15~B8 波形个数(频率源A) 0x1~0xA =1~10 0xB:发连续波 暂不使用 0x1~0xA=1~10 0xB:发连续波 PULSE_PARA pulsePara[10];/*0x1:1MHz; 0x2:2MHz;0x3:4MHz; " "0:0(单载频);0x1:1MHz; 0x2:2MHz;0x3:4MHz; "*/ unsigned short bak30[15]; //备份 unsigned short dbfMode; //DBF工作模式 "0x40:光纤和网络送出波束数据(波瓣测试用) /*0x80:正常工作(正常工作用) 0x90:窄带接收内监校 0x91:窄带接收外监校 0x92:发射内监校 0x93:发射外监校 0x96:扫描架接收监校 0xc2:阵面BIT回读 0xc3:基本通道参数回读 0xc4:频点参数回读 0xc6:锥削权索引回读 0x65:基本通道参数加载 0x67:锥削权索引加载 0x68:频点参数加载 0x75:基本通道参数固化 " "0x40:光纤和网络送出波束数据(波瓣测试用) 0x80:正常工作(正常工作用) 0x90:窄带接收内监校 0x91:窄带接收外监校 0x92:发射内监校 0x93:发射外监校 0x96:扫描架接收监校 0xc2:阵面BIT回读 0xc3:基本通道参数回读 0xc4:频点参数回读 0xc6:锥削权索引回读 0x65:基本通道参数加载 0x67:锥削权索引加载 0x68:频点参数加载 0x75:基本通道参数固化 "*/ unsigned short workPara : 2; // B1~B0 工作参数 00:常规工作;01:步进频方式;10:远近区方式;11:频率分集 0:单频点; 1:多频点补盲;2:暂无;3:频率分集。无需填写 00:常规工作;01:步进频方式;10:远近区方式;11:频率分集 unsigned short WNFlag : 1;// B2 宽窄带标志 宽窄带标志,1:数据率>120M,0:数据率≤120M 无需填写 宽窄带标志,1:数据率>120M,0:数据率≤120M unsigned short bak49 : 1;//B3 备份 无 无 unsigned short rngSegment : 4;//B7~B4 远近区距离段数 最大4段 无需填写 最大4段 unsigned short freqMutiN : 4;// B11~B8 多频点频点数 最大40 无需填写 最大40 unsigned short bak50 : 1;//B12 备份 无 无 unsigned short collectSel : 2; // B14~B13 阵面数据采集 "11:采集波束数据 10:采集加权后数据 //01:采集原始通道数据 00:不采集(在工作状态时采集各通道的一些数据用于监测) " 无需填写 "11:采集波束数据 10:采集加权后数据 //01:采集原始通道数据 00:不采集(在工作状态时采集各通道的一些数据用于监测) " unsigned short bak51 : 1;// B15 备份 无 无 unsigned int dataLen; //数据包长度[15:0] "BIT校验用,不影响工作(BIT要填)填不填都不影响正常工作,但如果填错了BIT会报错" /* 数据包长度[31:16] "本帧数据的回波脉冲长度,脉冲积累数*单个脉冲距离库数*频点数 GH模式下,频点数为:G:5;H:3;单个脉冲距离库数为:采样率*(第一周期波门长度+第二周期波门长度) 脉冲积累数取665字设置的值 " 本帧数据的回波脉冲长度,脉冲积累数X波束数X单个脉冲距离库长 */ unsigned short pulseNum; //脉冲总数(本帧数据的脉冲个数) 8~512脉冲积累数 "BIT校验用,不影响工作(BIT要填) //填不填都不影响正常工作,但如果填错了BIT会报错 " 8~512脉冲积累数 unsigned int sampStart; //采集起始计数点数[15:0] "从该点数开始抽取32个点在网络转发,用于监测,正常工作不影响 //代点数,而不是时间,例如填50(十进制),则意味着DBF在其收到的数据的第50点开始,抽取32点转发 " 用于监测,正常工作不影响采集起始计数点数[31:16] 从这个点开始抽取64点,用于监测和查错 unsigned short dbfused; //DBF专用字段 unsigned short dbfOffset; //阵面子阵合成后选用的DBF参数偏移 阵面合成填16,不合成填8 本产品内已写死,无需填写 新增 阵面合成填16,不合成填8 unsigned short bak16; unsigned short freqSegment; //跳频段数 "GH模式,长短脉冲跳频,两组时分补盲循环填2 //其他无时分补盲,填1 " "GH模式,长短脉冲跳频,两组时分补盲循环填2 //其他无时分补盲,填1 " unsigned char dataRate : 4;//B0~B3 数据率 1:2bps,2:2bps;3:4bps 1:2bps,2:2bps;3:4bps unsigned char workMode2 : 4;//B4~B7 工作模式 A:1;B:2;C:3;D:4;E:5;F:6;G:7;H:8 F和G模式下,只处理2bps数据率;4bps由阵面做一级DBF; A:1;B:2;C:3;D:4;E:5;F:6;G:7 unsigned char bak17; unsigned short bak18[5]; unsigned char oneLineChlNum; //B7~B0 输入单根光纤通道数 频率分集,填1无需填写 按照实际填写,频率分集:填1 .无需填写 频率分集,填1无需填写 unsigned char dbfBeamNum; //B15~B8 合成波束数 无需填写 A/D/E模式:24/12;F/G模式:4/2;无需填写 unsigned char oneLineDbfNum; //B7~B0 DBF合成过程中输出单根光纤通道数 未定义 与B7~B0定义相同 unsigned char oneLineAfterDbfNum; //B15~B8 DBF对下一级输出单根光纤通道数 A/D/E模式:24/12;F/G模式:4×5频率/2×5频率; unsigned short bak19[3]; unsigned short freqIndex[10]; //频点索引,DBF计算回波alpha,beta值计算 频点索引:频点序号:从0起。 频点索引,DBF计算回波alpha,beta值计算 unsigned short freqIndex11to40[30];//频点11~频点40 BEAM_AZEL beamAngle[96]; //波束2到波束96方位、俯仰指向 unsigned char deamDbfCeof[96]; //B7~B0 波束1~96的锥削权索引 "权值索引的b6,b14代表了水平/垂直权,其中1为垂直0为水平 /*权值,而b0~b5或b8~b13则为权值号;权值需要阵面预先烧好,其中相同权值号的不同极化权值相同 以上1垂直0水平的实现方式其实还是通过权值实现,换句话说,b0-7、b8-15都是指代权值套数,b6和b14本身也是权值套数的一部分。例如b7-0为‘0x40’的时候指的是该波束为垂直极化,并且用第0套权值,但实际烧权值的时候,该套权值是烧在地址64,即‘0x40’的十进制上的,在该套权值中,水平组件对应用户ID下的权值均为0,只有垂直组件对应ID下各通道的权值为想要的权值,通过这种方式来实现水平和垂直的切换。 所以可以不遵守以上规律,可自行更改,但为了统一,除非权值套数非常多,否则以后可都遵守此规律 " "权值索引的b6,b14代表了水平/垂直权,其中1为垂直0为水平 权值,而b0~b5或b8~b13则为权值号;权值需要阵面预先烧好,其中相同权值号的不同极化权值相同 "*/ unsigned short dbfbak[60]; //DBF字段备份 unsigned short jambak[18]; //反干扰字段 unsigned short timeingEn : 1; //B0 定时使能 0:关闭,仅产生数据处理中断和雷控默认定时;1:开启 0:关闭,仅产生数据处理中断和雷控默认定时;1:开启 unsigned short bak52 : 15; //B15~B1 备份 unsigned int timeingSwitch; // 定时 每一位:0:关闭;1:开启 每一位:0:关闭;1:开启 unsigned short simTgtTime;//模拟目标模拟触发位置 "0 .1us单位,0~6553.5us //>接收波门起始,<接收波门结束 " 模拟目标的带宽和脉宽可以设 "0 .1us单位,0~6553.5us //>接收波门起始,<接收波门结束 " unsigned short pulseWidth;//脉冲宽度 1us单位,最大1 .5ms 保留,暂不使用 1us单位,最大1.5ms unsigned short pulseNum0;//填零脉冲数(距离模糊倍数) 0~20个 0~20个 unsigned short startSampTime; //时分脉冲1接收波门起始(1us) 1us 单位 1us 单位 unsigned short endSampTime; //时分脉冲1接收波门结束(1us) 1us 单位 1us 单位 unsigned short calStartSampTime;//监测组件接收波门起始(1us) 5 5 5 unsigned short calEndSampTime;//监测组件接收波门结束(1us) aa 170 aa unsigned short cancelStartSampTime;//对消采样波门起始 相对M0的提前时刻(us) 相对M0的提前时刻(us) unsigned short cancelEndSampTime;//对消采样波门结束 相对M0的提前时刻(us) 相对M0的提前时刻(us) unsigned short bak20; //备份 unsigned short simTgtFd : 15;//B14~B0 模拟目标fd,单位1Hz ±3661Hz ±3661Hz unsigned short simTgtsign : 1;//B15 符号位,0为减去fd,1为加上fd unsigned short simTgtAtten;//模拟目标衰减 0~100dB 不启用 0~100dB unsigned short txPulseNum; //发射脉冲数(8~512个) unsigned short PRT; //(100us~65ms)(1us) 所有时分周期求和 所有时分周期求和 unsigned short pulse2Start;//时分P2周期起始时刻(1us) unsigned short pulse3Start;//时分P3周期起始时刻(1us) unsigned short pulse2RxStart;//时分P2周期接收波门起始(1us) unsigned short pulse2RxEnd;//时分P2周期接收波门结束(1us) unsigned short pulse3RxStart;//时分P3周期接收波门起始(1us) unsigned short pulse3RxEnd;//时分P3周期接收波门结束(1us) unsigned short calTxRxEn : 2; // B1~B0 内外监测发射开关 "bit0:内监测,1:开,0:关闭(监测组件2通道) unsigned short bak121 : 14; //B15~B2 备份 unsigned short bak1232;//备份 匿影天线低噪放控制 unsigned short bak123[6];//备份 无 无 unsigned short dspMode;//信号处理工作方式 0:自检 1:RESET 2:工作 3:直通(时域IQ) 0:自检 1:RESET 2:工作 3:直通(时域IQ) unsigned short bak124;//备份 无 无 unsigned short method : 1;//B0 处理方式 0:FFT 1:PPP 0:FFT 1:PPP unsigned short points : 10; //B10~B1 FFT/PPP点数 8~512 与657字发射脉冲数相同 8~512 unsigned short winFun : 2; // B12~B11 FFT加权函数的选择 0:不加权 1:海明加权 2:Blackman加权 3:其他 0:不加权 1:海明加权 2:Blackman加权 3:其他 unsigned short pcFun : 2; //B14~B13 LFM脉压加权函数的选择 0:不加权 1:海明加权 2:Blackman加权 3:其他 0:不加权 1:海明加权 2:Blackman加权 3:其他 unsigned short pcPara : 1; //B15 脉压选择 0:不脉压 1:脉压 对窄脉冲无效,窄脉冲默认不脉压,默认填1即可,需要验证宽脉冲时填0 0:不脉压 1:脉压 unsigned short bak125; //备份 unsigned short beamNum;//总波束数 1~60 1~60 unsigned short phaseCodeEn : 3; //B15~B13 相位编码使能 0:不开启,1~7:对应1~7套相位编码 信号处理算法标志 0:不开启,1~7:对应1~7套相位编码 unsigned short clutterProEn : 1; //B12 地杂波处理算法选择 0:手动;1:自适应 0:手动;1:自适应 unsigned short singleCompEn : 1; //B11 信号形式补偿开关 0:关闭;1开启 0:关闭;1开启 unsigned short fsFilterEn : 1; //B10 飞机舰船滤波开关 0:关闭;1开启 0:关闭;1开启 unsigned short b2bSmoothEn : 1; //B9 帧内平滑开关 0:关闭;1开启 0:关闭;1开启 unsigned short beamSmoothEn : 1; //B8 帧间平滑开关 0:关闭;1开启 0:关闭;1开启 unsigned short antSyncEn : 1; //B7 反异步开关 0:关闭;1开启 0:关闭;1开启 unsigned short noPulseDelEn : 1; //B6 窄脉冲剔除开关 0:关闭;1开启 0:关闭;1开启 unsigned short sideEn : 1; //B5 副瓣对消开关 0:关闭;1开启 0:关闭;1开启 unsigned short hideEn : 1; //B4 副瓣匿影开关 0:关闭;1开启 0:关闭;1开启 unsigned short CCOREn : 1; //B3 CCOR开关 0:关闭;1开启 0:关闭;1开启 unsigned short SIGEn : 1; //B2 SIG开关 0:关闭;1开启 0:关闭;1开启 unsigned short LOGEn : 1; //B1 LOG开关 0:关闭;1开启 0:关闭;1开启 unsigned short SQIEn : 1; //B0 SQI开关 0:关闭;1开启 0:关闭;1开启 unsigned short SQIThl; //SQI门限 0~100,代表0-1,100量化 0~100,代表0-1,100量化 unsigned short LOGThl; //LOG门限 0~100,代表0-1,100量化 0~100,代表0-1,100量化 unsigned short SIGThl; //SIG门限 0~100,代表0-1,100量化 0~100,代表0-1,100量化 unsigned short CCORThl; //CCOR门限 0~100,代表0-1,100量化 0~100,代表0-1,100量化 unsigned short hideThl;//副瓣匿影门限 0~65535,100倍填写,单位:Db 0~65535,100倍填写,单位:Db unsigned char noPulseDelWidthThl; // B15~B8 窄脉冲剔除宽度门限 值域[0,255],量化单位1us,0:不剔除 窄脉冲剔除用 值域[0,255],量化单位1us,0:不剔除 unsigned char noPulseDelAmpThl; unsigned short antSyncThl; //反异步门限 反异步用 unsigned short noiseThl1;//信号处理噪声门限1 0~1000 .00 int16,噪声功率nn1的倍数(噪声功率由信号处理配置文件给出) 0~1000.00 unsigned short noiseThl2;//信号处理噪声门限2 0~1000 .00 int16,噪声功率nn1的倍数(噪声功率由信号处理配置文件给出) 0~1000.00 unsigned short noiseThl3;//信号处理噪声门限3 0~1000 .00 int16,噪声功率nn1的倍数(噪声功率由信号处理配置文件给出) 0~1000.00 unsigned short b2bSmooths; //帧间平滑点数 1~1000,奇数 3*3的有效数小于此值填无效值,否则填有效数据之和的平均数 1~1000,媸? unsigned short beamSmooths; //帧内平滑点数 1~1000,奇数 1~1000,奇数 unsigned short groundClutterVelThl;//地杂波速度门限 0-5000,100倍量化,int16,单位是m/s 地杂波处理算法选择为手动时起效 0-5000,100倍量化,int16,单位是m/s unsigned short groundClutterWiodthThl;//地杂波谱宽门限 0-5000,100倍量化,int16,单位是m/s 0-5000,100倍量化,int16,单位是m/s unsigned short groundClutterRngThl;//地杂波距离门限 0-500,无量化,int16,单位是km 0-500,无量化,int16,单位是km unsigned short bak31;//备份 无 无 unsigned short doubFreqPro : 2; //B1~B0 双重频算法选择 0:单重频;1:双重频;2:重频复用 单重频时填0 0:单重频;1:双重频;2:重频复用 unsigned short doubFreqFlag : 2; // B3~B2 双重频标志 其它:否;1:是,第一帧;2:是,第二帧 单重频时填0 其它:否;1:是,第一帧;2:是,第二帧 unsigned short doubFreqType : 2;//B5~B4 双重频比 0—1:1;1—2:3;2—3:4;3—4:5 单重频时填0 0—1:1;1—2:3;2—3:4;3—4:5 unsigned short bak32 : 10;//B15~B6 备份 无 无 unsigned short bak33[27]; //备份 unsigned short txPhaseCtrl[127];//发射脉冲相位控制 (所需相位值(度))/360×2^16 int16,相位编码用 (所需相位值(度))/360×2^16 unsigned short bak34[13];//备份 无 无 unsigned short p1_20Start[20];//脉冲1~20 首库库号(相对M0)零号库 波束1~20 标定零号库库号(相对M0) int16 波束1~20 标定零号库库号(相对M0) unsigned short p1_10Start[20];//脉冲1~10 起始库号(距离拼接用) int16 unsigned short p1_10End[20];//脉冲1~10 结束库号(距离拼接用) int16 unsigned short p1_20End[20];//脉冲1~20 库数(距离拼接用) int16 unsigned short b2bRngAdd; //距离拼接(波束之间) 0:不启用 1:启用 0:不启用 1:启用 unsigned short burstNum;//有效波束数 1~60 1~60 unsigned short rangUnit;//库长 0~65535 0:150m;1:75m;2:37 .5m 0~65535 unsigned char noiseTestsn;// unsigned char noiseTestsn2;// unsigned short testStart : 1; // 1 B1~B0 测试起始标志 unsigned short testSn : 15; //B2~B15 测试序列号 unsigned short compEn; //补偿开关 备用 备用 unsigned short bak35[49];//备用 无 无 unsigned short txEle; //发射仰角 角度×100 "波瓣测试时用; //正常工作时,资源调度填写和解析给RCM不同发射仰角用 " 角度×100 unsigned short rxEle;//接收仰角 角度×100 波瓣测试时用,接收数据在dbf前先根据此值移相,再波束合成,这样可以画不同指向的方向图(即此值为方向图角度横轴,方向图样式由前面dbf字段的beta码和锥削权决定) 角度×100 unsigned short bak37; unsigned short bak38; unsigned int checkSum16; //校验和L 16累加 16累加 unsigned short tail1;//帧结束标志 固定为0x55AA 结束标志 固定为0x55AA unsigned short tail2;//帧结束标志 固定为0xAA55 结束标志 固定为0xAA55 }OWS_SHD_CTRL_CMD;

************* Preparing the environment for Debugger Extensions Gallery repositories ************** ExtensionRepository : Implicit UseExperimentalFeatureForNugetShare : true AllowNugetExeUpdate : true NonInteractiveNuget : true AllowNugetMSCredentialProviderInstall : true AllowParallelInitializationOfLocalRepositories : true EnableRedirectToChakraJsProvider : false -- Configuring repositories ----> Repository : LocalInstalled, Enabled: true ----> Repository : UserExtensions, Enabled: true >>>>>>>>>>>>> Preparing the environment for Debugger Extensions Gallery repositories completed, duration 0.000 seconds ************* Waiting for Debugger Extensions Gallery to Initialize ************** >>>>>>>>>>>>> Waiting for Debugger Extensions Gallery to Initialize completed, duration 0.000 seconds ----> Repository : UserExtensions, Enabled: true, Packages count: 0 ----> Repository : LocalInstalled, Enabled: true, Packages count: 44 Microsoft (R) Windows Debugger Version 10.0.27829.1001 AMD64 Copyright (c) Microsoft Corporation. All rights reserved. Loading Dump File [C:\Windows\Minidump\071525-14000-01.dmp] Mini Kernel Dump File: Only registers and stack trace are available ************* Path validation summary ************** Response Time (ms) Location Deferred srv* Symbol search path is: srv* Executable search path is: Windows 10 Kernel Version 26100 MP (32 procs) Free x64 Product: WinNt, suite: TerminalServer SingleUserTS Personal Kernel base = 0xfffff80385000000 PsLoadedModuleList = 0xfffff80385ef4420 Debug session time: Tue Jul 15 17:28:19.638 2025 (UTC + 8:00) System Uptime: 0 days 0:17:31.281 Loading Kernel Symbols ............................................................... ................................................................ ................................................................ ............................................ Loading User Symbols Loading unloaded module list ............................. For analysis of this file, run !analyze -v nt!KeBugCheckEx: fffff80385487cc0 48894c2408 mov qword ptr [rsp+8],rcx ss:0018:ffffc881cabadb10=0000000000000101 8: kd> !analyze -v Loading Kernel Symbols ............................................................... ................................................................ ................................................................ ............................................ Loading User Symbols Loading unloaded module list ............................. ******************************************************************************* * * * Bugcheck Analysis * * * ******************************************************************************* CLOCK_WATCHDOG_TIMEOUT (101) An expected clock interrupt was not received on a secondary processor in an MP system within the allocated interval. This indicates that the specified processor is hung and not processing interrupts. Arguments: Arg1: 0000000000000006, Clock interrupt time out interval in nominal clock ticks. Arg2: 0000000000000000, 0. Arg3: ffffc881ca7a4180, The PRCB address of the hung processor. Arg4: 0000000000000002, The index of the hung processor. Debugging Details: ------------------ KEY_VALUES_STRING: 1 Key : Analysis.CPU.mSec Value: 1796 Key : Analysis.Elapsed.mSec Value: 10236 Key : Analysis.IO.Other.Mb Value: 0 Key : Analysis.IO.Read.Mb Value: 23 Key : Analysis.IO.Write.Mb Value: 0 Key : Analysis.Init.CPU.mSec Value: 359 Key : Analysis.Init.Elapsed.mSec Value: 11295 Key : Analysis.Memory.CommitPeak.Mb Value: 103 Key : Analysis.Version.DbgEng Value: 10.0.27829.1001 Key : Analysis.Version.Description Value: 10.2503.24.01 amd64fre Key : Analysis.Version.Ext Value: 1.2503.24.1 Key : Bugcheck.Code.LegacyAPI Value: 0x101 Key : Bugcheck.Code.TargetModel Value: 0x101 Key : Dump.Attributes.AsUlong Value: 0x21008 Key : Dump.Attributes.DiagDataWrittenToHeader Value: 1 Key : Dump.Attributes.ErrorCode Value: 0x0 Key : Dump.Attributes.KernelGeneratedTriageDump Value: 1 Key : Dump.Attributes.LastLine Value: Dump completed successfully. Key : Dump.Attributes.ProgressPercentage Value: 0 Key : Failure.Bucket Value: CLOCK_WATCHDOG_TIMEOUT_nt!KeAccumulateTicks Key : Failure.Hash Value: {f9e2f3e5-5717-d66f-239c-7b2e10a43f9e} Key : Stack.Pointer Value: ISR BUGCHECK_CODE: 101 BUGCHECK_P1: 6 BUGCHECK_P2: 0 BUGCHECK_P3: ffffc881ca7a4180 BUGCHECK_P4: 2 FILE_IN_CAB: 071525-14000-01.dmp DUMP_FILE_ATTRIBUTES: 0x21008 Kernel Generated Triage Dump FAULTING_THREAD: ffff9a8ea34b5040 FAULTING_PROCESSOR: 2 PROCESS_NAME: System BLACKBOXBSD: 1 (!blackboxbsd) BLACKBOXNTFS: 1 (!blackboxntfs) BLACKBOXPNP: 1 (!blackboxpnp) BLACKBOXWINLOGON: 1 CUSTOMER_CRASH_COUNT: 1 STACK_TEXT: ffffc881cabadb08 fffff803852d6b0f : 0000000000000101 0000000000000006 0000000000000000 ffffc881ca7a4180 : nt!KeBugCheckEx ffffc881cabadb10 fffff803852f3e48 : 0000000000000000 ffffc881cab9a700 ffffc881cab91180 ffffc881cab91180 : nt!KeAccumulateTicks+0x6bf ffffc881cabadb80 fffff803852f3a39 : 0000000000000020 0000000000000000 00000002729cec98 fffff78000000350 : nt!KiUpdateRunTime+0xa8 ffffc881cabadbe0 fffff803852f2eff : 0000000000000000 0000000000000000 000000000000000f ffffc881cab9a860 : nt!KiUpdateTime+0x469 ffffc881cabade40 fffff803852f214f : fffff80385f8da48 ffff9a8e77798c40 0000000000000000 ffffc881cab91180 : nt!KeClockInterruptNotify+0x18f ffffc881cabadf50 fffff8038565d6ae : 0000026920bd783f ffff9a8e77798c40 0000000272e3330e 0000000000000000 : nt!KiCallInterruptServiceRoutine+0x2df ffffc881cabadfb0 fffff8038565debc : 0000000272e31f6a ffff8485843b6c20 0000000272e31f74 00000262f85b278e : nt!KiInterruptSubDispatchNoLockNoEtw+0x4e ffff8485843b6ba0 fffff803852491c2 : 0000000000000002 0000000000000001 ffffc881cab91180 0000000000000001 : nt!KiInterruptDispatchNoLockNoEtw+0x3c ffff8485843b6d30 fffff80385248e95 : ffff9a8e77824180 ffff8485843b6e60 ffff9a8e77824190 fffff80300000000 : nt!KiIpiWaitForRequestBarrier+0x32 ffff8485843b6d60 fffff8038528dd39 : 0000000000001000 0000000000000000 0000000000000001 ffffaaed40f2a1c0 : nt!MiFlushTbList+0x885 ffff8485843b6f70 fffff8038528d51b : ffffda81e5438000 00000000ea932801 0000001c00000000 0000000000000004 : nt!MmSetAddressRangeModifiedEx+0x4a9 ffff8485843b7010 fffff80385288773 : ffff9a8e812135c0 0000000000000000 ffff8485843b7200 ffff8485843b7300 : nt!CcFlushCacheOneRange+0x1ab ffff8485843b7100 fffff80385288ab4 : 0000000000000000 ffff9a8e8109a818 0000000000000000 ffff9a8e8109a6e0 : nt!CcWriteBehindAsync+0x127 ffff8485843b7270 fffff803852882d7 : ffff9a8e8109a79c 0000000000000000 ffff9a8e8109a818 ffff9a8e778a5720 : nt!CcAsyncLazywriteWorker+0x1e4 ffff8485843b7360 fffff8038527f6e9 : ffff9a8ea34b5040 ffff8485843b74c0 fffff80385288260 ffff9a8e81213bb0 : nt!CcAsyncLazywriteWorkerThread+0x77 ffff8485843b73c0 fffff8038541d24a : ffff9a8ea34b5040 ffff9a8ea34b5040 fffff8038527f540 ffff9a8e7773fb20 : nt!ExpWorkerThread+0x1a9 ffff8485843b7570 fffff8038565c664 : ffffc881caa59180 ffff9a8ea34b5040 fffff8038541d1f0 0000000000000246 : nt!PspSystemThreadStartup+0x5a ffff8485843b75c0 0000000000000000 : ffff8485843b8000 ffff8485843b1000 0000000000000000 0000000000000000 : nt!KiStartSystemThread+0x34 SYMBOL_NAME: nt!KeAccumulateTicks+6bf MODULE_NAME: nt IMAGE_NAME: ntkrnlmp.exe IMAGE_VERSION: 10.0.26100.1 STACK_COMMAND: .process /r /p 0xffff9a8e776ee040; .thread 0xffff9a8ea34b5040 ; kb BUCKET_ID_FUNC_OFFSET: 6bf FAILURE_BUCKET_ID: CLOCK_WATCHDOG_TIMEOUT_nt!KeAccumulateTicks OSPLATFORM_TYPE: x64 OSNAME: Windows 10 FAILURE_ID_HASH: {f9e2f3e5-5717-d66f-239c-7b2e10a43f9e} Followup: MachineOwner --------- 这个问题怎么解决

LJMP MAIN ORG 000BH LJMP TIMER0_ISR PATTERN_TABLE: DB 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 DB 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 DB 0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81 DB 0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55 DB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF DB 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 DB 0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00 DB 0x18,0x3C,0x7E,0xFF,0xFF,0x7E,0x3C,0x18 DB 0x0C,0x1E,0x3E,0x7C,0x7C,0x3E,0x1E,0x0C DB 0x08,0x0C,0x0E,0xFF,0xFF,0x0E,0x0C,0x08 DB 0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C DB 0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00 DB 0x18,0x18,0x18,0xFF,0xFF,0x18,0x18,0x18 DB 0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF DB 0xFF,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01 DB 0x00,0x20,0x60,0x40,0x40,0x60,0x20,0x00 DB 0xE0,0x80,0x80,0x80,0x80,0x80,0x80,0x80 DB 0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C DB 0x08,0x18,0x28,0x08,0x08,0x08,0x08,0x1C DB 0x18,0x24,0x42,0x7E,0x42,0x42,0x42,0x42 DB 0x3C,0x42,0x95,0xA1,0xA1,0x95,0x42,0x3C DB 0xFF,0x81,0x81,0x81,0x81,0x81,0x81,0xFF DB 0x3C,0x42,0x99,0xA5,0xA5,0x99,0x42,0x3C DB 0x08,0x0C,0x0E,0xFF,0xFF,0x0E,0x0C,0x08 DB 0x10,0x30,0x70,0xFF,0xFF,0x70,0x30,0x10 DB 0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF DB 0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80 DB 0x24,0x5A,0x24,0x5A,0x81,0x5A,0x24,0x5A DB 0x99,0x5A,0x3C,0xE7,0xE7,0x3C,0x5A,0x99 DB 0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55 DB 0x00,0x00,0x18,0x24,0x24,0x18,0x00,0x00 DB 0x00,0x18,0x24,0x42,0x42,0x24,0x18,0x00 DB 0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81 DB 0x01,0x02,0x04,0x08,0x01,0x02,0x04,0x08 DB 0x08,0x04,0x02,0x01,0x08,0x04,0x02,0x01 DB 0x7E,0x40,0x40,0x7E,0x02,0x02,0x02,0x7E DB 0x7E,0x41,0x41,0x7E,0x41,0x41,0x41,0x7E DB 0x3E,0x41,0x80,0x80,0x80,0x80,0x41,0x3E DB 0x7C,0x42,0x41,0x41,0x41,0x41,0x42,0x7C DB 0x7F,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F DB 0x08,0x14,0x22,0x7F,0x7F,0x22,0x14,0x08 DB 0xFF,0x81,0x42,0x24,0x18,0x24,0x42,0xFF DB 0x03,0x07,0x0F,0x1F,0x1E,0x1C,0x18,0x10 DB 0x1C,0x22,0x41,0xFF,0x9D,0x9D,0x9D,0xFF DB 0x3E,0x22,0x7F,0x41,0x41,0x41,0x41,0x7F DB 0x00,0x00,0x18,0x24,0x5A,0x81,0x42,0x24 DB 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80 DB 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40 DB 0x01,0x02,0x04,0x08,0x01,0x02,0x04,0x08 DB 0x08,0x04,0x02,0x01,0x08,0x04,0x02,0x01 DB 0x7E,0x40,0x40,0x7E,0x02,0x02,0x02,0x7E DB 0x7E,0x41,0x41,0x7E,0x41,0x41,0x41,0x7E DB 0x3E,0x41,0x80,0x80,0x80,0x80,0x41,0x3E DB 0x7C,0x42,0x41,0x41,0x41,0x41,0x42,0x7C DB 0x7F,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F DB 0x08,0x14,0x22,0x7F,0x7F,0x22,0x14,0x08 DB 0xFF,0x81,0x42,0x24,0x18,0x24,0x42,0xFF DB 0x03,0x07,0x0F,0x1F,0x1E,0x1C,0x18,0x10 DB 0x1C,0x22,0x41,0xFF,0x9D,0x9D,0x9D,0xFF DB 0x3E,0x22,0x7F,0x41,0x41,0x41,0x41,0x7F DB 0x00,0x00,0x18,0x24,0x5A,0x81,0x42,0x24 DB 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80 DB 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40 MAIN: MOV SP, #60H MOV R0, #00H MOV R2, #100 MOV TMOD, #01H MOV TH0, #0FCH MOV TL0, #66H SETB TR0 SETB ET0 SETB EA MAIN_LOOP: LCALL DISPLAY_PATTERN SJMP MAIN_LOOP DISPLAY_PATTERN: MOV DPTR, #PATTERN_TABLE MOV A, R0 MOV B, #8 MUL AB ADD A, DPL MOV DPL, A MOV A, B ADDC A, DPH MOV DPH, A MOV R1, #8 DISPLAY_LOOP: CLR A MOVC A, @A+DPTR MOV P0, A INC DPTR MOV P0, #00H LCALL DELAY_1US DJNZ R1, DISPLAY_LOOP RET TIMER0_ISR: PUSH PSW PUSH ACC MOV TH0, #0FCH MOV TL0, #66H DJNZ R2, TIMER_EXIT MOV R2, #100 INC R0 CJNE R0, #64, TIMER_EXIT MOV R0, #00H TIMER_EXIT: POP ACC POP PSW RETI DELAY_1US: MOV R3, #2 DELAY_LOOP: NOP DJNZ R3, DELAY_LOOP RET END为什么只显示前50个图

[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034] [ 0.000000] Linux version 5.15.36-xilinx-v2022.2 (oe-user@oe-host) (aarch64-xilinx-linux-gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37.20210721) #1 SMP Mon Oct 3 07:50:07 UTC 2022 [ 0.000000] Machine model: xlnx,zynqmp [ 0.000000] earlycon: cdns0 at MMIO 0x00000000ff000000 (options '115200n8') [ 0.000000] printk: bootconsole [cdns0] enabled [ 0.000000] efi: UEFI not found. [ 0.000000] Zone ranges: [ 0.000000] DMA32 [mem 0x0000000000000000-0x00000000ffffffff] [ 0.000000] Normal [mem 0x0000000100000000-0x000000097fffffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fefffff] [ 0.000000] node 0: [mem 0x0000000800000000-0x000000097fffffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x000000097fffffff] [ 0.000000] On node 0, zone Normal: 256 pages in unavailable ranges [ 0.000000] cma: Reserved 256 MiB at 0x000000006b800000 [ 0.000000] psci: probing for conduit method from DT. [ 0.000000] psci: PSCIv1.1 detected in firmware. [ 0.000000] psci: Using standard PSCI v0.2 function IDs [ 0.000000] psci: MIGRATE_INFO_TYPE not supported. [ 0.000000] psci: SMC Calling Convention v1.2 [ 0.000000] percpu: Embedded 18 pages/cpu s34776 r8192 d30760 u73728 [ 0.000000] Detected VIPT I-cache on CPU0 [ 0.000000] CPU features: detected: ARM erratum 845719 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 2064132 [ 0.000000] Kernel command line: earlycon console=ttyPS0,115200 clk_ignore_unused root=/dev/mmcblk0p2 rw rootwait [ 0.000000] Dentry cache hash table entries: 1048576 (order: 11, 8388608 bytes, linear) [ 0.000000] Inode-cache hash table entries: 524288 (order: 10, 4194304 bytes, linear) [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off [ 0.000000] Unable to handle kernel paging request at virtual address ffff00007fc00000 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000047 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x07: level 3 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000047 [ 0.000000] CM = 0, WnR = 1 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00007fc00000] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8008 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8008] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Unable to handle kernel paging request at virtual address ffff00097fff8128 [ 0.000000] Mem abort info: [ 0.000000] ESR = 0x96000006 [ 0.000000] EC = 0x25: DABT (current EL), IL = 32 bits [ 0.000000] SET = 0, FnV = 0 [ 0.000000] EA = 0, S1PTW = 0 [ 0.000000] FSC = 0x06: level 2 translation fault [ 0.000000] Data abort info: [ 0.000000] ISV = 0, ISS = 0x00000006 [ 0.000000] CM = 0, WnR = 0 [ 0.000000] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000001378000 [ 0.000000] [ffff00097fff8128] pgd=180000097fff8003, p4d=180000097fff8003 [ 0.000000] Insufficient stack space to handle exception! [ 0.000000] ESR: 0x96000006 -- DABT (current EL) [ 0.000000] FAR: 0xffff00097fff8128 [ 0.000000] Task stack: [0xffff8000093a0000..0xffff8000093a4000] [ 0.000000] IRQ stack: [0x0000000000000000..0x0000000000004000] [ 0.000000] Overflow stack: [0xffff00097ef6c2b0..0xffff00097ef6d2b0] [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 5.15.36-xilinx-v2022.2 #1 [ 0.000000] Hardware name: xlnx,zynqmp (DT) [ 0.000000] pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 0.000000] pc : show_pte+0x18c/0x238 [ 0.000000] lr : show_pte+0x15c/0x238 [ 0.000000] sp : ffff8000093a0020 [ 0.000000] x29: ffff8000093a0020 x28: ffff8000093b4e80 x27: 000000007fc8d978 [ 0.000000] x26: 0000000000000000 x25: 0000000000000000 x24: ffff00097efb6f80 [ 0.000000] x23: ffff800009107000 x22: ffff800009178000 x21: 0000000000000128 [ 0.000000] x20: ffff00097fff8000 x19: ffff00097fff8128 x18: ffffffffffffffff [ 0.000000] x17: 3030666666662073 x16: 736572646461206c x15: ffff8000094a7030 [ 0.000000] x14: 0000000000000010 x13: ffff8000093c6128 x12: 00000000000003ba [ 0.000000] x11: 000000000000013e x10: ffff8000093c6128 x9 : ffff8000093c6128 [ 0.000000] x8 : 00000000fffff7ff x7 : ffff8000093f2128 x6 : ffff8000093f2128 [ 0.000000] x5 : 0000000000005ff4 x4 : 40000000fffff93e x3 : 0000000000000000 [ 0.000000] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff8000090037e8 [ 0.000000] Kernel panic - not syncing: kernel stack overflow zynqmp板卡内核打印这个错误如何解决

/* USER CODE BEGIN Header */ /** ****************************************************************************** * File Name : freertos.c * Description : Code for freertos applications ****************************************************************************** * @attention * * Copyright (c) 2024 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "FreeRTOS.h" #include "task.h" #include "main.h" #include "cmsis_os.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "usart.h" #include "gpio.h" #include "tim.h" #include <string.h> #include <stdio.h> /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ #define MOTOR_PWM_MAX 19999 // PWM最大值 (Period - 1) #define MOTOR_PWM_MIN 0 // PWM最小值 /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN Variables */ struct uart3_rx_t { int num,ok,en; uint8_t data[28]; int class; float score; int x1,y1,x2,y2; uint8_t datarx; }uart3_rx; struct uart2_rx_t { int num,ok,en; uint8_t data[3]; int shexiangtou_en; int manzaijianche_en; int dangban_en; int youhailaji_en; int chuyulaji_en; int kehuishou_en; int qitalaji_en; uint8_t datarx; }uart2_rx; struct pingmu_tx_t { int manzai,ok,en; int class; float score; int x1,y1,x2,y2; }pingmu_tx; osThreadId motorTaskHandle; osThreadId motor2TaskHandle; osThreadId manzaiTaskHandle; osThreadId txTaskHandle; osThreadId uart6MutexHandle; // 新增:电机控制和超声波测距任务句柄 osThreadId motorControlTaskHandle; // 电机控制任务句柄 osThreadId ultrasonicTaskHandle; // 超声波测距任务句柄 // 新增:超声波测距变量 float ultrasonic1_distance = 0.0f; // 超声波1测量距离 (cm) float ultrasonic2_distance = 0.0f; // 超声波2测量距离 (cm) // 新增:舵机状态跟踪变量 typedef enum { SERVO_IDLE = 0, // 舵机空闲状态(在原位) SERVO_WORKING = 1, // 舵机正在执行分类动作 SERVO_RETURNING = 2 // 舵机正在回到原位 } ServoState_t; volatile ServoState_t servoState = SERVO_IDLE; // 舵机状态 volatile uint32_t servoWorkStartTime = 0; // 舵机工作开始时间 // 新增:电机启动停止延时控制变量 volatile uint32_t motor1_startConditionStartTime = 0; // 电机1启动条件开始时间 volatile uint32_t motor2_startConditionStartTime = 0; // 电机2启动条件开始时间 volatile uint8_t motor1_startConditionActive = 0; // 电机1启动条件是否激活 volatile uint8_t motor2_startConditionActive = 0; // 电机2启动条件是否激活 volatile uint32_t motor1_stopConditionStartTime = 0; // 电机1停止条件开始时间 volatile uint32_t motor2_stopConditionStartTime = 0; // 电机2停止条件开始时间 volatile uint8_t motor1_stopConditionActive = 0; // 电机1停止条件是否激活 volatile uint8_t motor2_stopConditionActive = 0; // 电机2停止条件是否激活 // 电机当前状态 volatile uint8_t motor1_running = 0; // 电机1是否正在运行 volatile uint8_t motor2_running = 0; // 电机2是否正在运行 volatile uint8_t servo_class_to_act = 0; volatile uint8_t is_playing_manzai = 0; // 满载播报进行中标志 volatile uint32_t manzai_play_start = 0; // 满载播报开始时间 volatile uint32_t garbage_delay_start = 0; // 垃圾识别延迟开始时间 volatile uint8_t garbage_to_play = 0; // 待播放的垃圾类别 /* USER CODE END Variables */ osThreadId defaultTaskHandle; osSemaphoreId motorHandle; osSemaphoreId motor2Handle; osSemaphoreId rxlubancatHandle; osSemaphoreId rxpingmuHandle; osSemaphoreId bujingdianjiHandle; osSemaphoreId manzaiSignalHandle; /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ int fun (int a,int b, int c); _Noreturn void systemMonitorTask(void const * argument); _Noreturn void motor2Task(void const * argument); //_Noreturn void bujingdianjiTask(void const * argument); _Noreturn void manzaiTask(void const * argument); _Noreturn void txTask(void const * argument); // 新增:电机控制和超声波测距任务函数声明 _Noreturn void motorControlTask(void const * argument); // 核心电机控制任务 _Noreturn void ultrasonicTask(void const * argument); // 超声波测距任务 /* USER CODE END FunctionPrototypes */ void StartDefaultTask(void const * argument); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ /* GetIdleTaskMemory prototype (linked to static allocation support) */ void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); /* USER CODE BEGIN GET_IDLE_TASK_MEMORY */ static StaticTask_t xIdleTaskTCBBuffer; static StackType_t xIdleStack[configMINIMAL_STACK_SIZE]; void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) { *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer; *ppxIdleTaskStackBuffer = &xIdleStack[0]; *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* place for user code */ } /* USER CODE END GET_IDLE_TASK_MEMORY */ /** * @brief FreeRTOS initialization * @param None * @retval None */ void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* USER CODE BEGIN RTOS_MUTEX */ osMutexDef(uartMutex); osMutexId uartMutexHandle = osMutexCreate(osMutex(uartMutex)); osMutexDef(uart6Mutex); uart6MutexHandle = osMutexCreate(osMutex(uart6Mutex)); /* USER CODE END RTOS_MUTEX */ /* Create the semaphores(s) */ /* definition and creation of motor */ osSemaphoreDef(motor); motorHandle = osSemaphoreCreate(osSemaphore(motor), 1); /* definition and creation of motor2 */ osSemaphoreDef(motor2); motor2Handle = osSemaphoreCreate(osSemaphore(motor2), 1); /* definition and creation of rxlubancat */ osSemaphoreDef(rxlubancat); rxlubancatHandle = osSemaphoreCreate(osSemaphore(rxlubancat), 1); /* definition and creation of rxpingmu */ osSemaphoreDef(rxpingmu); rxpingmuHandle = osSemaphoreCreate(osSemaphore(rxpingmu), 1); osSemaphoreDef(manzaiSignal); manzaiSignalHandle = osSemaphoreCreate(osSemaphore(manzaiSignal), 1); /* definition and creation of bujingdianji */ osSemaphoreDef(bujingdianji); bujingdianjiHandle = osSemaphoreCreate(osSemaphore(bujingdianji), 1); /* USER CODE BEGIN RTOS_SEMAPHORES */ /* add semaphores, ... */ /* USER CODE END RTOS_SEMAPHORES */ HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart3_rx.datarx, 1); HAL_UART_Receive_IT(&huart6, (uint8_t *)&uart2_rx.datarx, 1); HAL_NVIC_SetPriority(USART1_IRQn, 6, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); HAL_NVIC_SetPriority(USART6_IRQn, 6, 0); HAL_NVIC_EnableIRQ(USART6_IRQn); TIM_OC_InitTypeDef sConfigOC = {0}; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); /* USER CODE BEGIN RTOS_TIMERS */ /* start timers, add new ones, ... */ /* USER CODE END RTOS_TIMERS */ /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ /* USER CODE END RTOS_QUEUES */ /* Create the thread(s) */ /* definition and creation of defaultTask */ osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ // osThreadDef(motorTask, motorTask, osPriorityNormal, 0, 128); // 添加舵机初始化 //__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 1300); // 舵机1初始位置 //__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 2030); // 舵机2初始位置 // HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); // 启动PWM输出 // HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2); // servoState = SERVO_IDLE; // 设置初始状态 // motorTaskHandle = osThreadCreate(osThread(motorTask), NULL); // 保留现有的舵机控制任务 osThreadDef(motor2Task, motor2Task, osPriorityAboveNormal, 0, 128); motor2TaskHandle = osThreadCreate(osThread(motor2Task), NULL); // 保留现有的满载检测任务 osThreadDef(manzaiTask, manzaiTask, osPriorityNormal, 0, 128); manzaiTaskHandle = osThreadCreate(osThread(manzaiTask), NULL); osThreadDef(systemMonitorTask, systemMonitorTask, osPriorityBelowNormal, 0, 128); osThreadCreate(osThread(systemMonitorTask), NULL); // 保留现有的串口屏通讯任务 osThreadDef(txTask, txTask, osPriorityNormal, 2, 128); txTaskHandle = osThreadCreate(osThread(txTask), NULL); // 新增:电机控制任务 osThreadDef(motorControlTask, motorControlTask, osPriorityNormal, 0, 256); motorControlTaskHandle = osThreadCreate(osThread(motorControlTask), NULL); // 新增:超声波测距任务 osThreadDef(ultrasonicTask, ultrasonicTask, osPriorityLow, 0, 256); ultrasonicTaskHandle = osThreadCreate(osThread(ultrasonicTask), NULL); /* USER CODE END RTOS_THREADS */ } _Noreturn void systemMonitorTask(void const * argument) { uint32_t last_heartbeat = HAL_GetTick(); const uint32_t WATCHDOG_TIMEOUT = 30000; // 30秒超时 for(;;) { // 检查任务堆栈使用情况 UBaseType_t uxHighWaterMark = uxTaskGetStackHighWaterMark(NULL); if(uxHighWaterMark < 20) { NVIC_SystemReset(); // 堆栈溢出复位 } // 30秒无心跳复位 if(HAL_GetTick() - last_heartbeat > WATCHDOG_TIMEOUT) { NVIC_SystemReset(); } // 更新心跳时间 last_heartbeat = HAL_GetTick(); osDelay(1000); } } /* USER CODE BEGIN Header_StartDefaultTask */ /** * @brief Function implementing the defaultTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void const * argument) { /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ uint32_t last_activity_time = HAL_GetTick(); uart2_rx.manzaijianche_en = 1; for(;;) { //xSemaphoreTake(rxpingmuHandle,portMAX_DELAY); if(xSemaphoreTake(rxpingmuHandle, 100) == pdTRUE) { switch (uart2_rx.data[1]) { case 1: uart2_rx.shexiangtou_en=0; break; case 0: uart2_rx.shexiangtou_en=1; break; case 3: uart2_rx.manzaijianche_en=0; break; case 2: uart2_rx.manzaijianche_en=1; break; case 4: uart2_rx.dangban_en=0; break; case 5: uart2_rx.dangban_en=1; break; case 6: uart2_rx.youhailaji_en=0; break; case 7: uart2_rx.youhailaji_en=1; break; case 8: uart2_rx.chuyulaji_en=0; break; case 9: uart2_rx.chuyulaji_en=1; break; case 10: uart2_rx.kehuishou_en=0; break; case 11: uart2_rx.kehuishou_en=1; break; case 12: uart2_rx.qitalaji_en=0; break; case 13: uart2_rx.qitalaji_en=1; break; default: break; } last_activity_time = HAL_GetTick(); } if(HAL_GetTick() - last_activity_time > 10000) { // 5秒无活动时软复位 NVIC_SystemReset(); } /* USER CODE END StartDefaultTask */ osDelay(100); } } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ void PlayAudio(uint8_t audio_num) { char cmd[] = {0x70,0x6C,0x61,0x79,0x20,0x30,0x2C,0x30,0x2C,0x30, 0xFF,0xFF,0xFF}; cmd[7] = '0' + audio_num; osMutexWait(uart6MutexHandle, osWaitForever); HAL_UART_Transmit(&huart6, (uint8_t *)cmd, sizeof(cmd), HAL_MAX_DELAY); osMutexRelease(uart6MutexHandle); } void PlayGarbageAudio(uint8_t garbage_class) { uint8_t audio_num = 0; switch (garbage_class) { case 0: case 1: case 3: audio_num = 2; break; // 可回收 case 2: case 5: audio_num = 1; break; // 厨余 case 7: case 8: audio_num = 0; break; // 有害 default: audio_num = 3; break; // 其他 } PlayAudio(audio_num); } // 保留现有的舵机控制任务 - 增加状态跟踪 _Noreturn void motor2Task(void const * argument) { // 上电首次执行初始化动作 __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 1300); __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 2030); osDelay(500); // 确保舵机到位 servoState = SERVO_IDLE; for(;;) { xSemaphoreTake(motor2Handle, portMAX_DELAY); //uint8_t current_class = uart3_rx.class; if(is_playing_manzai) { osDelay(100); continue; // 跳过当前动作 } // 🎯 设置舵机工作状态 servoState = SERVO_WORKING; //servoWorkStartTime = HAL_GetTick(); uint8_t current_class = servo_class_to_act; switch (current_class) { //有害垃圾 case 0: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,1300); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,2430); break; //可回收垃圾 case 1: case 8: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,1300); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,1570); break; //厨余垃圾 case 2: case 5: case 6: case 7: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,2000); osDelay(1000); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,2430); break; //其它垃圾 case 3: case 4: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,2000); osDelay(500); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,1570); break; default: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,1300); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,2030); break; } osDelay(1000); // 执行分类动作的延时 // 🎯 设置舵机回到原位状态 servoState = SERVO_RETURNING; __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,1300); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,2030); osDelay(1000); // 回到原位的延时 // 🎯 设置舵机空闲状态 servoState = SERVO_IDLE; } osSemaphoreGive(motor2Handle); osDelay(10); } // 保留现有的满载检测任务 _Noreturn void manzaiTask(void const * argument) { for(;;) { osDelay(100); if(HAL_GPIO_ReadPin(load1_GPIO_Port,load1_Pin)==0 || HAL_GPIO_ReadPin(load2_GPIO_Port,load2_Pin)==0 || HAL_GPIO_ReadPin(load3_GPIO_Port,load3_Pin)==0 || HAL_GPIO_ReadPin(load4_GPIO_Port,load4_Pin)==0) { pingmu_tx.manzai=1; xSemaphoreGive(rxlubancatHandle); } } } // 保留现有的串口屏通讯任务 _Noreturn void txTask(void const * argument) { int num=0; const char manzaidata[]={0x74,0x30,0x2E,0x74,0x78,0x74,0x3D,0x22,0xC0,0xAC,0xBB, 0xF8,0xC2,0xFA,0xD4,0xD8,0x22,0xff,0xff,0xff}; // const char kongdata[]={0x74,0x30,0x2E,0x74,0x78,0x74,0x3D,0x22,0x20,0x22,0xff,0xff,0xff}; char play[]={0x70,0x6C,0x61,0x79,0x20,0x30,0x2C,0x30,0x2C,0x30}; unsigned char aa[2]={0}; const char start[]={0x64,0x61,0x74,0x61,0x30,0x2E ,0x69 ,0x6E ,0x73 ,0x65 ,0x72 ,0x74 ,0x28 ,0x22 }; const char end[]={0x22,0x29,0xff,0xff,0xff}; const char end2[]={0xff,0xff,0xff}; //���� const char data1[]={0x5E,0xCD,0xC1,0xB6,0xB9,'\0'}; //���ܲ� const char data2[]={0x5E ,0xB0 ,0xD7 ,0xC2 ,0xDC ,0xB2 ,0xB7 ,'\0'}; //���ܲ� const char data3[]={0x5E ,0xBA ,0xFA ,0xC2 ,0xDC ,0xB2 ,0xB7 ,'\0'}; //ֽ�� const char data4[]={0x5E ,0xD6 ,0xBD ,0xB1 ,0xAD ,'\0'}; //ʯͷ const char data5[]={0x5E ,0xCA ,0xAF ,0xCD ,0xB7 ,'\0'}; //��Ƭ const char data6[]={0x5E ,0xB4,0xC9 ,0xC6 ,0xAC ,'\0'}; //5�ŵ��????? const char data7[]={0x5E ,0x35 ,0xBA ,0xC5 ,0xB5 ,0xE7 ,0xB3 ,0xD8 ,'\0'}; //1�ŵ��????? const char data8[]={0x5E ,0x31 ,0xBA ,0xC5 ,0xB5 ,0xE7 ,0xB3 ,0xD8 ,'\0'}; //�к����� const char data10[]={0x5E ,0xD3 ,0xD0 ,0xBA ,0xA6 ,0xC0 ,0xAC ,0xBB ,0xF8 ,0x5E,'\0'}; //�������� const char data11[]={0x5E ,0xB3 ,0xF8 ,0xD3 ,0xE0 ,0xC0 ,0xAC ,0xBB ,0xF8 ,0x5E,'\0'}; //�ɻ������� const char data12[]={0x5E ,0xBF ,0xC9 ,0xBB ,0xD8 ,0xCA ,0xD5 ,0xC0 ,0xAC ,0xBB ,0xF8 ,0x5E,'\0'}; //�������� const char data13[]={0x5E ,0xC6 ,0xE4 ,0xCB ,0xFB ,0xC0 ,0xAC ,0xBB ,0xF8 ,0x5E,'\0'}; const char* data[]={data8,data4,data7,data5,data6,data2,data3,data1,data1,data1,data1}; uart2_rx.manzaijianche_en=0; uart2_rx.shexiangtou_en=1; for(;;) { xSemaphoreTake(rxlubancatHandle,portMAX_DELAY); if(uart3_rx.ok==1 && uart2_rx.shexiangtou_en ==1 ){ uart3_rx.ok=0; HAL_GPIO_TogglePin(led0_GPIO_Port,led0_Pin); uart3_rx.class=uart3_rx.data[1]-0x30; if(uart3_rx.class<0 || uart3_rx.class>9) uart3_rx.class=11; aa[1]=num%10+0x30; aa[0]=num/10+0x30; HAL_UART_Transmit(&huart6, (uint8_t *) start,sizeof(start),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); switch (uart3_rx.class) { case 0: case 2: HAL_UART_Transmit(&huart6, (uint8_t *) data[uart3_rx.class], strlen(data[uart3_rx.class]),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) data10, strlen(data10),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end, sizeof(end),0xFFFF); play[7]=0x30; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); break;//�к����� case 5: case 6: case 7: HAL_UART_Transmit(&huart6, (uint8_t *) data[uart3_rx.class], strlen(data[uart3_rx.class]),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) data11, strlen(data11),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end, sizeof(end),0xFFFF); play[7]=0x31; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); break;//�������� case 1: HAL_UART_Transmit(&huart6, (uint8_t *) data[uart3_rx.class], strlen(data[uart3_rx.class]),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) data12, strlen(data12),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end, sizeof(end),0xFFFF); play[7]=0x32; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); break;//�ɻ������� case 3: case 4: HAL_UART_Transmit(&huart6, (uint8_t *) data[uart3_rx.class], strlen(data[uart3_rx.class]),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) data13, strlen(data13),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end, sizeof(end),0xFFFF); play[7]=0x33; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); break;//�������� default: break; } servo_class_to_act = uart3_rx.class; xSemaphoreGive(motor2Handle); num++; if(num>99)num=0; osDelay(2000); } if(pingmu_tx.manzai==1 && uart2_rx.manzaijianche_en==1){ HAL_UART_Transmit(&huart6, (uint8_t *) manzaidata, 20,0xFFFF),pingmu_tx.manzai=0; play[7]=0x34; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); osDelay(2000); } } } // ========== 🎯 新增:电机控制任务 ========== // 功能:控制两个电机的PWM速度,与舵机控制分开 // 电机1:PA6 (TIM3_CH1) // 电机2:PA7 (TIM3_CH2) _Noreturn void motorControlTask(void const * argument) { uint32_t tickCounter = 0; // 延迟启动 osDelay(1000); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // PA6 HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); // PA7 for(;;) { // 电机现在由超声波任务自动控制,这里只做周期性检查 if(tickCounter % 50 == 0) { // 可以在这里添加电机状态检查逻辑 } tickCounter++; osDelay(200); } } // ========== 🎯 新增:超声波测距函数 ========== // 简化版本,避免任务阻塞,返回距离值(cm*10) int32_t measureDistanceInt(GPIO_TypeDef* trig_port, uint16_t trig_pin, GPIO_TypeDef* echo_port, uint16_t echo_pin) { volatile uint32_t count = 0; volatile uint32_t time_count = 0; // 1. 确保Trig引脚为低电平 HAL_GPIO_WritePin(trig_port, trig_pin, GPIO_PIN_RESET); // 短暂延时 for(volatile int i = 0; i < 1000; i++) __NOP(); // 2. 发送10μs触发脉冲 HAL_GPIO_WritePin(trig_port, trig_pin, GPIO_PIN_SET); // 10μs延时 @168MHz for(volatile int i = 0; i < 1680; i++) __NOP(); HAL_GPIO_WritePin(trig_port, trig_pin, GPIO_PIN_RESET); // 3. 等待Echo上升沿,超时保护 count = 0; while(HAL_GPIO_ReadPin(echo_port, echo_pin) == GPIO_PIN_RESET) { count++; if(count > 300000) { return -1; // 等待上升沿超时 } } // 4. 测量Echo高电平持续时间 time_count = 0; while(HAL_GPIO_ReadPin(echo_port, echo_pin) == GPIO_PIN_SET) { time_count++; if(time_count > 500000) { return -2; // 高电平持续过长 } } // 5. 计算距离 int32_t distance_x10 = (time_count * 50) / 1000; distance_x10 = distance_x10 * 0.95; // 15%校准系数 // 6. 范围检查:1-100cm if(distance_x10 < 5 || distance_x10 > 1000) { return -4; // 超出合理范围 } return distance_x10; } // ========== 🎯 新增:超声波测距任务 ========== // 真实测距版本,控制电机运行,与舵机同步,不使用USART1发送 _Noreturn void ultrasonicTask(void const * argument) { uint32_t counter = 0; int32_t distance1, distance2; for(;;) { // 测量超声波模块1 (PB2->PD8) distance1 = measureDistanceInt(GPIOB, GPIO_PIN_2, GPIOD, GPIO_PIN_8); // 间隔300ms避免干扰 osDelay(300); // 测量超声波模块2 (PB3->PD9) distance2 = measureDistanceInt(GPIOB, GPIO_PIN_3, GPIOD, GPIO_PIN_9); // ========== 🎯 电机控制逻辑 - 与舵机同步 + 启动停止延时500ms ========== uint32_t currentTime = HAL_GetTick(); // ========== 电机1控制逻辑 ========== if(servoState == SERVO_IDLE){ if(distance1 > 100) { // distance1是cm*10,所以100表示10cm __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 6000); // PA7, 30%速度 } else { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0); // 停止 } // ========== 电机2控制逻辑 ========== if(distance2 > 100) { // distance2是cm*10,所以100表示10cm __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 6000); // PA6, 30%速度 (修改:从TIM4_CH2改为TIM3_CH1) } else { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // 停止 (修改:从TIM4_CH2改为TIM3_CH1) } }else{ __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); } char msg[60]; sprintf(msg, "D: %ld.%ld, %ld.%ld cm | M1:%s M2:%s\r\n", distance1 > 0 ? distance1/10 : -1, distance1 > 0 ? distance1%10 : 0, distance2 > 0 ? distance2/10 : -1, distance2 > 0 ? distance2%10 : 0, (distance1 > 100) ? "ON" : "OFF", (distance2 > 100) ? "ON" : "OFF"); HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 1000); counter++; osDelay(1200); // 每1.5秒测量一次 } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* Prevent unused argument(s) compilation warning */ // UNUSED(huart); /* NOTE: This function Should not be modified, when the callback is needed, the HAL_UART_TxCpltCallback could be implemented in the user file */ BaseType_t xHigherPriorityTaskWoken = pdFALSE; if(huart->Instance == USART6) { // 更健壮的帧检测 static uint8_t frame_buffer[32]; static uint8_t frame_index = 0; // 存储接收到的字节 frame_buffer[frame_index] = uart2_rx.datarx; frame_index = (frame_index + 1) % sizeof(frame_buffer); // 检测结束符 0xFF 0xFF 0xFF if(frame_index >= 3 && frame_buffer[frame_index-3] == 0xFF && frame_buffer[frame_index-2] == 0xFF && frame_buffer[frame_index-1] == 0xFF) { // 复制有效数据 memcpy(uart2_rx.data, frame_buffer, frame_index-3); uart2_rx.num = frame_index-3; uart2_rx.ok = 1; frame_index = 0; xSemaphoreGiveFromISR(rxpingmuHandle, &xHigherPriorityTaskWoken); } HAL_UART_Receive_IT(&huart6, (uint8_t*)&uart2_rx.datarx, 1); } if(huart ->Instance == USART1){ HAL_GPIO_TogglePin(led1_GPIO_Port,led1_Pin); if(uart3_rx.datarx=='@') uart3_rx.num=0; uart3_rx.data[uart3_rx.num]=uart3_rx.datarx; uart3_rx.num++; if(uart3_rx.num>=28){ uart3_rx.num=0; if(uart3_rx.data[27]==']'){ uart3_rx.ok=1; xSemaphoreGiveFromISR(rxlubancatHandle, &xHigherPriorityTaskWoken); } uart3_rx.num = 0; // 重置缓冲区 } HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart3_rx.datarx, 1); } portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } /* USER CODE END Application */ /* USER CODE BEGIN Header */ /** ****************************************************************************** * File Name : freertos.c * Description : Code for freertos applications ****************************************************************************** * @attention * * Copyright (c) 2024 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "FreeRTOS.h" #include "task.h" #include "main.h" #include "cmsis_os.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "usart.h" #include "gpio.h" #include "tim.h" #include <string.h> #include <stdio.h> /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ #define MOTOR_PWM_MAX 19999 // PWM最大值 (Period - 1) #define MOTOR_PWM_MIN 0 // PWM最小值 /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN Variables */ struct uart3_rx_t { int num,ok,en; uint8_t data[28]; int class; float score; int x1,y1,x2,y2; uint8_t datarx; }uart3_rx; struct uart2_rx_t { int num,ok,en; uint8_t data[3]; int shexiangtou_en; int manzaijianche_en; int dangban_en; int youhailaji_en; int chuyulaji_en; int kehuishou_en; int qitalaji_en; uint8_t datarx; }uart2_rx; struct pingmu_tx_t { int manzai,ok,en; int class; float score; int x1,y1,x2,y2; }pingmu_tx; osThreadId motorTaskHandle; osThreadId motor2TaskHandle; osThreadId manzaiTaskHandle; osThreadId txTaskHandle; osThreadId uart6MutexHandle; // 新增:电机控制和超声波测距任务句柄 osThreadId motorControlTaskHandle; // 电机控制任务句柄 osThreadId ultrasonicTaskHandle; // 超声波测距任务句柄 // 新增:超声波测距变量 float ultrasonic1_distance = 0.0f; // 超声波1测量距离 (cm) float ultrasonic2_distance = 0.0f; // 超声波2测量距离 (cm) // 新增:舵机状态跟踪变量 typedef enum { SERVO_IDLE = 0, // 舵机空闲状态(在原位) SERVO_WORKING = 1, // 舵机正在执行分类动作 SERVO_RETURNING = 2 // 舵机正在回到原位 } ServoState_t; volatile ServoState_t servoState = SERVO_IDLE; // 舵机状态 volatile uint32_t servoWorkStartTime = 0; // 舵机工作开始时间 // 新增:电机启动停止延时控制变量 volatile uint32_t motor1_startConditionStartTime = 0; // 电机1启动条件开始时间 volatile uint32_t motor2_startConditionStartTime = 0; // 电机2启动条件开始时间 volatile uint8_t motor1_startConditionActive = 0; // 电机1启动条件是否激活 volatile uint8_t motor2_startConditionActive = 0; // 电机2启动条件是否激活 volatile uint32_t motor1_stopConditionStartTime = 0; // 电机1停止条件开始时间 volatile uint32_t motor2_stopConditionStartTime = 0; // 电机2停止条件开始时间 volatile uint8_t motor1_stopConditionActive = 0; // 电机1停止条件是否激活 volatile uint8_t motor2_stopConditionActive = 0; // 电机2停止条件是否激活 // 电机当前状态 volatile uint8_t motor1_running = 0; // 电机1是否正在运行 volatile uint8_t motor2_running = 0; // 电机2是否正在运行 volatile uint8_t servo_class_to_act = 0; volatile uint8_t is_playing_manzai = 0; // 满载播报进行中标志 volatile uint32_t manzai_play_start = 0; // 满载播报开始时间 volatile uint32_t garbage_delay_start = 0; // 垃圾识别延迟开始时间 volatile uint8_t garbage_to_play = 0; // 待播放的垃圾类别 /* USER CODE END Variables */ osThreadId defaultTaskHandle; osSemaphoreId motorHandle; osSemaphoreId motor2Handle; osSemaphoreId rxlubancatHandle; osSemaphoreId rxpingmuHandle; osSemaphoreId bujingdianjiHandle; osSemaphoreId manzaiSignalHandle; /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ int fun (int a,int b, int c); _Noreturn void systemMonitorTask(void const * argument); _Noreturn void motor2Task(void const * argument); //_Noreturn void bujingdianjiTask(void const * argument); _Noreturn void manzaiTask(void const * argument); _Noreturn void txTask(void const * argument); // 新增:电机控制和超声波测距任务函数声明 _Noreturn void motorControlTask(void const * argument); // 核心电机控制任务 _Noreturn void ultrasonicTask(void const * argument); // 超声波测距任务 /* USER CODE END FunctionPrototypes */ void StartDefaultTask(void const * argument); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ /* GetIdleTaskMemory prototype (linked to static allocation support) */ void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); /* USER CODE BEGIN GET_IDLE_TASK_MEMORY */ static StaticTask_t xIdleTaskTCBBuffer; static StackType_t xIdleStack[configMINIMAL_STACK_SIZE]; void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) { *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer; *ppxIdleTaskStackBuffer = &xIdleStack[0]; *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* place for user code */ } /* USER CODE END GET_IDLE_TASK_MEMORY */ /** * @brief FreeRTOS initialization * @param None * @retval None */ void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* USER CODE BEGIN RTOS_MUTEX */ osMutexDef(uartMutex); osMutexId uartMutexHandle = osMutexCreate(osMutex(uartMutex)); osMutexDef(uart6Mutex); uart6MutexHandle = osMutexCreate(osMutex(uart6Mutex)); /* USER CODE END RTOS_MUTEX */ /* Create the semaphores(s) */ /* definition and creation of motor */ osSemaphoreDef(motor); motorHandle = osSemaphoreCreate(osSemaphore(motor), 1); /* definition and creation of motor2 */ osSemaphoreDef(motor2); motor2Handle = osSemaphoreCreate(osSemaphore(motor2), 1); /* definition and creation of rxlubancat */ osSemaphoreDef(rxlubancat); rxlubancatHandle = osSemaphoreCreate(osSemaphore(rxlubancat), 1); /* definition and creation of rxpingmu */ osSemaphoreDef(rxpingmu); rxpingmuHandle = osSemaphoreCreate(osSemaphore(rxpingmu), 1); osSemaphoreDef(manzaiSignal); manzaiSignalHandle = osSemaphoreCreate(osSemaphore(manzaiSignal), 1); /* definition and creation of bujingdianji */ osSemaphoreDef(bujingdianji); bujingdianjiHandle = osSemaphoreCreate(osSemaphore(bujingdianji), 1); /* USER CODE BEGIN RTOS_SEMAPHORES */ /* add semaphores, ... */ /* USER CODE END RTOS_SEMAPHORES */ HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart3_rx.datarx, 1); HAL_UART_Receive_IT(&huart6, (uint8_t *)&uart2_rx.datarx, 1); HAL_NVIC_SetPriority(USART1_IRQn, 6, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); HAL_NVIC_SetPriority(USART6_IRQn, 6, 0); HAL_NVIC_EnableIRQ(USART6_IRQn); TIM_OC_InitTypeDef sConfigOC = {0}; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); /* USER CODE BEGIN RTOS_TIMERS */ /* start timers, add new ones, ... */ /* USER CODE END RTOS_TIMERS */ /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ /* USER CODE END RTOS_QUEUES */ /* Create the thread(s) */ /* definition and creation of defaultTask */ osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ // osThreadDef(motorTask, motorTask, osPriorityNormal, 0, 128); // 添加舵机初始化 //__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 1300); // 舵机1初始位置 //__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 2030); // 舵机2初始位置 // HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); // 启动PWM输出 // HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2); // servoState = SERVO_IDLE; // 设置初始状态 // motorTaskHandle = osThreadCreate(osThread(motorTask), NULL); // 保留现有的舵机控制任务 osThreadDef(motor2Task, motor2Task, osPriorityAboveNormal, 0, 128); motor2TaskHandle = osThreadCreate(osThread(motor2Task), NULL); // 保留现有的满载检测任务 osThreadDef(manzaiTask, manzaiTask, osPriorityNormal, 0, 128); manzaiTaskHandle = osThreadCreate(osThread(manzaiTask), NULL); osThreadDef(systemMonitorTask, systemMonitorTask, osPriorityBelowNormal, 0, 128); osThreadCreate(osThread(systemMonitorTask), NULL); // 保留现有的串口屏通讯任务 osThreadDef(txTask, txTask, osPriorityNormal, 2, 128); txTaskHandle = osThreadCreate(osThread(txTask), NULL); // 新增:电机控制任务 osThreadDef(motorControlTask, motorControlTask, osPriorityNormal, 0, 256); motorControlTaskHandle = osThreadCreate(osThread(motorControlTask), NULL); // 新增:超声波测距任务 osThreadDef(ultrasonicTask, ultrasonicTask, osPriorityLow, 0, 256); ultrasonicTaskHandle = osThreadCreate(osThread(ultrasonicTask), NULL); /* USER CODE END RTOS_THREADS */ } _Noreturn void systemMonitorTask(void const * argument) { uint32_t last_heartbeat = HAL_GetTick(); const uint32_t WATCHDOG_TIMEOUT = 30000; // 30秒超时 for(;;) { // 检查任务堆栈使用情况 UBaseType_t uxHighWaterMark = uxTaskGetStackHighWaterMark(NULL); if(uxHighWaterMark < 20) { NVIC_SystemReset(); // 堆栈溢出复位 } // 30秒无心跳复位 if(HAL_GetTick() - last_heartbeat > WATCHDOG_TIMEOUT) { NVIC_SystemReset(); } // 更新心跳时间 last_heartbeat = HAL_GetTick(); osDelay(1000); } } /* USER CODE BEGIN Header_StartDefaultTask */ /** * @brief Function implementing the defaultTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void const * argument) { /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ uint32_t last_activity_time = HAL_GetTick(); uart2_rx.manzaijianche_en = 1; for(;;) { //xSemaphoreTake(rxpingmuHandle,portMAX_DELAY); if(xSemaphoreTake(rxpingmuHandle, 100) == pdTRUE) { switch (uart2_rx.data[1]) { case 1: uart2_rx.shexiangtou_en=0; break; case 0: uart2_rx.shexiangtou_en=1; break; case 3: uart2_rx.manzaijianche_en=0; break; case 2: uart2_rx.manzaijianche_en=1; break; case 4: uart2_rx.dangban_en=0; break; case 5: uart2_rx.dangban_en=1; break; case 6: uart2_rx.youhailaji_en=0; break; case 7: uart2_rx.youhailaji_en=1; break; case 8: uart2_rx.chuyulaji_en=0; break; case 9: uart2_rx.chuyulaji_en=1; break; case 10: uart2_rx.kehuishou_en=0; break; case 11: uart2_rx.kehuishou_en=1; break; case 12: uart2_rx.qitalaji_en=0; break; case 13: uart2_rx.qitalaji_en=1; break; default: break; } last_activity_time = HAL_GetTick(); } if(HAL_GetTick() - last_activity_time > 10000) { // 5秒无活动时软复位 NVIC_SystemReset(); } /* USER CODE END StartDefaultTask */ osDelay(100); } } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ void PlayAudio(uint8_t audio_num) { char cmd[] = {0x70,0x6C,0x61,0x79,0x20,0x30,0x2C,0x30,0x2C,0x30, 0xFF,0xFF,0xFF}; cmd[7] = '0' + audio_num; osMutexWait(uart6MutexHandle, osWaitForever); HAL_UART_Transmit(&huart6, (uint8_t *)cmd, sizeof(cmd), HAL_MAX_DELAY); osMutexRelease(uart6MutexHandle); } void PlayGarbageAudio(uint8_t garbage_class) { uint8_t audio_num = 0; switch (garbage_class) { case 0: case 1: case 3: audio_num = 2; break; // 可回收 case 2: case 5: audio_num = 1; break; // 厨余 case 7: case 8: audio_num = 0; break; // 有害 default: audio_num = 3; break; // 其他 } PlayAudio(audio_num); } // 保留现有的舵机控制任务 - 增加状态跟踪 _Noreturn void motor2Task(void const * argument) { // 上电首次执行初始化动作 __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 1300); __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 2030); osDelay(500); // 确保舵机到位 servoState = SERVO_IDLE; for(;;) { xSemaphoreTake(motor2Handle, portMAX_DELAY); //uint8_t current_class = uart3_rx.class; if(is_playing_manzai) { osDelay(100); continue; // 跳过当前动作 } // 🎯 设置舵机工作状态 servoState = SERVO_WORKING; //servoWorkStartTime = HAL_GetTick(); uint8_t current_class = servo_class_to_act; switch (current_class) { //有害垃圾 case 0: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,1300); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,2430); break; //可回收垃圾 case 1: case 8: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,1300); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,1570); break; //厨余垃圾 case 2: case 5: case 6: case 7: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,2000); osDelay(1000); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,2430); break; //其它垃圾 case 3: case 4: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,2000); osDelay(500); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,1570); break; default: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,1300); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,2030); break; } osDelay(1000); // 执行分类动作的延时 // 🎯 设置舵机回到原位状态 servoState = SERVO_RETURNING; __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,1300); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,2030); osDelay(1000); // 回到原位的延时 // 🎯 设置舵机空闲状态 servoState = SERVO_IDLE; } osSemaphoreGive(motor2Handle); osDelay(10); } // 保留现有的满载检测任务 _Noreturn void manzaiTask(void const * argument) { for(;;) { osDelay(100); if(HAL_GPIO_ReadPin(load1_GPIO_Port,load1_Pin)==0 || HAL_GPIO_ReadPin(load2_GPIO_Port,load2_Pin)==0 || HAL_GPIO_ReadPin(load3_GPIO_Port,load3_Pin)==0 || HAL_GPIO_ReadPin(load4_GPIO_Port,load4_Pin)==0) { pingmu_tx.manzai=1; xSemaphoreGive(rxlubancatHandle); } } } // 保留现有的串口屏通讯任务 _Noreturn void txTask(void const * argument) { int num=0; const char manzaidata[]={0x74,0x30,0x2E,0x74,0x78,0x74,0x3D,0x22,0xC0,0xAC,0xBB, 0xF8,0xC2,0xFA,0xD4,0xD8,0x22,0xff,0xff,0xff}; // const char kongdata[]={0x74,0x30,0x2E,0x74,0x78,0x74,0x3D,0x22,0x20,0x22,0xff,0xff,0xff}; char play[]={0x70,0x6C,0x61,0x79,0x20,0x30,0x2C,0x30,0x2C,0x30}; unsigned char aa[2]={0}; const char start[]={0x64,0x61,0x74,0x61,0x30,0x2E ,0x69 ,0x6E ,0x73 ,0x65 ,0x72 ,0x74 ,0x28 ,0x22 }; const char end[]={0x22,0x29,0xff,0xff,0xff}; const char end2[]={0xff,0xff,0xff}; //���� const char data1[]={0x5E,0xCD,0xC1,0xB6,0xB9,'\0'}; //���ܲ� const char data2[]={0x5E ,0xB0 ,0xD7 ,0xC2 ,0xDC ,0xB2 ,0xB7 ,'\0'}; //���ܲ� const char data3[]={0x5E ,0xBA ,0xFA ,0xC2 ,0xDC ,0xB2 ,0xB7 ,'\0'}; //ֽ�� const char data4[]={0x5E ,0xD6 ,0xBD ,0xB1 ,0xAD ,'\0'}; //ʯͷ const char data5[]={0x5E ,0xCA ,0xAF ,0xCD ,0xB7 ,'\0'}; //��Ƭ const char data6[]={0x5E ,0xB4,0xC9 ,0xC6 ,0xAC ,'\0'}; //5�ŵ��????? const char data7[]={0x5E ,0x35 ,0xBA ,0xC5 ,0xB5 ,0xE7 ,0xB3 ,0xD8 ,'\0'}; //1�ŵ��????? const char data8[]={0x5E ,0x31 ,0xBA ,0xC5 ,0xB5 ,0xE7 ,0xB3 ,0xD8 ,'\0'}; //�к����� const char data10[]={0x5E ,0xD3 ,0xD0 ,0xBA ,0xA6 ,0xC0 ,0xAC ,0xBB ,0xF8 ,0x5E,'\0'}; //�������� const char data11[]={0x5E ,0xB3 ,0xF8 ,0xD3 ,0xE0 ,0xC0 ,0xAC ,0xBB ,0xF8 ,0x5E,'\0'}; //�ɻ������� const char data12[]={0x5E ,0xBF ,0xC9 ,0xBB ,0xD8 ,0xCA ,0xD5 ,0xC0 ,0xAC ,0xBB ,0xF8 ,0x5E,'\0'}; //�������� const char data13[]={0x5E ,0xC6 ,0xE4 ,0xCB ,0xFB ,0xC0 ,0xAC ,0xBB ,0xF8 ,0x5E,'\0'}; const char* data[]={data8,data4,data7,data5,data6,data2,data3,data1,data1,data1,data1}; uart2_rx.manzaijianche_en=0; uart2_rx.shexiangtou_en=1; for(;;) { xSemaphoreTake(rxlubancatHandle,portMAX_DELAY); if(uart3_rx.ok==1 && uart2_rx.shexiangtou_en ==1 ){ uart3_rx.ok=0; HAL_GPIO_TogglePin(led0_GPIO_Port,led0_Pin); uart3_rx.class=uart3_rx.data[1]-0x30; if(uart3_rx.class<0 || uart3_rx.class>9) uart3_rx.class=11; aa[1]=num%10+0x30; aa[0]=num/10+0x30; HAL_UART_Transmit(&huart6, (uint8_t *) start,sizeof(start),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); switch (uart3_rx.class) { case 0: case 2: HAL_UART_Transmit(&huart6, (uint8_t *) data[uart3_rx.class], strlen(data[uart3_rx.class]),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) data10, strlen(data10),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end, sizeof(end),0xFFFF); play[7]=0x30; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); break;//�к����� case 5: case 6: case 7: HAL_UART_Transmit(&huart6, (uint8_t *) data[uart3_rx.class], strlen(data[uart3_rx.class]),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) data11, strlen(data11),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end, sizeof(end),0xFFFF); play[7]=0x31; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); break;//�������� case 1: HAL_UART_Transmit(&huart6, (uint8_t *) data[uart3_rx.class], strlen(data[uart3_rx.class]),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) data12, strlen(data12),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end, sizeof(end),0xFFFF); play[7]=0x32; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); break;//�ɻ������� case 3: case 4: HAL_UART_Transmit(&huart6, (uint8_t *) data[uart3_rx.class], strlen(data[uart3_rx.class]),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) data13, strlen(data13),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end, sizeof(end),0xFFFF); play[7]=0x33; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); break;//�������� default: break; } servo_class_to_act = uart3_rx.class; xSemaphoreGive(motor2Handle); num++; if(num>99)num=0; osDelay(2000); } if(pingmu_tx.manzai==1 && uart2_rx.manzaijianche_en==1){ HAL_UART_Transmit(&huart6, (uint8_t *) manzaidata, 20,0xFFFF),pingmu_tx.manzai=0; play[7]=0x34; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); osDelay(2000); } } } // ========== 🎯 新增:电机控制任务 ========== // 功能:控制两个电机的PWM速度,与舵机控制分开 // 电机1:PA6 (TIM3_CH1) // 电机2:PA7 (TIM3_CH2) _Noreturn void motorControlTask(void const * argument) { uint32_t tickCounter = 0; // 延迟启动 osDelay(1000); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // PA6 HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); // PA7 for(;;) { // 电机现在由超声波任务自动控制,这里只做周期性检查 if(tickCounter % 50 == 0) { // 可以在这里添加电机状态检查逻辑 } tickCounter++; osDelay(200); } } // ========== 🎯 新增:超声波测距函数 ========== // 简化版本,避免任务阻塞,返回距离值(cm*10) int32_t measureDistanceInt(GPIO_TypeDef* trig_port, uint16_t trig_pin, GPIO_TypeDef* echo_port, uint16_t echo_pin) { volatile uint32_t count = 0; volatile uint32_t time_count = 0; // 1. 确保Trig引脚为低电平 HAL_GPIO_WritePin(trig_port, trig_pin, GPIO_PIN_RESET); // 短暂延时 for(volatile int i = 0; i < 1000; i++) __NOP(); // 2. 发送10μs触发脉冲 HAL_GPIO_WritePin(trig_port, trig_pin, GPIO_PIN_SET); // 10μs延时 @168MHz for(volatile int i = 0; i < 1680; i++) __NOP(); HAL_GPIO_WritePin(trig_port, trig_pin, GPIO_PIN_RESET); // 3. 等待Echo上升沿,超时保护 count = 0; while(HAL_GPIO_ReadPin(echo_port, echo_pin) == GPIO_PIN_RESET) { count++; if(count > 300000) { return -1; // 等待上升沿超时 } } // 4. 测量Echo高电平持续时间 time_count = 0; while(HAL_GPIO_ReadPin(echo_port, echo_pin) == GPIO_PIN_SET) { time_count++; if(time_count > 500000) { return -2; // 高电平持续过长 } } // 5. 计算距离 int32_t distance_x10 = (time_count * 50) / 1000; distance_x10 = distance_x10 * 0.95; // 15%校准系数 // 6. 范围检查:1-100cm if(distance_x10 < 5 || distance_x10 > 1000) { return -4; // 超出合理范围 } return distance_x10; } // ========== 🎯 新增:超声波测距任务 ========== // 真实测距版本,控制电机运行,与舵机同步,不使用USART1发送 _Noreturn void ultrasonicTask(void const * argument) { uint32_t counter = 0; int32_t distance1, distance2; for(;;) { // 测量超声波模块1 (PB2->PD8) distance1 = measureDistanceInt(GPIOB, GPIO_PIN_2, GPIOD, GPIO_PIN_8); // 间隔300ms避免干扰 osDelay(300); // 测量超声波模块2 (PB3->PD9) distance2 = measureDistanceInt(GPIOB, GPIO_PIN_3, GPIOD, GPIO_PIN_9); // ========== 🎯 电机控制逻辑 - 与舵机同步 + 启动停止延时500ms ========== uint32_t currentTime = HAL_GetTick(); // ========== 电机1控制逻辑 ========== if(servoState == SERVO_IDLE){ if(distance1 > 100) { // distance1是cm*10,所以100表示10cm __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 6000); // PA7, 30%速度 } else { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0); // 停止 } // ========== 电机2控制逻辑 ========== if(distance2 > 100) { // distance2是cm*10,所以100表示10cm __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 6000); // PA6, 30%速度 (修改:从TIM4_CH2改为TIM3_CH1) } else { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // 停止 (修改:从TIM4_CH2改为TIM3_CH1) } }else{ __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); } char msg[60]; sprintf(msg, "D: %ld.%ld, %ld.%ld cm | M1:%s M2:%s\r\n", distance1 > 0 ? distance1/10 : -1, distance1 > 0 ? distance1%10 : 0, distance2 > 0 ? distance2/10 : -1, distance2 > 0 ? distance2%10 : 0, (distance1 > 100) ? "ON" : "OFF", (distance2 > 100) ? "ON" : "OFF"); HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 1000); counter++; osDelay(1200); // 每1.5秒测量一次 } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* Prevent unused argument(s) compilation warning */ // UNUSED(huart); /* NOTE: This function Should not be modified, when the callback is needed, the HAL_UART_TxCpltCallback could be implemented in the user file */ BaseType_t xHigherPriorityTaskWoken = pdFALSE; if(huart->Instance == USART6) { // 更健壮的帧检测 static uint8_t frame_buffer[32]; static uint8_t frame_index = 0; // 存储接收到的字节 frame_buffer[frame_index] = uart2_rx.datarx; frame_index = (frame_index + 1) % sizeof(frame_buffer); // 检测结束符 0xFF 0xFF 0xFF if(frame_index >= 3 && frame_buffer[frame_index-3] == 0xFF && frame_buffer[frame_index-2] == 0xFF && frame_buffer[frame_index-1] == 0xFF) { // 复制有效数据 memcpy(uart2_rx.data, frame_buffer, frame_index-3); uart2_rx.num = frame_index-3; uart2_rx.ok = 1; frame_index = 0; xSemaphoreGiveFromISR(rxpingmuHandle, &xHigherPriorityTaskWoken); } HAL_UART_Receive_IT(&huart6, (uint8_t*)&uart2_rx.datarx, 1); } if(huart ->Instance == USART1){ HAL_GPIO_TogglePin(led1_GPIO_Port,led1_Pin); if(uart3_rx.datarx=='@') uart3_rx.num=0; uart3_rx.data[uart3_rx.num]=uart3_rx.datarx; uart3_rx.num++; if(uart3_rx.num>=28){ uart3_rx.num=0; if(uart3_rx.data[27]==']'){ uart3_rx.ok=1; xSemaphoreGiveFromISR(rxlubancatHandle, &xHigherPriorityTaskWoken); } uart3_rx.num = 0; // 重置缓冲区 } HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart3_rx.datarx, 1); } portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } /* USER CODE END Application */ 这个程序中为什么超声波控制启停无效?该怎么解决

大家在看

recommend-type

ray-optics:光学系统的几何光线追踪

射线光学 安装 要使用pip安装rayoptics ,请使用 > pip install rayoptics 或者,可以使用conda从conda - forge渠道安装rayoptics > conda install rayoptics --channel conda-forge 文献资料 射线光学位于“ 成像光学设计和分析工具 RayOptics是一个Python几何光学和成像光学库。 它为分析成像和相干光学系统提供了几何射线追踪基础。 在此基础上提供了许多标准的几何分析选项,例如横向射线和波前像差分析。 y-ybar图和镜头布局视图中近轴光线的图形编辑也支持光学系统的近轴布局。 支持导入Zemax .zmx和CODEV .seq文件。 RayOptics可用于Python脚本,Python和IPython外壳,Jupyter笔记本以及基于Qt的图形用户界面应用程序中。 笔记 该项
recommend-type

修复Windows 10&11 因更新造成的IE11 无法使用

修复Windows 10&11 因更新造成的IE11 无法使用
recommend-type

参考资料-Boost_PFC电路中开关器件的损耗分析与计算.zip

参考资料-Boost_PFC电路中开关器件的损耗分析与计算.zip
recommend-type

3DSlicer 5.2带中文包-稳定版

这是官方2023-02月发布发布的稳定版3DSlicer,里面已经安装了常用插件,并且做了分类处理,常用工具放在了智能医学所属栏里面,附带了中文包,可直接在设置里面选择中文。本软件适用于医学影像处理初学者。可根据用户习惯添加或者删除模块。
recommend-type

KGM转MP3或者FLAC_kgma_kgma格式_FLAC_kgma转换器_kgm转换成flac_亲测完美转换!保证可用。

使用方法:直接将带转换的KGM文件或者KGMA文件放在文件夹里,(可批量放置),将kgm音乐文件复制到"KGM转MP3或者FLAC"文件夹内,运行unlock-kugou-windows-amd64-alpha2.exe,等待转换完成即可。最终会输出未加密的MP3文件或者FLAC文件,使用任何播放器均可直接打开。最终输出的文件会在kgm-vpr-out文件夹中

最新推荐

recommend-type

【遥感影像处理】基于Google Earth Engine的S-2影像NDVI计算与时间序列分析:2023年秋季植被指数监测系统实现

内容概要:本文档展示了如何利用Google Earth Engine (GEE) 平台对Sentinel-2卫星图像进行处理与分析。首先创建了2023年9月至10月期间的S-2影像集合,并基于划定的研究区域(aoi)进行了筛选。接着定义了去除云层影响以及计算归一化植被指数(NDVI)的函数,将NDVI作为新波段加入到影像集中。随后提取NDVI数据并构建了中位数值合成图,设置了用于显示NDVI的色彩渐变条。最后,生成了NDVI的时间序列折线图,并将最终结果导出到Google Drive,同时在地图上展示了NDVI的分布情况。 适合人群:具有遥感基础知识、对植被监测感兴趣的科研人员或学生,以及从事地理信息系统工作的专业人士。 使用场景及目标:①研究特定时间段内的植被生长状况变化;②评估不同地区植被覆盖度差异;③为农业、林业等领域提供科学依据和支持。 阅读建议:读者应具备一定的JavaScript编程基础,熟悉Google Earth Engine平台操作,以便更好地理解和应用文中提供的代码示例。由于涉及到具体的地理空间分析任务,建议结合实际案例进行练习,以加深理解。
recommend-type

响应式绿色简洁风格网络借贷网页模板分享

标题中提到的“绿色简洁风格响应式网络借贷网页模板.zip”暗示着该模板采用了绿色作为主要色彩,并且界面设计风格简洁。响应式设计则意味着网页模板能够在不同尺寸的屏幕上展示适宜的布局和内容,无论是电脑、平板还是手机等移动设备。这种设计符合现代网页设计的趋势,确保用户无论使用何种设备访问网络借贷平台,都能获得良好的浏览体验。同时,“网络借贷”表明这个网页模板可能专门适用于P2P借贷公司或金融技术服务公司,它们需要一个能够体现专业、可靠、易用界面的在线平台。 在描述部分,“html网站模版分享”表明该文件是一个分享性质的资源,用户可以通过这个模板快速搭建一个HTML网站。静态化H5网站模版源码意味着该模板可能不包含后端交互逻辑,即不会涉及数据库和服务器端编程。这里提及的H5指的是HTML5,它是HTML的最新版本,提供了更多增强的标签和功能,比如更好的多媒体和图形支持、离线存储等。PC+wap表明该模板支持传统的个人电脑浏览以及移动设备的wap(无线应用协议)浏览,平面广告设计网页模版代码则说明模板中可能包含了广告位或者特定的视觉元素来强化广告效果。 标签“html5 H5模版 HTML模版”进一步细化了文件的内容,强调了HTML5技术的应用。HTML5模版通常包含最新的HTML标记和语义化标签,能够支持现代浏览器的各种新特性,从而提升网站的交互性和用户体验。标签的使用也说明了这个模板可能适用于多种不同类型的网站,但特别适用于需要在移动设备上也能良好展示的网站。 文件名列表中的“24809”可能指的是该模板的版本号、编号或者文件在压缩包中的唯一标识。由于没有具体的文件扩展名,我们无法直接了解具体的文件内容,但是通常情况下,一个网页模板压缩包中应包含HTML、CSS、JavaScript文件以及其他可能的媒体资源,如图片、字体等。 综上所述,该模板文件包含的知识点包括: 1. 响应式网页设计:能够适应不同屏幕尺寸和分辨率的设备。 2. 绿色简洁风格:采用绿色作为视觉主色调,设计简洁明了。 3. 网络借贷领域适用性:模板设计符合金融技术服务公司或P2P借贷平台的需要。 4. 静态HTML5网页模板:适用于快速搭建静态网站,不涉及后端逻辑。 5. PC与移动设备适配:模板设计同时考虑了电脑和平板及手机等移动设备的浏览体验。 6. 广告设计元素:模板中包含设计用于展示广告内容的版块。 7. HTML5技术应用:利用HTML5的新特性和语义化标签来构建网页。 8. 跨平台的网页模板:模板适用于多种设备和浏览器,确保良好的兼容性。 这个网页模板特别适合希望快速上线的网络借贷平台、金融服务网站等,它可以帮助开发者节省设计和编码的时间,同时也确保了一个专业且用户友好的前端展示。
recommend-type

图割技术深度剖析:掌握从理论到实践的15个关键步骤

# 1. 图割技术概述 图割技术是一种应用广泛的数学算法,它来源于图论,主要应用于图像处理、网络优化、数据分析等领域。图割技术的核心在于将复杂的问题转化为图的最小割问题,并求解。这不仅涉及到了图论和网络流理论,还需要具备一定的优化算法知识。通过对图割技术的基本概念、理论基础和实际应用的深入理解,可以有
recommend-type

zmdl

<think>好的,我现在需要处理用户关于“zmdl IT相关内容”的查询。首先,“zmdl”可能是一个缩写或拼写错误,所以我要考虑常见的IT相关术语中可能的匹配。 首先,我会想到常见的缩写,比如ZMDL可能代表某个技术框架、工具、协议或者公司名称。例如,在软件开发中,可能有类似缩写的库或框架。但常见的IT缩写如XML、JSON、YAML等,似乎不太匹配。然后,检查是否有拼写错误,比如用户可能想输入的是“ZMQ”(ZeroMQ)或者“ZFS”等,但不确定。 接下来,考虑中文拼音首字母缩写。例如,“zmdl”可能对应“自动化代码”之类的词组,比如“自动化代码流程”(Zi Dong Hua D
recommend-type

紫色大气PC+wap网页模板代码包

根据给定的文件信息,我们可以提炼出以下知识点: ### 网页模板与设计 #### 1. 网页模板概述 网页模板是一种预先设计好的网页结构框架,它包含HTML、CSS以及可能的JavaScript代码,可以快速帮助开发者构建出一致风格和布局的网页。使用模板可以节省设计和编码的时间,使得开发者可以专注于网页内容的更新和功能的实现。 #### 2. PC与WAP的区别 PC端指的是使用个人电脑访问的网页版本,通常会提供更加丰富的布局和功能,因为屏幕尺寸较大,可以展示更多的内容和元素。WAP则是针对移动设备(如手机和平板电脑)设计的网页版本,它必须考虑到移动设备屏幕小、网络带宽较低等特点,因此在设计上更倾向于简洁、高效。 #### 3. 静态网页与动态网页 静态网页是一种简单的网页格式,其内容是固定的,不会因为用户的交互而改变。动态网页则允许内容根据用户的不同操作发生变化,通常包含服务器端脚本或数据库交互,可以提供更加个性化的浏览体验。静态化H5网站模板意味着这个模板是静态的,但专为H5设计,即兼容移动设备的HTML5标准。 #### 4. HTML5网页模板 HTML5是最新版本的HTML标准,它引入了诸多新特性,例如支持多媒体内容、图形和动画等,而无需依赖插件。HTML5模板专为HTML5标准设计,能够提供更好的兼容性和更丰富的用户体验。 ### 开发工具与技术 #### 1. HTML和CSS HTML(HyperText Markup Language)是构建网页的标准标记语言,它定义了网页的内容和结构。CSS(Cascading Style Sheets)用于描述HTML文档的呈现样式,包括布局、设计、颜色和字体等。两者结合使用,可以创建既美观又功能强大的网页。 #### 2. JavaScript JavaScript是一种运行在浏览器端的脚本语言,它能够让网页变得动态和交互性更强。通过使用JavaScript,开发者可以添加复杂的动画效果、表单验证、数据操作以及与用户的实时互动。 #### 3. 响应式设计 响应式网页设计是一种设计方法论,旨在让网页在不同设备和屏幕尺寸上均能提供优秀的浏览体验。这通常是通过媒体查询(Media Queries)来实现,可以根据设备的屏幕尺寸来应用不同的CSS样式。 ### 文件管理和解压缩 #### 1. 压缩文件格式 "紫色大气形式pc+wap专业维修服务网页模板代码.zip"文件意味着该文件是一个ZIP压缩包,它通过压缩算法减少了文件大小,便于传输和存储。解压缩此文件后,可以得到一系列的文件,这些文件包含了网页模板的所有资源。 #### 2. 文件命名规范 给定的压缩包中只有一个文件,即"22695"。从文件名称中,我们无法直接获取关于文件内容的具体信息。通常来说,文件命名应该反映出文件内容或者用途,以便于管理和检索。 ### 具体应用场景 #### 1. 专业维修服务网站 该网页模板被描述为面向专业维修服务的。这表明模板会包含相应的行业元素和布局设计,比如服务介绍、价格信息、联系方式、在线预约等。此类模板适合维修公司、汽车服务中心、电子产品维修点等使用。 #### 2. 平面广告设计 网页模板中还提到了平面广告设计。这意味着模板可能融入了平面设计的元素,如视觉焦点、色彩搭配和图形设计等,帮助企业在网络上展示其品牌和产品。 ### 结论 综上所述,"紫色大气形式pc+wap专业维修服务网页模板代码.zip"文件提供了一个静态化H5网页模板,可用于创建兼容PC和移动端的维修服务网站。模板代码基于HTML5、CSS和可能的JavaScript编写,具有响应式设计以适应不同设备。通过解压缩操作,开发者可以获取模板文件,然后根据需要进行修改和扩展以构建出一个功能完整、视觉吸引的网站。
recommend-type

【微信小程序CI_CD流程优化】:掌握这些技巧,部署效率提升不止一倍!

# 1. 微信小程序CI/CD的基本概念 微信小程序CI/CD(持续集成和持续部署)是一种软件开发实践,旨在使开发人员能够更快地交付新版本的小程序,同时保持高质量的标准。它强调在开发过程中持续进行构建、测试和发布,确保代码改动能够被快速发现并部署到生产环境中。通过自动化测试和部署流程,CI/CD减少了手动错误,加速
recommend-type

16.1054 63.2079 39.6566 37.3455 30.8524 48.6809 52.7529 45.2237 37.5511 46.7804 55.6762 55.565 66.0176 53.1187 68.2415 62.1257 57.9002 64.6832 53.7859 64.3788 66.2928 50.9808 51.9941 50.3053 39.3842 42.3115 42.7619 39.8346 27.2247 48.7291 37.8606 35.8012 30.7673 25.7334 15.8944 10.4029 15.208 18.1825 35.1148 46.8987 65.5473 35.1311 47.9013 49.9909 36.0599 37.9174 37.2208 51.8484 82.2645 89.4622 105.0186 78.5496 77.0662 70.4043 87.585 76.0143 90.0394 75.3131 79.5206 84.4294 99.1557 99.8569 93.5457 106.8694 63.0412 70.242 108.194 98.4349 94.6397 108.194 114.1579 133.6761 167.2908 196.0259 255.1226 237.7731 223.6767 206.3272 207.8226 283.3892 320.6168 355.0663 565.6525 757.9028 750.6795 719.0082 821.801 904.5908 1528.0266 1503.7027 2273.6813 2748.9146 2445.4799 3181.3091 2559.268 2330.8491 2095.6872 1859.6824 2057.7578 1954.0843 1564.6765 1122.2518 1053.0677 860.4376 785.8273 697.6516 825.1673 774.9749 855.0114 869.9335 1023.2236 1050.3546 1221.28 1637.3646 1720.4856 1180.8806 1319.8698 1468.3974 1471.1227 1373.0127 1172.7048 1184.9685 1194.507 962.8584 891.8322 832.6799 1040.4007 1058.2839 1055.5327 1234.3651 1018.3905 1030.7713 1028.02 1022.5174 1095.4261 1066.5377 992.149 1077.1249 1035.3335 1035.3335 908.5662 1014.4378 883.4913 940.6063 965.6811 1053.4431 1053.4431 1150.9564 1188.5687 1141.2051 1203.7752 1032.8578 1090.772 1075.234 1135.9733 1329.4914 1596.4616 1595.0491 1419.894 1458.0326 1618.2582 1312.7582 1265.4272 1256.8216 1209.4906 1220.9648 1156.4225 1051.7206 958.4929 863.831 1060.3263 1033.0751 1194.7088 1152.309 1399.1365 1281.0227 1290.1084 1323.4225 1550.5644 2004.8482 1886.7345 1830.7061 1992.734 2110.8478 2072.9908 2098.7336 2121.2401 2061.7146 1894.1034 2041.3506 2260.655 3726.8614 2697.6973 3969.2295 4171.63 3967.5972 4303.8432 3254.2987 3275.5181 3251.0341 3259.1955 3082.9112 3370.1893 3975.7585 3714.5966 3819.976 4329.5898 4786.8922 5168.2588 5141.2594 6238.1102 5418.0033 5517.5636 4692.3943 4218.2172 4051.1584 3835.1632 4118.4055 4162.2559 4149.9778 4362.2136 4078.0632,将以上数据整理成逗号隔开

<think>嗯,用户给了一大堆数据,每个数字之间用换行隔开,现在需要把这些数据整理成逗号分隔的形式。首先,我需要确认这些数据的结构是否正确,有没有多余的空格或者换行。 看一下用户提供的数据,看起来每个数字占据一行,中间可能有一些空行。我需要先把所有数据合并成一行,用逗号连接起来。不过,在处理过程中要注意检查是否有重复的数字或者格式错误,比如小数点后有多位或者数字之间有其他符号。 接下来,我需要按顺序处理每个数字。可能有些数字后面跟着换行,而有些可能有多个换行分隔。需要确保每个数字之间只有一个逗号,并且没有多余的空格。另外,还要检查是否有数字被拆分成了多行的情况,但根据用户提供的数据,似乎
recommend-type

51单片机串口通信与实时电压电流监测系统设计

标题中提到的知识点主要包括51单片机、串口主从机通信、L1602液晶屏显示以及实时电流和电压监测。这些知识点涉及到微控制器(MCU)基础、串行通信协议、嵌入式系统编程、模拟电路设计和数字电路设计。 1. **51单片机**:这是一种基于Intel 8051架构的微控制器。51单片机是早期被广泛使用的8位微控制器之一,具有成本效益高、架构简单、使用方便等特点,非常适合用于教学和简单的嵌入式系统设计。51单片机的核心包括中央处理器(CPU)、只读存储器(ROM)、随机存取存储器(RAM)、定时/计数器、串口通信接口等基本单元,以及一些特殊功能寄存器。 2. **串口主从机通信**:在串口通信中,通常把设备分为两类:主机(Master)和从机(Slave)。在本项目中,主从机通信指的是两个或多个51单片机之间的数据交换。主单片机负责发送控制信号和接收数据,而从单片机则根据主机的命令发送或接收数据。这种通信方式广泛应用于工业控制系统、智能家居等领域。串口通信涉及到信号的发送与接收协议、数据包格式定义以及通信速率的设置等。 3. **L1602液晶屏显示**:L1602是一个常见的字符型液晶显示模块,通常用于显示字母、数字和一些特殊符号。这种模块具有并行接口,能够显示2行每行16个字符。在本项目中,L1602液晶屏被用来显示实时的电流值和系统的工作状态。实现这一功能需要编写相应的字符映射代码以及控制逻辑。 4. **实时电流和电压监测**:这是指通过模拟电路(如运算放大器)将电流和电压信号转换为单片机可以读取的数字信号。单片机根据这些信号通过编程进行处理,以便监测电压电流值是否在正常范围内。在异常情况下,系统需要执行相应的报警或者安全措施,如本例中的亮灯和继电器动作。 描述中详细说明了系统的运行逻辑:正常情况下,从机检测到的电压电流在预设的正常范围内,主机通过串口通信接收到这些数据,并在L1602屏幕上显示"Normal"。如果检测到的电压超出正常范围,则主机显示"Warning",同时执行继电器切换到备用电源的逻辑,并由从机发出警告信号。 标签中提到了**信号处理、电路仿真、设计**。信号处理是将模拟信号转换为数字信号,以便单片机处理,涉及到模数转换(ADC);电路仿真则是在实际电路搭建前,使用仿真软件(如Proteus)模拟电路的工作情况,验证设计的电路是否按照预期工作;设计则是指整个项目的系统设计,包括硬件设计和软件编程。 最后,提到的“串口通信检测发送”是文件名称列表中的一个文件。根据这个名称可以推测,该文件可能包含了实现串口通信、数据检测和发送的代码或设计图纸。 在进行本项目时,需要的技能和知识点包括但不限于: - 51单片机的编程和使用,包括其寄存器的配置、定时器的使用、串口通信编程等; - 串行通信协议的实现,理解波特率、起始位、停止位、奇偶校验位等参数的配置; - L1602液晶显示屏的编程,包括如何向显示屏发送数据和控制指令; - 电压和电流信号的检测与处理,需要设计电路将模拟信号转换为数字信号,然后单片机进行处理; - 使用Proteus软件进行电路仿真,以及使用Keil软件进行程序的编写和调试; - 电路设计和印刷电路板(PCB)设计知识,如果涉及到实物设备的生产。 总的来说,这个项目不仅涉及嵌入式系统的软件编程,还包括硬件电路的设计和搭建,是一个综合性的工程项目。通过这个项目的实践,可以对单片机应用、电路设计和嵌入式系统开发有一个全面的了解和应用。
recommend-type

【插件开发从零开始】:TerraExplorer Pro6.5自定义功能开发全教程(创意无限!)

# 摘要 本文为那些对TerraExplorer Pro6.5插件开发感兴趣的读者提供了一个全面的指南。首先,我们介绍插件开发的基础知识和所需的工具。接着,文章深入探讨了TerraExplorer Pro6.5的架构和API,为开发自定义功能打下坚实基础。我们通过用户界面设计、事件处理、3D模型集成和数据可视化等实践案例,帮助读者理解基本和高级功能的开发过程。此外,本文还详述
recommend-type

永磁同步电机工作原理新手入门 通俗易懂的解释

<think>嗯,用户想了解永磁同步电机的工作原理,特别是针对新手的通俗解释。首先,我需要回忆一下永磁同步电机的基本结构和工作原理。可能要从定子和转子开始讲起,因为这是电机的主要部分。定子通常有绕组,通电后产生旋转磁场,而转子装有永磁体,跟随磁场同步旋转。 用户提到是新手,所以需要用简单的比喻,比如旋转木马或者磁铁相互吸引的例子。要避免使用太多专业术语,或者如果用了,需要解释清楚。比如,旋转磁场的概念,可以比喻成一群人手拉手转圈,带动中间的磁铁跟着转。 可能需要分步骤解释:定子通电产生旋转磁场,转子永磁体被吸引同步转动,转速与磁场同步。这里要强调“同步”的含义,即转子的速度与磁场旋转速度一