网络/手机设备的BSP,一个共同点

本文探讨了网络设备的两层BSP架构与手机设备低功耗管理单元的相似性,揭示了它们作为设备启动关键环节的作用,以及在故障诊断和挽救中的重要性。

最近在回顾一些,之前做过的工作
偶然发现一个异曲同工之处,在网络设备的两层BSP,和手机设备的低功耗管理单元之间

网络设备的两层BSP

最开始接触BSP时,就看到是这么个流程
后来适应了,也就再没想过,为何如此拆分

设备上电后,先是引导第一层BSP模块的加载启动
第一层BSP模块再引导第二层BSP模块的加载启动
第二层BSP模块再引导内核、文件系统的加载启动

第一块BSP模块启动后
还可以进入一种器件测试模式,做些内存等器件的全面检测
还可以进入一种网络加载模式,网络加载镜像到内存文件系统,然后继续运行

手机设备的低功耗管理单元

对于这个神秘的模块,一直只能从定位问题里管中窥豹
直到今天重温BSP、偶然看到协处理器时,顿时觉得非常形象,那以后就这么叫它了

硬狗复位是最难定位的系统问题,本来寄希望于它能辅助定位、记录CPU临终状态,但有时候连它也会一起卡死
和网络设备的两层BSP关联起来——它就相当于网络设备的第一层BSP
它确实存在死掉的可能,当一些很基础的器件失效时,那手机也只能重启甚至开不了机了

它还有一个子系统的角色
和网络设备的两层BSP关联起来——确实实至名归,是一个独立运作的小系统

还能想到一个场景,就是手机救砖
拆机短接进入COM1.0的状态,其实就是它的一种功能模式,类似还有高通平台的9008状态
使用配套的工具,加载正确的BSP镜像到内存文件系统,就能引导手机进入fastboot状态

总结

网络/手机设备,都隐藏了一种更底层的BSP模式,平时几乎看不到它的存在
它才是设备启动的第一环,对基础器件的状态异常更加敏感
也能够作为旁观者对器件做全面体检
还能为BSP镜像错误,保留最后的挽回生机

出现 `incompatible redefinition of macro "GENERAL_TIM"` 警告是因为宏 `GENERAL_TIM` 被重复定义且定义内容不兼容。可以参考以下几种方法解决: ### 检查并删除重复定义 若在 `Define`(预处理符号)选项卡中有 `GENERAL_TIM`,将其删除,就像处理 `LWIP_PLATFORM_ASSERT` 警告那样,把该选项卡中的 `GENERAL_TIM` 删除,警告可能会消失[^1]。 ### 检查工程选择和自定义宏 这可能是工程选择和自定义宏的问题。要确保选择的工程和定义的宏相匹配。若使用的是特定型号的板子,要保证定义宏时设置了正确的工程。例如使用 STM32F40_41xxx 的板子,芯片为 STM32F407IG,定义宏时需设置 `SMT32F40_41xx` 为当前工程,点击“Set as Current Target”按钮,设置需要选择的工程为当前工程。也可以查看 `readme`,根据板子的芯片选择相应的宏定义[^3]。 ### 避免重复引用宏定义 查看代码里是否存在重复引用宏定义的情况。例如在不同的头文件中重复定义了 `GENERAL_TIM`。在这个警告信息里,`bsp_GeneralTim.h` 和 `bsp_pwm.h` 都定义了 `GENERAL_TIM`,需要确保只在一个地方定义该宏,或者使用条件编译来避免重复定义。示例代码如下: ```c // 在 bsp_GeneralTim.h 中 #ifndef BSP_GENERALTIM_H #define BSP_GENERALTIM_H #ifdef __cplusplus extern "C" { #endif // 只在第一次包含时定义 GENERAL_TIM #ifndef GENERAL_TIM #define GENERAL_TIM TIM3 #endif // 其他代码... #ifdef __cplusplus } #endif #endif /* BSP_GENERALTIM_H */ // 在 bsp_pwm.h 中 #ifndef BSP_PWM_H #define BSP_PWM_H #ifdef __cplusplus extern "C" { #endif // 不再重复定义 GENERAL_TIM // 如果需要使用 GENERAL_TIM,直接使用即可 // 其他代码... #ifdef __cplusplus } #endif #endif /* BSP_PWM_H */ ``` ### 检查编译环境和工具链 若使用的编译环境和工具链存在冲突,也可能导致宏重复定义的问题。例如新工程勾选了 GUN 拓展的特性,环境会自带宏定义 `__GUNC__`,可能会和 MDK 的 `__CC_ARM` 冲突。要确保编译环境和工具链的设置正确,避免出现类似冲突[^4]。 ### 修改“C/C++”中的 Define 如果是因为将报错定位过去的红框全部复制到“C/C++”中的 `Define` 导致重复宏定义警告,可以修改“C/C++”中的 `Define` 为正确的预定义符号。例如修改为 `USE_HAL_DRIVER,STM32F103x6,ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING,__FPU_PRESENT=1` 等,避免重复定义[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值