特性概述 详细说明
较强的接收容错能力 自动从下一个起始符继续匹配
丰富的协议解析能力 同一个端口支持解析多种协议
灵活的端口转发能力 支持在任意端口之间相互转发(转发时支持协议转换)
良好的协议扩展能力 采用星形拓扑|方便后期扩展
« 閱讀全文 »

对比条目 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
« 閱讀全文 »

与上文类似,对 tinyuz 也进行二次封装以便上层调用:

tinyuz_port.h
#ifndef __tinyuz_port_h__
#define __tinyuz_port_h__

#include <stddef.h>
#include "malloc.h"

#define TUZ_DECOMPRESS_SPACE_SIZE 512*1024 // 外部存储中〈差分文件区〉的空间大小

#define tuz_malloc(x) mymalloc(x)
#define tuz_free(x) myfree(x)

typedef enum TTinyuzResult
{
TINYUZ_SUCCESS=0,
TINYUZ_OPTIONS_ERROR,
TINYUZ_OPENREAD_ERROR,
TINYUZ_OPENWRITE_ERROR,
TINYUZ_FILEREAD_ERROR,
TINYUZ_FILEWRITE_ERROR,
TINYUZ_FILECLOSE_ERROR,
TINYUZ_MEM_ERROR,
TINYUZ_COMPRESS_ERROR,
TINYUZ_DECOMPRESS_ERROR,
} TTinyuzResult;

size_t tuz_decompress(size_t compressed_file_size, size_t cache_size);

#endif /* __tinyuz_port_h__ */
« 閱讀全文 »