Files
kunlun/dtest/dtest3/kl3_spinlock_test
2024-09-28 14:24:04 +08:00
..
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00

spinlock测试说明文档

spinlock简介

自旋锁spinlock是为了实现保护共享资源而设计的一个IP实现了在任何时刻某个共享资源只能被一个master访问。

在自旋锁机制中某个master要访问某个共享资源时首先查询该共享资源是否被其他的master访问即是否已经被其他的master锁住如果没有则该master先对该共享资源上锁然后在执行对共享资源的操作在访问结束之后主动释放锁。如果已经被其他的master锁住则一直查询该贡献资源是否已经被其他master释放。

在kl3中自旋锁的本质是一个32bit的寄存器一共16个自旋锁即最多定义16个共享资源每个自旋锁的每个bit对应一个master这些寄存器具有如下特性

  • 存在保护寄存器通过写入magic number到指定的寄存器来解除保护仅在解除保护的情况下才能写自旋锁对应的寄存器。

  • 在自旋锁寄存器已经有bit被置1的情况下无法再对其他的bit进行置1操作此时必须将所有已经置1的bit清除之后才能重新置位其他的bit。

spinlock测试例程说明

spinlock测试例程使用到的外设包含spinlock、uart、gp_timer。

  • spinlock测试对象用于测试spinlock对贡献资源的保护功能。
  • uart使用uart0实现调试信息打印接收case配置信息等与PC的交互功能。
  • gp_timer用于定时。

spinlock测试例程遵循自动化测试框架在例程执行之后初始化串口0通过串口发送“start”字段到PC并等待PC发送“config”字段来获取本次需要执行的测试case。

在获取到case组合之后初始化spinlock并根据case组合开始执行测试case。

case0共享资源保护测试

spinlock功能比较单一因此测试例程比较简单仅以ram中的一个地址作为共享资源事实上这里的串口也是共享资源3个核同时对该地址进行读写操作观察数据是否正确以及core是否一直等待spinlock。具体步骤如下

  1. 上电后初始化外设并将ram指定地址的数据清零。

  2. 引导core1、core2运行测试代码并记录此时gp_timer的计数值

    core1、core2测试代码一致都是运行之后马上申请spinlock在拿到锁之后对ram地址进行读写操作每次在原有数据的基础上加1每次读写操作延时100ms在执行100次读写后释放spinlock并将core挂起。

    为了保证core0最后执行core0在启动core1、core2之后延时一段时间这段时间比core1、core2执行的总时长要更短

  3. core0申请spinlock在拿到锁之后读取gp_timer的时间并判断执行时间与core1、core2延时总时长差距是否过大同时判断ram中的数据是否为其他core累加的值。如果任意条件不满足则判定失败。

测试结果符合预期。core1、core2顺序执行先后顺序不一定core会一直等待spinlock并能正确的保护资源。