对比条目 FreeRTOS RT-Thread
许可协议 MIT Apache License 2.0
内核开销 ROM: 5KB
RAM: 2KB
ROM: 3KB
RAM: 1KB
实测开销 ROM: 11KB
RAM: 1KB
抢占调度 支持 支持
轮转调度 支持 支持
多任务 支持 支持
优先级 32 8/32/256
信号量 支持 支持
互斥量 支持 支持
事件集 × 支持
邮箱 × 支持
信号 × 支持
消息队列 支持 支持
内存管理 heap1 - heap5 内存堆管理 | 内存池管理



系统兼容 × 提供 FreeRTOS_Wrapper 兼容层
posix × 支持
shell × MSH, FINSH
网络系统 × SAL + AT / LwIP
文件系统 FATFS DFS + FATFS / RomFS / Yaffs2 / Uffs2 / DevFS
spiflash × FlashDB + FAL + SFUD
设备框架 × 支持
电源管理 × 支持
图形界面 × 支持
« 閱讀全文 »

对于「引导程序+应用程序」之类的方案,我们通常是在系统初始化函数(SystemInit())中配置中断向量表偏移寄存器来实现中断向量表的重定向。但是这种直接修改官方库的方式往往会给后期的版本管理带来诸多不便。基于此,本文给出一个替代方案,供诸位参考。

vtor.c
#include "xxx32xxxx.h"

#define VECTOR_TABLE_OFFSET ((uint32_t)0x00018000) /* % 0x200 == 0 */

#define ROM_BASE ((uint32_t)0x08000000)
#define RAM_BASE ((uint32_t)0x20000000)

void SystemVTOR(void)
{
#ifdef EXECUTE_IN_RAM
SCB->VTOR = RAM_BASE | VECTOR_TABLE_OFFSET;
#else
SCB->VTOR = ROM_BASE | VECTOR_TABLE_OFFSET;
#endif
}
startup_xxx32xxxx.s
Reset_Handler   PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemVTOR
IMPORT SystemInit
IMPORT __main

LDR R0, =SystemVTOR
BLX R0
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP

对比条目 HC32F460 HC32F4A0
工作频率 200MHz 240MHz
内核架构 Cortex-M4 + FPU + DSP + MPU Cortex-M4 + FPU + DSP + MPU
芯片封装
ROM 512KB | 256KB 1024KB | 2048KB
RAM 192KB 516KB
PGA ×1 ×4
CMP ×3 ×4
ADC ×2 ×3
DAC ×2 ×4
TMR Timer6 ×3 (16bit 高级 PWM Timer)
Timer4 ×3 (16bit 电机 PWM Timer)
TimerA ×6 (16bit 通用 PWM Timer)

Timer0 ×2 (16bit 通用 ___ Timer)
Timer6 ×8 (16bit 高级 PWM Timer)
Timer4 ×3 (16bit 电机 PWM Timer)
TimerA ×C (16bit 通用 PWM Timer)
Timer2 ×4 (16bit 通用 ___ Timer)
Timer0 ×2 (16bit 通用 ___ Timer)
RTC ×1 ×1
WDT WDT & SWDT WDT & SWDT
URT ×4 ×10
SPI ×4 ×6
QSPI ×1 ×1
I2C ×3 ×6
I2S ×4 ×4
CAN ×1 ×2
USB ×1 ×1
ETH - ×1
SDIO ×2 ×2

文章更新(2023-11-14)

经过排查,本文所述异常现象并非由「非对齐访问」所致,而是因为 SRAM3 开启 ECC 校验时仅支持以字为单位进行访问。

现象描述

  • 程序无法正常启动
  • 有时会进入 hard fault 中断
  • 有时候会出现以下异常:
Call Stack + Locals                                                                    ✘
Name Location/Value Type
__scatterload_zeroinit 0x00074C56 function
__scatterload 0x00018DFE function
« 閱讀全文 »

flowchart LR
%%{init: { "flowchart": { "curve": "basis" } } }%%
    full_update(全量差分包)
    diff_update(增量差分包)
    app(大程序)
    iap(小程序)
    dnload(数据暂存区)
    backup(数据暂存区)
    runapp(程序运行区)
    decode(数据解码区)

    full_update-->app
    full_update-->iap
    diff_update-->app
    diff_update-->iap

    app-->dnload
    iap-->dnload

    dnload--跳转至小程序-->backup

    backup-.㈣<br>回滚旧程序.->runapp
    backup--㈠<br>解码升级包-->decode
    decode--㈢<br>写入新程序-->runapp
    runapp--㈡<br>备份旧程序-->backup
« 閱讀全文 »

传统编程方式
flowchart LR
%%{init: { "flowchart": { "curve": "basis" } } }%%
A(先取下芯片)--->B(再烧录程序)--->C(后装回板卡)
现代编程方式
flowchart LR
%%{init: { "flowchart": { "curve": "basis" } } }%%
A("在电路编程<br>(ICP)")--->B("在系统编程<br>(ISP)")--->C("在应用编程<br>(IAP)")
« 閱讀全文 »