你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

RT多线程s下,tm32F407在擦FLASH期间,如何使其线程可以正常被调度呢?我尝试把函数搬到RAM区,可一旦动主函数在烧录时他就会报错

[复制链接]
weiweizczx 提问时间:2024-1-19 09:51 / 未解决
收藏 评论10 发布时间:2024-1-19 09:51

举报

10个回答
weiweizczx 回答时间:2024-1-19 09:53:30

中断如果没有多线程情况下,搬运到RAM可以在擦FLASH时可以正常执行,一旦加了RT多线程,我把中断搬到RAM区其擦FLASH时不会执行中断,其他线程也不会被调度

weiweizczx 回答时间:2024-1-19 10:23:49

我使用了Bootloader引导启动,程序烧录FLASH,Bootloader将该程序拷贝到RAM区,然后跳转到该RAM区,FLASH相当于只做存储。任然不能使程序在擦FLASH期间正常运行。

weiweizczx 回答时间:2024-1-19 10:29:59

在看汇编时发现,其执行的时候还是在执行FLASH区域的程序,并没有执行RAM区程序

(这有可能是因为我调试主程序并没有经过Bootloader引导)

watershade 回答时间:2024-1-19 11:01:28

不知道你是部分函数搬迁还是所有的代码都在RAM执行。如果是前者,我记得常量数据初始化的时候是没有搬迁的,另外你搬迁的这个函数调用的子函数的执行地址按道理也没有搬迁。(我不太确定,需要你自己做个试验。有结果告诉我。)

围观高手解答

butterflyspring 回答时间:2024-1-19 11:29:45
通常烧录时,一旦去访问Flash 代码时就会失败。

理论上这时候如果产生中断,中断服务函数也应该放在RAM中。
weiweizczx 回答时间:2024-1-19 11:44:59

.sct文件中加载与运行地址之前均为FLASH区,我尝试把加载,运行改到片外RAM区,可以编译,烧录时出现Error-Flash Download failed Cortex-M4错误

weiweizczx 回答时间:2024-1-19 11:48:32

butterflyspring 发表于 2024-1-19 11:29
通常烧录时,一旦去访问Flash 代码时就会失败。</p>
<p>理论上这时候如果产生中断,中断服务函数也应该放在RAM中 ...

如果是只有中断,可以放在ram区执行,擦FLASH不影响中断执行。可是我加了线程,中断放进ram他也不执行了,主要我还想要在擦FLASH时执行其他线程

weiweizczx 回答时间:2024-1-19 11:50:33

watershade 发表于 2024-1-19 11:01
不知道你是部分函数搬迁还是所有的代码都在RAM执行。如果是前者,我记得常量数据初始化的时候是没有搬 ...

[md]我主程序烧录地址是0x8020000,大小:0x20000,我拷贝的时候是直接从这个地址开始所有数据全部拷贝到片外RAM

butterflyspring 回答时间:2024-1-19 17:17:32
weiweizczx 发表于 2024-1-19 11:48
[md]如果是只有中断,可以放在ram区执行,擦FLASH不影响中断执行。可是我加了线程,中断放进ram他也不执 ...

这个是物理上的特征。 程序擦除和烧录时,是不能访问FLASH的。

所以此时任何放在FLASH中的代码都不能被执行。 这也是为什么后面的芯片有双BANK的原因之一。
watershade 回答时间:2024-1-20 10:48:12

weiweizczx 发表于 2024-1-19 11:50
我主程序烧录地址是0x8020000,大小:0x20000,我拷贝的时候是直接从这个地址开始所有数据全部拷贝到 ...

[md]比方说你函数相互调用的时候,你的程序挑战的地址应该在那里?你可以单步调试看一下。我感觉只是这样copy好像不行。

双bank是一个解决方案。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版