当前位置: 首页 > wzjs >正文

在公司平台做网站竞拍wordpress主题翻译

在公司平台做网站竞拍,wordpress主题翻译,网站做电商资质,西安好玩的景点导言 这个章节的重点是“怎样让一个自己编写的函数比main()先运行,完成一些初始化操作。” 我暂时将bootloader程序分别五个模块,先从"启动入口与升级模式判断"模块开始吧。代码分别是boot_entry.c与boot_entry.h。项目刚开始,boo…

导言


这个章节的重点是“怎样让一个自己编写的函数比main()先运行,完成一些初始化操作。”
在这里插入图片描述
我暂时将bootloader程序分别五个模块,先从"启动入口与升级模式判断"模块开始吧。代码分别是boot_entry.c与boot_entry.h。项目刚开始,boot_entry.c与boot_entry.h会随着项目的推进会增加一些代码。

我的bootloader程序开发参考优秀的bootloader开源项目:mOTA ,强烈建议大家去学习一下这个优秀的开源项目。

项目地址:
github: https://github.com/q164129345/MCU_Develop/tree/main/bootloader03_stm32f103_boot_entry
gitee(国内): https://gitee.com/wallace89/MCU_Develop/tree/main/bootloader03_stm32f103_boot_entry

一、代码


1.1、boot_entry.c

#include "boot_entry.h"
#include "flash_map.h"
#include "app_jump.h"/*** @brief  上电,系统早期初始化回调(main()前自动调用)* @note*   - 本函数通过 GCC/ARMCC 的 @c __attribute__((constructor)) 属性修饰,系统启动后、main()执行前自动运行。*   - 适用于进行早期日志重定向、环境检测、固件完整性校验、启动标志判断等全局初始化操作。*   - 随项目进展,可逐步完善本函数内容,建议仅放置不依赖外设初始化的关键代码。** @attention*   - 使用 @c __attribute__((constructor)) 机制要求工程链接脚本/启动文件正确支持 .init_array 段。*   - 若编译器或启动脚本不支持该机制,请将该函数内容手动放入 main() 最前面调用。** @see    Retarget_RTT_Init(), log_printf()*/
__attribute__((constructor))
static void _SystemStart(void)
{Retarget_RTT_Init(); //! RTT重定向printflog_printf("System Start!\n");/*! 检查复位更新标志 *//*! 后续添加升级模式判断 *//*! 增加检测一个按键,强制进入Bootloader升级模式等等 *//*!退出该函数之后,将会运行大家非常非常熟悉的main() */
}

1.2、boot_entry.h

#ifndef __BOOT_ENTRY_H
#define __BOOT_ENTRY_H#ifdef __cplusplus
extern "C" {
#endif#include "main.h"#ifdef __cplusplus
}
#endif#endif /* __BOOT_ENTRY_H */

1.3、代码编译、下载

在这里插入图片描述
错误0,警告0

1.4、运行代码

在这里插入图片描述
从RTT Viewer打印的log看来,boot_entry.c的函数_SystemStart()居然比main.c的函数main()更早运行。 怎样做到的?什么原理?

二、新知识点 - C/C++的构造函数(constructor)机制


2.1、STM32F103上电后的启动流程

标准的启动流程如下:

  1. 上电/复位
  2. 从0x08000000(Bootloader首地址)开始执行
  3. 启动文件(startup_stm32f103xx.s)
    • 设置SP(堆栈指针)为Bootloader的起始堆栈
    • 跳转到Reset_Handler
  4. Reset_Handler 里会调用 SystemInit,然后进入 main()
    也就是说,按标准流程,应该是 main() 才是C代码入口点。

2.2、为什么_SystemStart()会先执行?

凡是被加了__attribute__((constructor))的函数,在main()之前被自动调用一次。这里的__attribute__((constructor))是GCC/ARMCC/KEIL等编译器的一个特殊拓展属性。这是编译器层面的“静态初始化”机制,与C++里的全局对象构造类似。

这个不是STM32硬件的行为,而是编译器“加的钩子”。STM32启动顺序没有变,主入口依然是main()。SystemStart()之所以main()之前执行,是编译器__attribute_((constructor))机制帮你做的。
在这里插入图片描述

2.3、为什么要让_SystemStart()比main()先执行?

在这里插入图片描述
为实现“无须deinit",才需要让_SystemStart()比main()先执行。如上图摘自mOTA 项目,当我看到bootloader程序可以实现“无须deinit"时,我真的非常激动。要把复杂的bootloader程序要把环境清理干净,真的折腾、调试死你。而且,STM32只有HAL库才有官方编写deinit()函数,高效的、优雅的LL库居然没有。

2.4、如果编译器/链接器不支持,怎么办?

在这里插入图片描述

http://www.dtcms.com/wzjs/562720.html

相关文章:

  • 成都网站制作方案为什么我的电脑打开了第一个网站打开第二个网站就网络出问题了?
  • 天津网站建设网站的设计原则
  • 网站建设 我们的优势免费注册域名网站推荐
  • 网站视频播放器用什么做的大连金普新区规划建设局网站
  • 广州制作公司网站做鼻翼整形整形的网站
  • 关于建设校园网站申请wordpress编辑器软件
  • 秦皇岛建设厅网站网站开发怎么开发
  • app推广全国代理加盟seo优化排名教程百度技术
  • 百度网络优化推广公司天津网站的优化
  • 一个网站有多少网页深圳建设网站过程
  • 网页在线制作网站wordpress单设备登录
  • 如何解析后用二级域名做网站厚瑜珠海网站建设
  • 英语网站建设医疗软件网站建设
  • 国外做的比较好的网站商洛网站建设求职简历
  • 做网站公司需要什么条件重庆网站建设jccit
  • 盘县 网站建设网页设计与制作dw
  • 西安网站建设推广线上推广员的工作内容
  • 做网站用哪几个端口 比较好杭州公司网站制作维护
  • 网站开发文档步骤应该怎么写办宽带要多少钱
  • 网站配置服务Wordpress云南网站建设500
  • 建设行业个人云网站网页设计如何设置背景
  • 做php网站阿里云服务器网络营销自学课程
  • 学校诗歌网站建设哪个网站可以做ppt
  • 学做网站教程自己怎么做企业网站建设
  • 为什么网站要备案wp风格网站
  • 网上有卖网站链接的吗pcms网站开发
  • 网站建设的实训心得 500字wordpress 名片主题
  • 自贡哪家做网站的好个人互动网站
  • 站长之家怎么查询网站哪家做的浙江省财务开发公司官网
  • 海外网站建设教程创建自己网站的步骤