<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[MCAL-Crypto与FEE抢占Fls驱动问题与对策说明]]></title><description><![CDATA[<h1>1. 问题</h1>
<h2>1.1 旧版调用链与风险</h2>
<ol>
<li>旧版 Crypto 密钥装载驱动依赖 Fls：循环调用 Fls_MainFunction() 等待空闲，以局部数组 TempKey[32] 提交 Fls_Read()，再循环调用 Fls 主函数等待结果。FEE 也经 Fls 执行异步作业。</li>
<li>若 Crypto 抢占正在执行 Fls 主函数的 FEE 路径，又调用 Fls_MainFunction()，就可能重入同一 Fls 作业。即使通过防重入标志跳过第二次调用，抢占方原地忙等也会阻止被抢占方恢复，最终可能超时。</li>
<li>若 Fls 已接受异步读取，而 Crypto 等待超时后返回，Fls 保存的目的指针还可能指向已失效的栈数组。因此，旧方案同时面临主函数重入、抢占方忙等和缓冲区生命周期风险。<br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/27/dfae874b-6228-4034-9382-11086d774ec0.png" alt="268d3987-b9c1-4818-941c-611a983ce9fc-image.png" class=" img-fluid img-markdown" /></li>
</ol>
<h2>1.2 影响的驱动版本</h2>
<ol>
<li>MCAL V3.0.0及以前</li>
</ol>
<h1>2. 解决对策</h1>
<h2>2.1 驱动更新</h2>
<ol>
<li>本次更新三个 Crypto 驱动文件：Crypto_Lld_KeyManage.c、SchM_Crypto.c 和 SchM_Crypto.h。新版密钥装载直接操作 EFM 并同步等待命令完成，不再调用 Fls_Read() 或 Fls_MainFunction()；由 Crypto 引起的上述 Fls 主函数重入及异步栈缓冲区失效链路随之消失。</li>
</ol>
<h2>2.2 双状态检查与抢占推演</h2>
<ol>
<li>
<p dir="auto">但 Crypto 与 FEE/Fls 仍共用 EFM。Fls 已登记请求但尚未下发命令，或异步命令已完成但尚未结算时，都可能出现 <strong>Fls 作业 PENDING、EFM IDLE</strong>。仅凭硬件空闲就清除 EFM 状态，可能破坏 Fls 尚未读取的错误结果。</p>
</li>
<li>
<p dir="auto">因此，Crypto_KeyManage_LoadAESKey() 在 AREA12 内、首次写 EFM 前，同时要求 Fls_GetStatus() == MEMIF_IDLE 且 EFM 为 IDLE；任一条件不满足就不执行装载，返回 E_NOT_OK，不在抢占方忙等。<br />
<img src="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/27/bebdf2df-1228-4ad4-897a-892e18057560.png" alt="5687f4ca-2a8d-4ced-ba35-1c751261d11e-image.png" class=" img-fluid img-markdown" /></p>
</li>
<li>
<p dir="auto">在 <strong>AREA12 屏蔽全部相关 Fls 执行者</strong>的前提下：Crypto 抢占已登记的 Fls 作业，会被 PENDING 检查拒绝；Fls 想抢占 Crypto，则不能在 AREA12 内插入。Crypto 退出后 Fls 再登记属于顺序执行，而非中途抢占。</p>
</li>
</ol>
<h2>2.3 失败上报</h2>
<ol>
<li>失败时，密钥装载函数调用 Det_ReportRuntimeError() 记录，并返回 E_NOT_OK。当前 HCU 配钥调用方丢弃该返回值；用户需根据 DET 记录安排失败处理，驱动<strong><strong>不会因此自动中止或重试当前 HCU 作业。</strong></strong></li>
</ol>
<h1>3. 注意事项</h1>
<p dir="auto"><strong>1. 屏蔽范围：</strong> Crypto临界区采用 AREA12，优先级 BASEPRI=0x20，优先级更高的中断仍可进入。须确认所有 Fls/EFM 调用者及任务切换都受 AREA12 约束；Crypto 与 Fls 各自的 SchM 不是同一把跨模块锁。<br />
<strong>2. 接口边界：</strong> 避免并发绕过 Fls 上层作业登记、直接调用 EFM LLD。例如 Fls_Lld_ReadFlash() 的 NVR 路径可能操作 EFM，却不会使 Fls_GetStatus() 显示 PENDING。<br />
<strong>3. 失败管理：</strong> DET 只记录诊断，不会停止当前 HCU 作业；Fls 占用、EFM 忙、命令超时或硬件错误目前都被记录为 CRYPTO_E_OPERATION_TIMEOUT，用户需根据 DET 记录安排失败处理，驱动不会因此自动中止或重试当前 HCU 作业。</p>
<h1>4. 驱动文件</h1>
<p dir="auto"><a href="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/27/59b0778e-5f3c-4202-9f03-496c8b3ff5c4.zip" rel="nofollow ugc">Crypto_Fls_Reg_Release_1.0.zip</a></p>
]]></description><link>https://forum.ytmicro.com/topic/2354/mcal-crypto与fee抢占fls驱动问题与对策说明</link><generator>RSS for Node</generator><lastBuildDate>Sat, 14 Nov 2026 02:17:14 GMT</lastBuildDate><atom:link href="https://forum.ytmicro.com/topic/2354.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 13 Nov 2026 06:46:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to MCAL-Crypto与FEE抢占Fls驱动问题与对策说明 on Fri, 13 Nov 2026 07:12:18 GMT]]></title><description><![CDATA[<p dir="auto">这类帖子，放到MCAL下面就行</p>
]]></description><link>https://forum.ytmicro.com/post/10103</link><guid isPermaLink="true">https://forum.ytmicro.com/post/10103</guid><dc:creator><![CDATA[xianghan]]></dc:creator><pubDate>Fri, 13 Nov 2026 07:12:18 GMT</pubDate></item></channel></rss>