跳到主要内容

Flash数据库

在上一步代码生成后,会出现User/flash_map.hpp,该文件记录了STM32的Flash地址映射表。表中每一项是一段地址相接、大小相同的扇区,依次为起始地址、扇区字节数和扇区个数,格式如下:

#pragma once
// Generated by `libxr gen`; do not edit by hand.
// MCU: STM32F407IGH6

#include "main.h"
#include "stm32_flash.hpp"

constexpr LibXR::FlashRegion FLASH_REGIONS[] = {
{0x08000000, 0x00004000, 4},
{0x08010000, 0x00010000, 1},
{0x08020000, 0x00020000, 7},
};

constexpr size_t FLASH_REGION_NUMBER = sizeof(FLASH_REGIONS) / sizeof(LibXR::FlashRegion);

libxr stm32 flash-info <型号> 可以单独打印某个型号的布局。app_main.cpp 只在 database.enable 为 true,或 User Code 中用到 FLASH_REGIONS、FLASH_REGION_NUMBER 时 include flash_map.hpp。推算不出 MCU 型号的 Flash 布局时,libxr gen 给出警告,不生成 flash_map.hpp,并删除以前生成的 flash_map.hpp。

由 libxr_config.yaml 生成​

User/libxr_config.yaml 中 database.enable 为 true 时,libxr gen 在 app_main() 中生成 Flash 对象和数据库对象,数据库使用 Flash 末尾的两个扇区;带 --xrobot 生成时,数据库以 database 注册为 LibXR::Database:

database:
enable: true
block_size: auto
  // Flash and database
static STM32Flash flash(FLASH_REGIONS, FLASH_REGION_NUMBER);
static DatabaseRaw<STM32Flash::MIN_WRITE_SIZE> database(flash);

block_size 决定 DatabaseRaw 的模板参数,即数据库的最小写入单元,单位为字节,不能小于 Flash 的最小写入单元。默认值 auto 生成 STM32Flash::MIN_WRITE_SIZE,即 LibXR 按芯片的 HAL 得出的 Flash 最小写入单元,例如 F4 为 1、F1 为 2、G4 为 8、H723 为 32;写成正整数时使用这个数,例如 block_size: 32 生成 DatabaseRaw<32>。其他值使生成停止,例如 block_size: wide:

$ libxr gen -i .config.yaml -o User/app_main.cpp
[信息] 系统:FreeRTOS
[错误] 生成失败:User\libxr_config.yaml:database.block_size 'wide' 不是正整数或 auto

在 User Code 中创建对象​

database.enable 为 false 时,也可以在 User Code 中自行创建这两个对象,写法与上面生成的代码相同;STM32Flash 的第三个参数可以给出数据库存储区的起始地址,须正好是某个扇区的起点,存储区一直到 Flash 末尾,省略时使用末尾两个扇区(开头的 STM32F407IGH6 布局中为 0x080C0000)。键的定义与读写(Database::Key、Set())、DatabaseRawSequential 和回收阈值见中间件的 闪存数据库。

手写的 flash 和 database 对象不能与 database.enable: true 同时使用:这时 app_main() 中已经生成 static STM32Flash flash 和 static DatabaseRaw<...> database,User Code 2、3 中的同名对象与它们位于同一作用域,编译时报重复定义。

User Code 中用到 FLASH_REGIONS 时,app_main.cpp 在下一次生成时才 include flash_map.hpp;在此之前编译,需要在 User Code 1 中写 #include "flash_map.hpp"。