• Hexagon_V65_Programmers_Reference_Manual(29)


    11.9.3.9 指令同步

    ISYNC 确保所有先前的指令都已提交,然后再继续执行下一条指令。
    该指令应在以下事件之后执行(当后续指令必须观察事件的结果时):

    • 使用 TLBW 指令修改 TLB 后
    • 修改SSR寄存器后
    • 修改 SYSCFG 寄存器后
    • 在任何指令缓存维护操作之后
    • 修改 TID 寄存器后

    在这里插入图片描述

    Class: SYSTEM (slot 2)

    注意:
    这是一个单独的指令。  它不能与数据包中的其他指令组合在一起。
    
    • 1
    • 2

    编码
    在这里插入图片描述

    11.9.3.10 L2 缓存预取

    L2FETCH 启动后台预取到 L2 缓存。

    Rs 指定 32 位虚拟起始地址。 该指令有两种形式。

    在第一种形式中,要预取的区域的维度在源寄存器 Rt 中编码如下:

    • Rt[15:8] = 获取块的宽度(以字节为单位)。
    • Rt[7:0] = Height:要获取的宽度大小的块的数量。
    • Rt[31:16] = Stride:一个无符号字节偏移量,用于在获取每个宽度大小的块后递增指针。

    在第二种形式中,操作数在寄存器对 Rtt 中编码如下:

    • Rtt[31:16] = 获取块的宽度(以字节为单位)。
    • Rtt[15:0] = 高度:要获取的宽度大小的块的数量。
    • Rtt[47:32] = Stride:一个无符号字节偏移量,用于在获取每个宽度大小的块后递增指针。
      * Rtt[48] = 方向。 如果清除,则应以行主要形式执行预取,这意味着应在继续下一行之前获取一行中的所有缓存行。 如果设置了该位,则应以列主要形式进行预取,这意味着在继续下一列之前提取列中的所有缓存行。

    下图显示了使用 L2FETCH 指令的两个示例。
    在这里插入图片描述

    在框预取中,在较大的帧内定义了一个二维内存范围。 第二个示例显示了对大小为 Lines * 128 的大型线性内存区域进行预取。

    L2FETCH 是非阻塞的。 指令启动后,程序将继续执行下一条指令,同时在后台执行预取。 L2fetch 可用于将代码或数据引入 L2 缓存。 如果感兴趣的行已经在 L2 中,则不执行任何操作。 如果 L2$ 中缺少这些行,硬件会尝试从系统内存中获取它们。

    硬件预取引擎继续请求已编程内存范围内的所有行。 预取硬件尽最大努力预取所请求的数据,并尝试以低于需求取指的优先级执行预取。 这可以防止预取在系统负载过重时增加流量。

    如果程序启动新的 L2FETCH 而旧的 L2FETCH 操作仍处于挂起状态,则新请求将排队,最多为三个深度。 如果 3 个 L2FETCH 已经挂起,则最旧的请求将被丢弃。 在线程的 L2 预取活动期间,USR:PFA 状态位被设置以指示预取正在进行中。 程序员可以使用该位来决定是否在前一个 L2FETCH 完成之前启动新的 L2FETCH。

    使用编程为零的任何子字段执行 L2fetch 会取消调用线程的所有未决预取。

    该实现可以在需要时自由删除预取。

    在这里插入图片描述

    Class: SYSTEM (slot 2)

    注意:
    该指令只能与 ALU32 或非浮点 XTYPE 指令组合。
    
    • 1
    • 2

    编码

    11.9.3.11 暂停

    PAUSE 指令将执行暂停一段指定的时间。

    在暂停期间,程序进入低功耗状态,不获取和执行指令。 该指令提供了一个短立即数来指示暂停持续时间。 程序最多暂停立即数加 8 中指定的周期数。最小暂停为 0 个周期,最大暂停由实现定义。

    程序中断退出暂停状态。

    系统事件(例如硬件或 DMA 完成)可以触发退出暂停模式。

    一个实现可以自由暂停短于 (immediate+8) 的持续时间,但不能更长。

    该指令对于实现用户级低功耗同步操作很有用,例如自旋锁或等待事件信号。

    在这里插入图片描述

    Class: SYSTEM (slot 2)

    注意:
    这是一个单独的指令。  它不能与数据包中的其他指令组合在一起。
    
    • 1
    • 2

    编码
    在这里插入图片描述

    11.9.3.12 内存线程同步

    SYNCHT 指令同步内存。

    所有未完成的内存操作,包括缓存和非缓存加载和存储,都在处理器继续执行下一条指令之前完成。 这确保了某些内存操作以所需的顺序执行(例如,在访问 I/O 设备时)。

    执行 SYNCHT 操作后,处理器停止从程序中获取和执行指令,直到该程序的所有未完成的内存操作完成。

    在多线程或多核环境中,SYNCHT 不关心其他执行上下文。

    该指令的使用取决于系统。
    在这里插入图片描述

    Class: SYSTEM (slots 0)

    注意:
    这是一个单独的指令。  它不能与数据包中的其他指令组合在一起。
    
    • 1
    • 2

    编码
    在这里插入图片描述

    11.9.3.13 将值发送到 ETM 跟踪

    TRACE 获取寄存器 Rs 的值并将其发送到 ETM 跟踪。

    必须启用 ETM 块,并且线程必须具有执行跟踪的权限。 Rs 的内容是用户定义的。

    在这里插入图片描述

    Class: SYSTEM (slot 3)

    注意:
    该指令只能与 ALU32 或非浮点 XTYPE 指令组合。
    
    • 1
    • 2

    编码

    在这里插入图片描述

    11.9.3.14 Trap

    TRAP 导致精确异常。

    执行 TRAP 指令会将 SSR 中的 EX 位设置为 1,从而禁用中断并启用超级用户模式。 然后程序跳转到向量位置(TRAP0 或 TRAP1)。 该指令指定一个 8 位立即数字段。 该字段被复制到系统状态寄存器原因字段中。

    从带有 RTE 的服务程序返回后,在 TRAP 指令之后的数据包处继续执行。

    这些指令通常用于用户代码从操作系统请求服务。 提供了两个 TRAP 指令,因此操作系统可以针对快速服务程序和较慢服务程序进行优化。

    在这里插入图片描述

    Class: SYSTEM (slot 3)

    注意:
    这是一个单独的指令。  它不能与数据包中的其他指令组合在一起。
    
    • 1
    • 2

    编码
    在这里插入图片描述
    在这里插入图片描述

    11.9.3.15 将线程转换为等待模式

    WAIT 使调用线程进入等待模式。

    等待模式是线程空闲的低功耗模式。 线程在等待模式下不获取或执行指令。

    当线程执行 WAIT 时,PC 被设置为 WAIT 指令之后的数据包。

    要退出等待模式,等待线程可以接收中断,或者另一个线程可以为等待线程执行 RESUME 指令。 在线程被中断唤醒的情况下,在中断服务程序完成并执行 RTE 指令时,线程保持运行。

    请注意,指令中未使用源寄存器 Rs。 它的存在是为了向后兼容。

    在这里插入图片描述

    Class: SYSTEM (slot 3)

    注意:
    这是一个单独的指令。  它不能与数据包中的其他指令组合在一起。
    
    • 1
    • 2

    编码
    在这里插入图片描述

  • 相关阅读:
    7Z压缩支持加密
    解决Kettle在Maven仓库中找不到的办法
    【Node.js实战】一文带你开发博客项目(API 对接 MySQL)
    【ECMAScript6】迭代器与生成器
    gorm-增删改查
    中国之声广播在线收听,云听“正直播”在路上
    AD20软件学习
    软件流程和管理(八):Ethics
    vivado FFT IP仿真(1)FFT基本知识
    app毕业设计开题报告-基于Uniapp实现的移动端的医生挂号就诊平台
  • 原文地址:https://blog.csdn.net/weixin_38498942/article/details/126402562