集成开发环境-GCC.ARM(#02)程序构建
倘若只有 main.h 和 main.c 两个文件,那么只需要执行少量的指令即可完成编译工作。但是实际上一个工程通常包含几十上百个文件,意味着要执行大量的编译指令才能得到目标文件,这是我们所无法接受的。因此需要借助 make、cmake、ninja、scons 等构建工具来提高开发效率。
倘若只有 main.h 和 main.c 两个文件,那么只需要执行少量的指令即可完成编译工作。但是实际上一个工程通常包含几十上百个文件,意味着要执行大量的编译指令才能得到目标文件,这是我们所无法接受的。因此需要借助 make、cmake、ninja、scons 等构建工具来提高开发效率。
集成开发环境-GCC.ARM(#01)环境搭建
集成开发环境-GCC.ARM(#02)程序构建
集成开发环境-GCC.ARM(#03)程序烧录
集成开发环境-GCC.ARM(#04)快捷任务
集成开发环境-GCC.ARM(#05)程序调试
集成开发环境-DBG
传统的集成开发环境(MDK、IAR)通常会提供包括编辑、编译、烧录、调试在内的一整套工具,开发者无需配置,简单易用,但 license 也不是一般的贵。
替代方案:
LilyPond 是什么?(https://lilypond.org/)
LilyPond (荷花池) 是一个音乐雕版软件,致力产生最高质量的乐谱。它把传统音乐雕版印刷的美学,呈现在计算机打印的乐谱上。LilyPond 是自由软件,也是 GNU Project 的一部分。
计算机软件的内核是将接收到的数据进行计算并输出,LilyPond 也不例外。我们需要按照 LilyPond 开发者制定的规则编写乐谱源码,然后使用 LilyPond 将源代码转换为 PNG、PDF、SVG、MIDI 等格式的文件。
最近给 HC32F460 烧程序时,出现了烧录失败的现象。
操作流程:
诡异的是,最后一步总是失败。
后面又进行了详细的测试:
测试记录 | 编程算法 | SWDT | 烧录结果 |
---|---|---|---|
1 | 旧版 | 关闭 或者延长狗叫时间 |
烧录成功 |
2 | 旧版 | 开启 | 在烧录回去之前,做一次整片擦除,但是不断电:烧录失败 在烧录回去之前,做一次整片擦除,断电再上电:烧录成功 |
3 | 新版 | X | 均可烧录成功 |
猜测应该是编程算法在烧录过程中没有屏蔽 SWDT 所致,更换新版编程算法即可解决。
JLink info: |
* JLink Info: Reset: S_RESET_ST never gets cleared. CPU seems to be kept in reset forever.
很可能是外部复位电路失效,导致复位引脚被拉低,进而导致内核一直处于复位状态。
在《参考手册》第六章〈初始化配置〉中,八个初始化配置寄存器的复位值是不定的,华大对此的处理方式很巧妙(但是也给移植埋下了一个大坑):
/*!< ICG0 register value */ |
#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ |
通过定义常量的方式,在程序加载阶段,将数据 load 至指定的寄存器。
如果工程由 bootloader 和 app 两部分组成,那么只能在 bootloader 中添加 *_icg.c 文件,在 app 中不能添加该文件,否则会出现异常,原因如下:
在 App 中也添加 *_icg.c 意味着要将 u32ICG 指定到 0x400 这个地址,所以编译出来的 App 会由两部分组成:
ER$$.ARM. AT Ox00000400 文件大小为一个扇区(HC32F460=8K) |
而 0x400 所在的扇区通常是 bootloader 所在的区域,所以在烧录 App 时就会导致 bootloader 的中断向量表数据被擦除,进而导致程序无法引导,具体表现就是程序运行不起来。