Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
FAL
ota_downloader软件包
qboot
10
qboot 修改fal_cfg,h中的FAL_FLASH_DEV_TABLE 后 跳转失败
发布于 2023-04-11 11:18:21 浏览:958
订阅该版
1. 因为MCU FLASH有限,在移植了qboot后,发现没有足够的ROM空间放置download factory区 ,因板子上有TF卡,所以想在把两个partition放置TF中 ,按照@红枫大佬的文档移植 测试qboot功能正常后 我做了如下修改: - fal_cfg. 文件 ```c extern const struct fal_flash_dev tf_download_file; /* flash device table */ #define FAL_FLASH_DEV_TABLE \ { \ &stm32_onchip_flash_16k, \ &stm32_onchip_flash_64k, \ &stm32_onchip_flash_128k, \ &tf_download_file, \ } ``` - 仿照drv_flash_f4.c写了download partition部分的驱动代码 ```c #define DOWNLOARD_BIN_SIZE_MAX (7 * 128 * 1024) #define DOWNLOARD_BIN_START_ADRESS (0) static int fal_flash_read_download_bin(long offset, rt_uint8_t *buf, size_t size); static int fal_flash_write_download_bin(long offset, const rt_uint8_t *buf, size_t size); static int fal_flash_erase_download_bin(long offset, size_t size); static int fatfs_Init(void); const struct fal_flash_dev tf_download_file = { "tf_download_file", DOWNLOARD_BIN_START_ADRESS, DOWNLOARD_BIN_SIZE_MAX, (128 * 1024), {fatfs_Init, fal_flash_read_download_bin, fal_flash_write_download_bin, fal_flash_erase_download_bin} }; static int g_file_fd = -1; int file_download_read(rt_uint32_t addr, rt_uint8_t *buf, size_t size) { // size_t i; if ((addr + size) > DOWNLOARD_BIN_SIZE_MAX) { LOG_E("read outrange flash size! addr is (0x%p)", (void*)(addr + size)); return -1; } g_file_fd = open("/download.bin", O_RDONLY| O_CREAT); lseek(g_file_fd,(addr),SEEK_SET); if (g_file_fd > 0) { read(g_file_fd, buf, size); } close(g_file_fd); return size; } static int fal_flash_read_download_bin(long offset, rt_uint8_t *buf, size_t size) { return file_download_read(tf_download_file.addr + offset, buf, size); } int file_download_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size) { //size_t i; if ((addr + size) > DOWNLOARD_BIN_SIZE_MAX) { LOG_E("read outrange flash size! addr is (0x%p)", (void*)(addr + size)); return -1; } g_file_fd = open("/download.bin", O_WRONLY| O_CREAT); lseek(g_file_fd,(addr),SEEK_SET); if (g_file_fd > 0) { write(g_file_fd, buf, size); } close(g_file_fd); return size; } static int fal_flash_write_download_bin(long offset, const rt_uint8_t *buf, size_t size) { return file_download_write(tf_download_file.addr + offset, buf, size); } int file_download_erase(rt_uint32_t addr, size_t size) { size_t i; uint8_t erase_buf[512] ; i=(addr + size); if ((addr + size) > DOWNLOARD_BIN_SIZE_MAX) { LOG_E("read outrange flash size! addr is (0x%p)", (void*)(addr + size)); return -1; } g_file_fd = open("/download.bin", O_WRONLY| O_CREAT); lseek(g_file_fd,i,SEEK_SET); memset(erase_buf,0xff,512); if (g_file_fd > 0) { for (int var = 0; var < size/512; ++var) { write(g_file_fd, erase_buf, 512); i+=512; lseek(g_file_fd,i,SEEK_SET); } write(g_file_fd, erase_buf, size%512); } close(g_file_fd); return size; } static int fal_flash_erase_download_bin(long offset, size_t size) { return file_download_erase(tf_download_file.addr + offset, size); } static int fatfs_Init(void) { rt_thread_mdelay(1000); if (dfs_mount("sd0", "/", "elm", 0, 0) == 0) { rt_kprintf(" dfs mount ok \r\n"); } else { rt_kprintf(" dfs mount err \r\n"); } return 0; } ``` ```c - 然后运行发现 跳转失败 后测试发现 我只要 屏蔽FAL_FLASH_DEV_TABLE中我增加的 tf_download_file ,就能正常跳转,否则即便我全部使用片上FALSH也会跳转失败 ,我搜寻了 FAL_FLASH_DEV_TABLE,发现只在 fal_flash.c中文件使用了,并没有发现导致跳转失败的地方。请大佬帮忙分析一下原因
查看更多
lchnu
2023-04-11
Witness, Understand, Skill
思路很秀,代码风格和功能看起来都ok。 1. 你指的跳转失败具体表现是什么?能否提供更多的信息? 2. 你在qboot bootloader中测试过文件的写入和读取功能吗? 3. 你提到全部使用片上Flash,是指download和factory都放在片上吗?这种情况下,即使没有使用tf,但只要它在FAL_FLASH_DEV_TABLE中也会出错?我的这个理解可对? 根据已有信息,我初步想到这几个小问题: 1. 在app中下载程序,一般在tshell线程下,或者根据你的逻辑在某个线程下。我看`file_download_erase`函数中有个临时数组为512字节,有没有可能你的线程栈崩了? 2. 在download和erase函数中,都用了O_CREAT,是否在download中添加O_APPEND会比较合理? 根据目前的信息只能推测出上述两个不成熟观点。 我的板子上也有板载TF卡,我对这个思路很感兴趣,欢迎进一步探讨。
4
个回答
默认排序
按发布时间排序
红枫
认证专家
2023-04-12
这家伙很懒,什么也没写!
使用文件模拟成flash分区,实现了qboot到文件系统接口,做得很棒!👍 👍
iron_cdw
2023-04-11
这家伙很懒,什么也没写!
各位 问题已解决 我用的是RT-Studio,编译优化等级 要选择 None(-O0)。 整个工程编译下来太大了 133K,所以选择 Optimize more(-O2)来缩小尺寸,没想到踩了一个大坑。目前的问题变成该如何优化固件尺寸。。。
Lrain
2024-05-20
这家伙很懒,什么也没写!
![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240521/32059eb75989c4e7eb84d03f0bf3be1b.png) 跳转过去,app区的程序不会运行了是为什么? ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240521/644a04cb865398e229c1b70138c1cdd7.png)
撰写答案
登录
注册新账号
关注者
0
被浏览
958
关于作者
iron_cdw
这家伙很懒,什么也没写!
提问
8
回答
9
被采纳
0
关注TA
发私信
相关问题
1
关于FAL移植
2
添加fal软件包之后编译出现错误,求助!
3
关于easyflash4.0的写入和读取norflash一些疑惑咨询
4
FAL驱动移植&构建脚本问题
5
帮我看一下这样分区会不会冲突??
6
EasyFlash 4.0疑似出BUG
7
疑似FAL日志输出与DFS冲突??
8
fal软件包偏移量大于等于当前分区的大小会报错
9
为什么片内Flash总是写失败?
10
片上flash的文件系统的建立
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
组件 lwip v2.0.3 版本使用 netdev网卡的 ping 功能
2
简单两步配置RTT源码阅读环境 vsc+clangd
3
恩智浦[FRDM-MCXN947]初探 之 ADC与DAC
4
LVGL使用字库IC芯片显示中文
5
基于STM32H750和Rt-Thread的CANFD通信实现的记录(一)
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
807
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
4
次点赞
用RTT跑流水灯
1
篇文章
2
次点赞
catcatbing
1
篇文章
2
次点赞
YZRD
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部