C++ virtual相关

本文深入探讨了虚函数调用机制,解释了在编译时刻与运行时刻选择被调用函数的区别,以及如何根据对象实际基类或派生类的类型在执行程序的每个调用点决定选择合适的虚拟函数实例。
对于一个非虚函数的调用,编译器在编译时刻选择被调用的函数。而虚函数调用的决定则要等到运行时刻。在执行程序每个调用点上,系统根据被调用对象的实际基类或派生类的类型来决定选择哪一个虚拟函数实例。
### 如何在 STM32CubeMX 中通过 USB 实现 IAP 快速更新 #### 配置USB设备模式为DFU类 为了使STM32能够通过USB接口进行固件更新,在STM32CubeMX中的配置至关重要。当设置USB设备模式时,应选择Download Firmware Update Class (DFU)[^1]。 #### 使用CubeMX版本及IDE工具链 确保使用的开发环境兼容所选项目需求。推荐使用CubeMX V6.1.1以及Keil MDK V5.26作为主要集成开发环境[^3]。当然也可以选用其他支持STM32CubeMX插件的IDE如CLion, VSCode等来进行编程工作[^4]。 #### 编程与烧录过程 完成上述硬件抽象层(HAL)库初始化之后,需编写相应的应用程序代码并编译成`.bin`文件格式。对于IAP(In Application Programming),即在线编程而言,该二进制映像应当被放置于特定起始地址处——例如0x08007000,并借助ST官方提供的STM32CubeProgrammer软件将其下载至目标板上[^5]。 #### 关键技术点解析 理解.map文件结构有助于合理规划存储空间;掌握中断向量表机制可以保障Bootloader顺利切换至用户应用(App)执行流;熟悉Flash分区策略则能有效防止数据冲突或覆盖现象发生[^2]。 ```cpp // 示例:简单的跳转函数用于从BootLoader进入Application void JumpToApplication(uint32_t applicationAddress){ typedef void (*pFunction)(void); pFunction jump_to_app; /* Disable all interrupts */ __disable_irq(); // Remap RAM to address 0x0000_0000 if necessary SCB->VTOR = applicationAddress; // Set vector table offset register with new base address of interrupt vectors jump_to_app = (pFunction)*(uint32_t*)(applicationAddress + 4); // Get reset handler from the app's start location ((void(*)(void))jump_to_app)(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值