本帖最后由 airwill 于 2024-1-31 22:33 编辑
关注 RISC V 处理器已经很久了, 由于内核的复杂性, 一直没有能决心试试. 这次非常高兴能有幸体验这款搭载 玄铁 E906 国产内核的处理器. 非常兴奋.早早就寻找和查阅了处理器手册和内核资料.
期待了好久, 终于收到了快递,
打开包装, 开发板+仿真器外加一条数据线, 靓照来一个
迫不及待地上电看看, 出厂代码的运行情况.
哎呀, 开发板虽然引脚都引出来了, 但是没有留可以玩的外设, 连个IO 指示灯都没有.
鉴于 RISC V 处理器内核比大致同等的 ARM M4 有更多的 CPU 寄存器, 在应付复制计算时, 能减少内存访问, 提高效能. 想看看这款 APT32F1732 的性能. 为此从熟悉的手头一个电机控制算法库里拉初一段程序, 找手头另外一块 ARM M4 内核的国民 N32G455 开发板做个对比.
APT32F173 开发工具安装, 从官网 http://www.aptchip.com 下载集成开发环境, CDK_V2.14.0.
安装后打开例程, 发现与 ARM 的开发环境挺接近, 用起来没有太多陌生感.但是当下载程序调试的时候
却怎么也不成功. CDK提示仿真器没有和PC连接, 费了很多时间没有解决问题.
意外地在一个说明文档看到说要 CDK_V2.20 版以上才能连接仿真器. 网上一通搜啊, 终于在平头哥的网站上找到了 CDK_V2.22 版, 安装后果然与仿真器连接上了... 相信测评的朋友都在 IDE 上浪费了时间吧, 官网既然知道要新版本, 为何没有提供新版本的连接呢?
在性能测试之前, 先要熟悉下芯片资源, 得先调个时间基准出来, 验证时钟速度.
对于 M4 最简单的 Systick 做时间对比最为合适, 为了降低中断开销的影响, 我让 M4的 Systick 定时跑最大 24 位计数 (16777216), 但是 E906 内核没有看到类似的定时器, 不过定时器资源倒是挺丰富的. 查了各个定时器外设, 感觉 BT 是个非常简单的定时器外设, 初步考虑通过256分频后, 用足16位的65535计数可以实现和 M4 的 Systick 类似的功能, 接下来先试验下跑马灯来验证 CPU 时钟. 对于熟悉 STM32 的人来说, APT32F1732的外设寄存器都有似曾相识的感觉, 所以看用户手册不费劲, 不过外设库函数不大习惯, 但大都可以从 user_demo.c 里去找类似函数.
为了避免中断开销影响性能评分, 考虑通过读定时器中断状态寄存器判断定时器溢出, 调试发现不能实现, 只得打开中断. 为此改了一下, 采用 65536分频, 再设置 65535 为周期, 这样不会轻易中断, 避免中断开销的影响. 通过读计数值, 检查高8位的变化来判断 24 位计数溢出情况作为测试时基, 看看开发环境
开发板没有可控的指示灯, 为此特意淘来一块带8路指示灯的灯板. 通过 IO 口寄存器累加来计时, 看指示灯的闪烁速度大致能判断时钟是否准确. 看下安装了跑马灯的测试版
接下来进行电机算法运行时间测试, 目前我一直在用的是浮点库. 正好 E906 也有浮点单元, 测试代码来着 TI 官方代码库里的一段 FOC 代码, 主要包括电流坐标变换的算法和闭环控制. 通过移植, 修改各种外设寄存器地址修改完, 在 ARM-M4编译通过调试. 但再移植到 CDK, 发现编译错误, 连接不到 fmaxf, fminf, sinf cosf 等函数, 前两个是比较大小的函数, 倒是好解决, 写个 if else 能解决. 但是三角函数却没有办法不用. 发了官网支持邮件求助一下.
再找手册和例程里各函数和文件, 看看有没有解决办法.
例程用的不是标准库, 而是另带的 libcsi_xt900p32f_dsp.a 文件, 于是想到去找找有没有相关的头文件, dsp文件夹里找到 csi_math.h 有 void csi_sin_cos_f32() 函数, 想必是用来三角函数的, 放到测试代码中. 执行到这个函数死锁... 没有能调试进去看里面的二进制指令.
时间不多了, 先总结一下, 待有进一步测试后更新吧.
|