发帖
6 0 0

求解板子的初始化过程

instead
中级会员

4

主题

6

回帖

407

积分

中级会员

积分
407
Ai-M61系列 846 6 2023-12-25 18:44:12

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

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

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

7FBAAA8FC369DE8213212061422A9A16.jpg

──── 0人觉得很赞 ────

使用道具 举报

2023-12-25 19:00:36
可以看下板卡对Flash空间的划分和自己烧写程序的起始地址
2023-12-25 19:51:30

<br /> <br />

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

[[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
给你抓个技术看一下~
根据我个人的理解就是,这个flash的初始化操作是对我们能进行读写操作的部分进行初始化,而程序运行段的这些已经在bootloader中执行过了,两者的地址不冲突。
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二进制文件布局更新了吗
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28481 个
  • 话题数: 40597 篇