跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YT MCAL
  4. CorTst 测试项 `m33_cst_loadstore_test6.S` 失败

CorTst 测试项 `m33_cst_loadstore_test6.S` 失败

已定时 已固定 已锁定 已移动 YT MCAL
2 帖子 1 发布者 206 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • jiankang_wangJ 离线
    jiankang_wangJ 离线
    jiankang_wang YunTu
    写于 最后由 编辑
    #1

    CorTst 测试项 m33_cst_loadstore_test6.S 失败

    1. 问题描述

    在进行 CorTst 测试时,在极端的高频中断场景下(例如每 50μs 触发一次周期性中断),测试用例出现概率性虚假失败 (False Failure),跳转至 m33_cst_loadstore_test6_stack_failed 错误处理分支。

    问题代码片段:

        /* Update signature on stack */
        LDREX     R1, [SP]        /* Switch to exclusive access */
        ROR       R1, R1, #1
        STREX     R0, R1, [SP]    /* STREX in exclusive access should succeed */
        CMP       R0, #0
        DSB
        BNE       m33_cst_loadstore_test6_stack_failed
    
        ROR       R1, R1, #3      /* Destroy signature in R1 */
    
    

    2. 原因分析

    此问题是由于 ARM 架构硬件行为特性 与 未屏蔽全局中断 共同作用导致的,并非实际硬件的 Load/Store 独占访问功能存在缺陷。

    2.1 硬件状态机机制

    Cortex-M 的 Local Exclusive Monitor 状态切换逻辑如下:

    [Open Access] --LDREX--> [Exclusive Access] --STREX (Success)--> [Open Access]
    

    根据 ARMv7-M / ARMv8-M 架构手册规定:

    异常入口 (Exception Entry) 触发时,硬件会自动清零 Local Exclusive Monitor,强制将其从 Exclusive Access 状态重置为 Open Access 状态。
    《Arm® v7-M Architecture Reference Manual》A3.4.5 Load-Exclusive and Store-Exclusive usage restrictions

    此设计旨在防止中断服务程序 (ISR) 与线程上下文 (Thread Context) 之间的独占访问状态互相干扰。即使 ISR 内部没有任何 LDREX/STREX 相关的代码,仅仅“进入异常”这一动作就会破坏 Monitor 的状态。

    2.2 失败执行时序

    Thread Context                             Interrupt Context (ISR)
    --------------                             -----------------------
    LDREX  R1, [SP]
      │ (Monitor Status: Exclusive Access)
      │
      ├─────── 触发中断 (Exception Entry) ─────────┐
      │                                           │ (硬件自动清零 Monitor -> Open Access)
      │                                           │ 执行 ISR...
      │                                           │ 异常返回 (Exception Return)
      │ <─────────────────────────────────────────┘
      │
    STREX  R0, R1, [SP] 
      │ (Monitor 当前处于 Open Access,STREX 必定失败)
      │ (返回状态码 R0 = 1)
      ▼
    CMP    R0, #0
    BNE    m33_cst_loadstore_test6_stack_failed  ==> 触发误判 (False Positive)!
    
    

    3. 修复方案

    在行 115 的 LDREX 之前插入临界区保护(关中断/流水线准备宏 CST_PREPARE_PIPELINE),并在校验完成后恢复中断状态。

    修改前:

        /* Update signature on stack */
        LDREX     R1, [SP]
        ROR       R1, R1, #1
        STREX     R0, R1, [SP]
        CMP       R0, #0
        DSB
        BNE       m33_cst_loadstore_test6_stack_failed
    
    

    修改后:

        /* Update signature on stack */
        CST_PREPARE_PIPELINE       /* Disable interrupts to lock exclusive monitor state */
        LDREX     R1, [SP]
        ROR       R1, R1, #1
        STREX     R0, R1, [SP]
        CST_RESTORE_PIPELINE       /* Restore interrupt mask */
    
        CMP       R0, #0
        DSB
        BNE       m33_cst_loadstore_test6_stack_failed
    
    

    4. 临时修改方案

    • 关闭对应的测试项目
    • 替换 CorTst/asm/tests/m33_cst_loadstore_test6.S 为附件
    1 条回复 最后回复
    0
    • jiankang_wangJ 离线
      jiankang_wangJ 离线
      jiankang_wang YunTu
      写于 最后由 编辑
      #2

      m33_cst_loadstore_test6.S.txt

      1 条回复 最后回复
      0
      • yt0069Y yt0069 从 MCAL BUGS 移动了该主题

    • 云途开发生态介绍

      快速上手云途开发生态

    • 云途论坛规则/Yuntu Forum Rules

      发帖前请查看

    • YT CONFIG TOOL调查问卷

      帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

    • can
      29
      demo
      26
      uds
      14
      lin stack
      13
      fbl
      6
      md14
      6
      yt-link
      6
      adc模块
      4
      Online Users
      EkkoE
      Ekko
      • 登录

      • 登录或注册以进行搜索。
      • 第一个帖子
        最后一个帖子
      0
      • 版块
      • 最新
      • 标签
      • 热门