Skip to content

Commit

Permalink
Merge remote-tracking branch 'github/master' into interrupt
Browse files Browse the repository at this point in the history
  • Loading branch information
supperthomas committed Dec 13, 2023
2 parents 2252e06 + 6476618 commit fa28dea
Show file tree
Hide file tree
Showing 7 changed files with 409 additions and 21 deletions.
32 changes: 32 additions & 0 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details

# Required
version: 2

# Set the OS, Python version and other tools you might need
build:
os: ubuntu-22.04
tools:
python: "3.12"
# You can also specify other tool versions:
# nodejs: "19"
# rust: "1.64"
# golang: "1.19"

# Build documentation in the "docs/" directory with Sphinx
sphinx:
configuration: source/conf.py

# Optionally build your docs in additional formats such as PDF and ePub
# formats:
# - pdf
# - epub

# Optional but recommended, declare the Python requirements required
# to build your documentation
# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
python:
install:
- requirements: source/requirements.txt
24 changes: 5 additions & 19 deletions source/00_supperthomas/15_zephyr/05_Interrupt/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@

zephyr 通过各种手段,将不同平台的中断特性整合到一起,尽量让上层可以使用统一的API进行中断管理。抽象和管理不同架构芯片的中断。



zephyr引入了以下概念

- 多级中断
Expand Down Expand Up @@ -246,7 +244,6 @@ _ _ _ _ _ _ _ (LEVEL 3)
```
static inline unsigned int irq_get_level(unsigned int irq)
{
Expand Down Expand Up @@ -348,8 +345,6 @@ gen_isr_tables.py: IRQ_Pos = 0x51

```
0x1c19
先找到父亲中断0x19 (25)那这个中断在2级中断list2nd[24, 25, 26, 27, 28, 29, 30, 31]里面的偏移是1
Expand Down Expand Up @@ -444,10 +439,6 @@ gen_isr_tables.py: IRQ_Pos = 0x51
### 中断工作转移offload
中断转移是一种zephyr定义的一个非常重要的概念,并没有过多的实现来对接的API,主要意思就是,如果中断中需要处理的事务过多,那么就将该任务的内容卸载到task里面来执行,以快速响应中断和防止阻碍其他中断。通常我们写SDK写多了之后,会发现,中断中要处理的事情过多,或者中断中嵌套函数过多,会导致cache等不能命中,zephyr更多的是建议大家把中断信号发出来,然后通过其他信号量通知到线程来处理,或者`work`来处理。
Expand Down Expand Up @@ -488,7 +479,6 @@ int arch_irq_is_enabled(unsigned int irq)
```
## 如何实现及为何如此实现
### 注册IRQ
Expand Down Expand Up @@ -775,8 +765,6 @@ GTEXT(_isr_wrapper)
#endif /* CONFIG_GEN_ISR_TABLES */
```
###
## 头文件定义
zephyr\include\zephyr\irq.h
Expand Down Expand Up @@ -933,8 +921,6 @@ GDATA(__vector_relay_table)
```
Running TESTSUITE arm_sw_vector_relay

Expand Down Expand Up @@ -971,8 +957,6 @@ PROJECT EXECUTION SUCCESSFUL

```
### arm_interrupt
test_arm_esf_collection
Expand All @@ -981,8 +965,6 @@ test_arm_esf_collection
esf异常内容,出异常当时的上下文。
创建一个线程set_regs_with_known_pattern, 最后一个指令`udf #90` 来触发中断USAGE中断
arch\arm\core\aarch32\cortex_m\fault.c
Expand Down Expand Up @@ -1424,6 +1406,7 @@ zero-latency
在中断A中,中途出发了B中断,那这个中断的时候就先执行 B中断,结束再回到A中断
**这个测项确保低优先级的中断会被高优先级的中断打断**。在zero-latency的时候,
只有在ZERO_LATENCY_LEVELS CONFIG_ZERO_LATENCY_LEVELS
Expand All @@ -1432,6 +1415,7 @@ CONFIG_ZERO_LATENCY_LEVELS 如果大于1 则由参数指定优先级
如果CONFIG_ZERO_LATENCY_LEVELS 等于1 则零中断服务历程有专门的最高优先级。
```

void isr_a_handler(const void *args)
Expand Down Expand Up @@ -1961,6 +1945,7 @@ test_isr_offload_job 这个测试中断offload
offload可以将中断中需要处理时间比较多的,放到线程中去处理。
触发中断4次,
这里要将
Expand Down Expand Up @@ -2148,10 +2133,11 @@ PROJECT EXECUTION SUCCESSFUL
## 参考:
1. [**清风徐来——Zephyr实战篇(6)之中断**](https://www.nxpic.org.cn/module/forum/thread-627933-1-1.html)
2. [Zephyr中断系统-概述](https://mp.weixin.qq.com/s/QQlyDVbf5HgsmuWmwBAiBQ)
3. [Zephyr中断系统-使用](https://mp.weixin.qq.com/s/MqremjpTOF7iuTb4QRweDA)
4. [Zephyr中断系统-实现](https://mp.weixin.qq.com/s/Ekhmx0SY3roGchkVCEtgWw)
5. [zephyr Interrupt](https://docs.zephyrproject.org/latest/kernel/services/interrupts.html)
5. [zephyr Interrupt](https://docs.zephyrproject.org/latest/kernel/services/interrupts.html)
232 changes: 232 additions & 0 deletions source/14_bobwenstudy/02_zephyr_polling/02_auto_pts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
# 概述

蓝牙BLE Host测试需要过认证,传统的方式就是人工打开PTS软件,选择需要认证的case,验证通过就行,这样操作简单直接。

但是PTS测试需要设备配置不同的参数,如配置不同的GATT Service,配对模式等。也就是说跑不同的case,需要根据不同的case写不同的Application,如果这个工作只进行一次还好,但是SPEC一直在演进,协议栈也会一直迭代,认证的流程需要进行多次,继续用人工的方式不仅仅容易出错,工作量还特别大。

PTS本身提供了,auto的支持,可以通过其提供的接口来实现自动完成PTS的认证工作。

![image-20231201171940961](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201171940961.png)



既然是自动的,肯定有一套协议来控制协议栈来做不同的动作,设备端只要实现这套协议即可,就可以实现Auto-PTS测试功能。但是PTS提供的接口是一个COM库 (Component Object Model)的API接口,这些API接口是完成和PTS软件进行交互的,并不适合直接将这些接口转发到设备端,所以就需要一个转换接口,将这些API转化为设备好处理的协议。





# auto-pts开源项目介绍

直接去看官方的文档,将COM API转成设备好处理协议工作量很大,网上有开源的auto-pts项目([GitHub - auto-pts/auto-pts: The Bluetooth PTS automation framework](https://github.com/auto-pts/auto-pts)),里面有BlueZ、Zephyr和Mynewt的实现。

该项目实现了官方COM接口,并提供了BTP(Bluetooth Test Protocol) 协议接口,该接口类似于HCI接口格式,设备可以很好的对这些数据进行处理(相关协议说明在项目的doc目录下,[auto-pts/doc at master · auto-pts/auto-pts · GitHub](https://github.com/auto-pts/auto-pts/tree/master/doc))。

其支持Linux和Windows模式,但是由于PTS只支持Windows模式,如果设备端是Linux环境的话,需要Windows(PTS)+Linux(设备),然后通过RPC接口进行通信。

![image-20231201174028653](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201174028653.png)

![image-20231201174042242](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201174042242.png)

其交互主要包含Command、Response和Event三种数据报文格式。

![image-20231201173255924](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201173255924.png)

每笔包的数据包格式如下说是,Header有5个字节,后面加具体的Payload内容。

![image-20231201173451096](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201173451096.png)

目前Auto-Pts项目支持如下的Service ID,从下图可以看出,目前该项目只支持BLE相关的测试例程,如果是双模设备需要过认证,就得自己参考该项目,将官方的COM API转成新的Service ID的BTP格式(自己实现)。

![image-20231201173642841](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201173642841.png)



# Zephyr_polling工作

如上述沟通,要实现Auto-PTS功能,设备端只需要实现BTP相关协议即可。然后物理接口再在Auto-PTS设计实现,参考已有的BlueZ、Zephyr和Mynewt的实现来做即可。

Zephyr_polling参考的是Zephyr项目,可以先参考官方的文档[AutoPTS on Windows 10 with nRF52 board — Zephyr Project Documentation](https://docs.zephyrproject.org/latest/connectivity/bluetooth/autopts/autopts-win10.html)

Zephyr的Auto-PTS实现在(zephyr/tests/bluetooth/tester/)目录下,支持BTP packets 的收发,用nordic的板子,就可直接用于auto pts 的测试。

Zephyr_polling就是将Zephyr这块代码直接搬过来了。然后通过UART和PC进行BTP交互,Auto-PTS全用github的就行。

相关项目代码已提交:[GitHub - bobwenstudy/RTT_PACKAGE_zephyr_polling: 专用于rtthread package的分支](https://github.com/bobwenstudy/RTT_PACKAGE_zephyr_polling),代码在example/tester目录下,目前还有些bug。



# Artpi运行实现



## 硬件准备

运行Auto-PTS需要2个硬件设备,一个是待测设备(也就是Artpi),一个是PTS Dongle。

### PTS Dongle

[Bluetooth SIG](https://store.bluetooth.com/)

![image-20231201182529547](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201182529547.png)

### ArtPi

另外一个就是Artpi了,官网是:[ART-Pi (gitee.io)](https://art-pi.gitee.io/website/)

![image-20231201182643376](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201182643376.png)









## auto-pts环境安装

1. 首先从 https://github.com/auto-pts/auto-pts 安装工程

2. 安装python依赖

python -m pip install --user wheel
python -m pip install --user -r autoptsserver_requirements.txt
python -m pip install --user -r autoptsclient_requirements.txt





## socat安装

下载网址:[Unix Utils ported to Windows - Browse /socat/1.7.3.2 at SourceForge.net](https://sourceforge.net/projects/unix-utils/files/socat/1.7.3.2/)
Auto-pts 通过socat 进行PC 与IUT 之间的交互。
进入网站下载并解压指定软件压缩包,并将socat.exe 所在目录路径添加至环境变量。

确保`where socat`可以找到。



![image-20231201182245167](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201182245167.png)









## Artpi-Zephyr_polling环境安装

参考该文章,搭建RTT的Artpi环境。[zephyr_polling rtthread移植平台说明_zephyr 移植-CSDN博客](https://blog.csdn.net/wenbo13579/article/details/129755818)

目前代码还有问题,通路通了。直接将tester目录下的代码替换到beacon中,然后运行例程,输入zephyr,启动程序。



![image-20231201181616405](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201181616405.png)

其中Uart1作为和PC的BTP交互通道。

![image-20231201181648362](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201181648362.png)

也就是下图的这两个IO口。

![image-20231201181725776](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201181725776.png)

也就是板子的这个位置。

![image-20231201181821143](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201181821143.png)



这时通过串口工具,就可以和设备进行BTP交互了。

设备刚上电会上报<00 80 FF 00 00>,注意,这里每次case运行的时候都必须上报。不然auto-pts不会继续运行。

测试发送<00 03 ff 01 00 01>,看设备是否能正常回复<00 03 FF 00 00>,这里通了代表硬件和软件代码ready。

![image-20231201181923573](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201181923573.png)







## auto-pts运行

### 启动auto-pts server

将PTS Dongle接入PC,通过sscom确认其串口号。

![image-20231201222013533](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201222013533.png)

而后直接在拉取的auto-pts工程下输入,注意调整串口号,这里是COM14。

```
python autoptsserver.py -S 65000 --dongle COM14
```

看到如下显示就是ok了。

注意,这里因为要运行PTS,所以必须要有Sig账号,如果没登录过,这里会提示登录。

![image-20231201222145343](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201222145343.png)



### 启动auto-pts client

接着就是要启动IUT设备了,这里直接使用Zephyr的工程,因为其本身就是串口,而且串口交互的就是BTP帧格式,只要串口参数配置对了,直接就可以用Zephyr的工程跑了。

接入Artpi,如下图所示,COM12是Debug口,COM13是引出来和Auto-PTS通信的uart1口。

![image-20231201222751846](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201222751846.png)



用RTT的终端接入COM12作为调试口,需要注意,这里暂时别输入zephyr,启动蓝牙。

因为Auto-PTS要求每次运行Case前,需要设备先上报一个Event<00 80 FF 00 00>,该命令是程序一启动就自动上报,且只上报一次。

Zephyr项目通过指定board(-b nrf52)来知道如何该板子是什么,然后通过Jlink下发Reset命令,这里暂时通过手动操作来解决。

![image-20231201222913782](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201222913782.png)



而后就运行Auto-PTS的client脚本。命令如下,COM口选13,因为这里只是为了演示需要,所以以简单的DIS相关例程做演示,<-c DIS>指定。

```
python autoptsclient-zephyr.py zephyr-master -t COM13 -S 65000 -C 65001 -c DIS
```

启动后会看到server终端有HTTPS的提示。

![image-20231201223448905](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201223448905.png)



然后由于没有做硬件reset,所以需要在case启动后,输入zephyr,启动蓝牙,并上报Event<00 80 FF 00 00>。

之后就能看到日志里打印正常进行BTP通信了。

![image-20231201223738784](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201223738784.png)



由于目前还有bug,case都未通过,失败日志可以在auto-pts工程路径下看到。

![image-20231201223925651](https://markdown-1306347444.cos.ap-shanghai.myqcloud.com/img/image-20231201223925651.png)



虽然因为时间仓促,case未运行成功,但是整个通道是打通的,之后按照case要求,解决相关bug即可。





1 change: 1 addition & 0 deletions source/14_bobwenstudy/02_zephyr_polling/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@
:numbered: 2

01_introduce.md
02_auto_pts.md

Loading

0 comments on commit fa28dea

Please sign in to comment.