硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1442|回复: 17
收起左侧

[RTOS] 为什么spi通信在FreeRTOS里面会变慢?

[复制链接]

10

主题

34

回帖

64

积分

初级会员

积分
64
发表于 2022-11-27 17:47:52 | 显示全部楼层 |阅读模式
最近把项目移植到FreeRTOS上面,发现spi通信的部分在FreeRTOS耗时要比逻辑多一倍多,要14ms:
image.png
然而在裸机的时候只需要8ms(忘记拍照),而且经过计算,8ms才是合理的传输速度,因为每次传输20480*8=163840bit,而spi速度是20Mbit/s,所以算起来就是8ms左右;

下面是程序,因为是通过外部中断来触发spi读写,而且spi不能被打断,所以我干脆直接放在中断处理函数里面了:
image.png
裸机或是FreeRTOS都是放在这个位置,时间测量是通过示波器测PD3引脚电平高低来获得的(就是夹住spi传输的那两行)

为什么他们传输的时间会不一样呢?
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2022-11-28 08:16:33 | 显示全部楼层
被系统中断打断了?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2022-11-28 09:17:17 | 显示全部楼层
这种的显然你的程序设计有问题,直接SPI DMA。
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-28 10:28:59 | 显示全部楼层
yklstudent 发表于 2022-11-28 08:16
被系统中断打断了?

image.png
中断设置是这样的,一开始我也想过会不会在中断里面也发生了任务切换导致变慢了,但是后来加上了临界区保护也还是花这么长时间。

外部中断的优先级我设为了FreeRTOS里面最高的5,保证它能够及时获取处理,紧接着就是SPI相关的中断设为6,USB写入数据的设为7,串口为8.
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-28 10:29:57 | 显示全部楼层
eric2013 发表于 2022-11-28 09:17
这种的显然你的程序设计有问题,直接SPI DMA。

SPI DMA试过了,可能因为是硬件问题,总是不能稳定传输,用逻辑分析仪看过波形,经常MISO传到一半突然就没东西过来了,所以现在只能用轮询的方式
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-28 10:33:44 | 显示全部楼层
eric2013 发表于 2022-11-28 09:17
这种的显然你的程序设计有问题,直接SPI DMA。

另外发现不止是SPI这部分变慢了,连往U盘写入数据都变慢了,本来一秒内能完成的事,现在是2秒多快3秒才能完成
回复

使用道具 举报

75

主题

684

回帖

909

积分

金牌会员

积分
909
发表于 2022-11-28 10:43:44 | 显示全部楼层
最好确认下移植过程和移植完成之后时钟有没有被修改过。
回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2022-11-28 11:13:47 | 显示全部楼层
还是不要在中断里搞事。搞个信号量或者消息队列,把事件的处理丢到线程里,可以适当把线程优先级调高点保证实时性
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-28 11:46:11 | 显示全部楼层
庄永 发表于 2022-11-28 10:43
最好确认下移植过程和移植完成之后时钟有没有被修改过。

systick吗?因为是在cubemx里面配置的,所以根据提示timebase选了tim1。
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-28 11:46:33 | 显示全部楼层
tovinz 发表于 2022-11-28 11:13
还是不要在中断里搞事。搞个信号量或者消息队列,把事件的处理丢到线程里,可以适当把线程优先级调高点保证 ...

尝试了,也是一样的情况
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-28 11:49:00 | 显示全部楼层
另外还发现了一个问题,即使用了临界区代码或是挂起任务调度器,仍然发现SPI时钟每1毫秒就被打断一次(用逻辑分析仪观察的) image.png
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-28 12:06:00 | 显示全部楼层
用逻辑分析仪观察了一下裸机和FreeRTOS的spi时序差别,发现裸机时发送byte与byte之间的间隔是115us,而FreeRTOS上面的是275us image.png
回复

使用道具 举报

75

主题

684

回帖

909

积分

金牌会员

积分
909
发表于 2022-11-28 12:29:58 | 显示全部楼层
852050675 发表于 2022-11-28 11:49
另外还发现了一个问题,即使用了临界区代码或是挂起任务调度器,仍然发现SPI时钟每1毫秒就被打断一次(用逻 ...

那就写数据的时候关SYSTICK中断
回复

使用道具 举报

210

主题

1042

回帖

1682

积分

至尊会员

More we do, more we can do.

积分
1682
发表于 2022-11-28 13:19:55 | 显示全部楼层
本帖最后由 emwin 于 2022-11-28 13:31 编辑

通篇看了楼主的描述:
1. 中断优先级EXTI和SPI2都是很高的,不受系统时基影响;
2. 字节发送空闲由115ns->275ns,对整体影响不大。

我猜测是MCU或SPI频率下降了,跟FreeRTOS关系不大。

(编辑原因,楼主把ns写成了us,误导了我)
回复

使用道具 举报

44

主题

562

回帖

699

积分

金牌会员

积分
699
发表于 2022-11-28 14:10:26 | 显示全部楼层
裸机和操作系统还是有一定差异的,SPI还是推进用 SPI+DMA 方式在系统中运行,数据读取在任务中进行
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-28 14:33:04 | 显示全部楼层
emwin 发表于 2022-11-28 13:19
通篇看了楼主的描述:
1. 中断优先级EXTI和SPI2都是很高的,不受系统时基影响;
2. 字节发送空闲由115ns- ...

不好意思,是我笔误把ns写成了us了。

MCU时钟没有修改过,是400M的。我现在想的是会不会由于timebase source从裸机的systick400M,改成了Tim1的200M导致的?

(tim1的时钟应该是和APB1的时钟一样的吧?)
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2022-11-28 14:50:11 | 显示全部楼层
ou513 发表于 2022-11-28 14:10
裸机和操作系统还是有一定差异的,SPI还是推进用 SPI+DMA 方式在系统中运行,数据读取在任务中进行

DMA有尝试过,但是不知道因为什么问题,总是传了一些数据之后就停了,还不知道是什么原因导致的
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2022-12-27 14:39:46 | 显示全部楼层
852050675 发表于 2022-11-28 14:50
DMA有尝试过,但是不知道因为什么问题,总是传了一些数据之后就停了,还不知道是什么原因导致的

使能DMA的FIFO试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 09:09 , Processed in 0.239588 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表