求解板子的初始化过程

[复制链接]
查看701 | 回复6 | 2023-12-25 18:44:12 | 显示全部楼层 |阅读模式

最近在看sdk的时候,发现主程序中用于初始化的 board_init() 函数里面还对flash进行了初始化。但按照我的理解编译出来的固件不是刷入板子上的flash中吗,如果flash里面的程序执行过程中又对flash控制器进行了初始化操作,不会导致程序执行中断吗。

还是说板子在启动时会由boot2加载flash中的程序到内存中,而后再对flash初始化。

(另外这个boot2可以单独编译出来吗)

7FBAAA8FC369DE8213212061422A9A16.jpg

百回「可愛い」って言うまで放さないい!
回复

使用道具 举报

1084504793 | 2023-12-25 19:00:36 | 显示全部楼层
可以看下板卡对Flash空间的划分和自己烧写程序的起始地址
回复 支持 反对

使用道具 举报

instead | 2023-12-25 19:51:30 | 显示全部楼层

[quote][size=2][color=#999999]1084504793 发表于 2023-12-25 19:00[/color][/size] 可以看下板卡对Flash空间的划分和自己烧写程序的起始地址[/quote]

我看了一下仓库里面的分区表文件,发现里面为应用固件配置了如下内容

[[pt_entry]]
type = 0
name = "FW"
device = 0
address0 = 0x10000
size0 = 0x200000
address1 = 0x210000
size1 = 0x168000
# compressed image must set len,normal image can left it to 0
len = 0
# If header is 1, it will add the header.
header = 1
# If header is 1 and security is 1, It will be encrypted.
security= 1

这是否代表着我配置 memory.x 文件时需要将 Flash 地址也设置为 0x10000,例如这样:

MEMORY
{
    ROM   (rx)  : ORIGIN = 0x90000000, LENGTH = 128K
    FLASH (wxa) : ORIGIN = 0x10000,    LENGTH = 2048K
    OCRAM (wxa) : ORIGIN = 0x22FC0000, LENGTH = 320K
    WRAM  (wxa) : ORIGIN = 0x23010000, LENGTH = 160K
}

REGION_ALIAS("REGION_TEXT", FLASH);
REGION_ALIAS("REGION_RODATA", FLASH);
REGION_ALIAS("REGION_DATA", OCRAM);
REGION_ALIAS("REGION_BSS", OCRAM);
REGION_ALIAS("REGION_HEAP", OCRAM);
REGION_ALIAS("REGION_STACK", OCRAM);

memory.x 文件是rust编译器编译时使用的链接脚本

还是说需要保留 BL616 手册中给出的 Flash 起始地址 0xA0000000,这个 0x10000 只在烧录程序的配置文件 flash_prog_cfg.ini 中使用

百回「可愛い」って言うまで放さないい!
回复 支持 反对

使用道具 举报

心云 | 2023-12-25 22:54:24 | 显示全部楼层

👍
回复

使用道具 举报

爱笑 | 2023-12-26 08:45:34 | 显示全部楼层
给你抓个技术看一下~
用心做好保姆工作
回复 支持 反对

使用道具 举报

Ai-Thinker小泽 | 2023-12-26 09:25:33 | 显示全部楼层
根据我个人的理解就是,这个flash的初始化操作是对我们能进行读写操作的部分进行初始化,而程序运行段的这些已经在bootloader中执行过了,两者的地址不冲突。
回复 支持 反对

使用道具 举报

instead | 2023-12-29 10:35:27 | 显示全部楼层
本帖最后由 instead 于 2023-12-29 10:37 编辑
Ai-Thinker小泽 发表于 2023-12-26 09:25
根据我个人的理解就是,这个flash的初始化操作是对我们能进行读写操作的部分进行初始化,而程序运行段的这 ...

emmmm我参考https://github.com/spacemeowx2/blflashhttps://github.com/bouffalolab/BLOpenFlasher用python搓了一个生成partition的玩具
  1. import argparse
  2. import toml
  3. import struct
  4. import zlib

  5. def create_partition_bin(if_name, of_name):
  6.     with open(if_name, 'r') as file:
  7.         data = toml.load(file)

  8.     entry_list = data.get('pt_entry', [])

  9.     header = b'\x42\x46\x50\x54\x00\x00' + struct.pack('<H', len(entry_list))

  10.     entries = []
  11.     for entry in entry_list:
  12.         entry_type = entry.get('type', 0)
  13.         name = entry.get('name', '')[:8].encode('utf-8').ljust(8, b'\0')
  14.         address0 = entry.get('address0', 0)
  15.         address1 = entry.get('address1', 0)
  16.         size0 = entry.get('size0', 0)
  17.         size1 = entry.get('size1', 0)
  18.         length = entry.get('len', 0)

  19.         print(entry_type, name, address0, address1, size0, size1, length)
  20.         entries.append(struct.pack('<I8sIIIIB', entry_type, name, address0, address1, size0, size1, length))

  21.     checksum = zlib.crc32(header + b''.join(entries)).to_bytes(4, 'little')
  22.     output_bytes = header + b''.join(entries) + checksum

  23.     with open(of_name, 'wb') as file:
  24.         file.write(output_bytes)

  25. if __name__ == "__main__":
  26.     parser = argparse.ArgumentParser(description='Generate partition binary from TOML file.')
  27.     parser.add_argument('input', help='Input TOML file path')
  28.     parser.add_argument('output', help='Output binary file path')
  29.     args = parser.parse_args()

  30.     create_partition_bin(args.input, args.output)
复制代码

但是用生成的partition.bin和aithinker_Ai-M6X_SDK/bsp/board/bl616dk/config/boot2_bl616_release_v8.0.7.bin at master · Ai-Thinker-Open/aithinker_Ai-M6X_SDK (github.com)来刷入固件的时候报错
  1. [10:30:56.627] - Error: path: ##########\Rust\ai_m61_32s_blinky\boot2_bl616_release_v8.0.7.bin  size: 43328  range: 256
  2. [10:30:56.627] - Error: The file size exceeds the address space size!
复制代码
看了下生成的时候boot2划定的大小(size0)为57344,但貌似在BLFlashCube里面识别成了256
Snipaste_2023-12-29_10-36-33.png
emmmm是BLFlashCube所使用的partition二进制文件布局更新了吗
百回「可愛い」って言うまで放さないい!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则