硬汉嵌入式论坛

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

[有问必答] 总线竞争阻塞,即使优先级设置到最高,也要等待吗?

[复制链接]
回帖奖励 8 个金币 回复本帖可获得 1 个金币奖励! 每人限 1 次

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2025-7-12 22:07:26 | 显示全部楼层 |阅读模式
我最近在学习ethercat从站的时候,遇到一个很奇怪的问题。我想用ethercat控制两个步进电机,这两个步进电机要求速度,位置可调。大概等效于,开环发脉冲,0-48khz的脉冲固定个数输出,不能多和少。为了保险起见,我直接使用一个定时器以一个比较高的频率定时中断,然后软分频,在中断里手动翻转io口电平,并且把改定时器的优先级设置到最高。可是测试结果和我预想的不太一样,频率低的时候,十几khz,都正常,脉冲波形和个数都很好,但是在频率高的的时候,波形就不正常了。看起来似乎是到了改中断翻转io的时候,被什么东西阻止了,等待了一会才翻转,尽管脉冲个数还对,但是过程中的频率变来变去的。最后我不断调试,发现只要把ethercat的SPI通信代码注释掉,不用,频率就正常,一用就不正常。按道理说我这部分SPI的代码中断优先级比定时器的中断优先级低,不应该打乱定时器的输出。最后我试着问AI,AI和我提到了一个信息“总线阻塞”,说是因为我的定时器和ethercat的SPI外设共用的一个总线,ethercat的SPI的通信频率比较高每2ms交互一次数据,每次可能还要分几段才能发完,就导致总线会出现一个频率比较快的阻塞时间片段,该片段内,定时器等外设无法访问总线,要等SPI释放总线后才能操作。所以当我输出脉冲的那个定时器在输出较高频率的脉冲时,就会有更大概率碰到这个阻塞时间,到了该中断翻转电平的时候,由于总线被阻塞,要等待一会。恰恰是因为这个等待,造成了频率处于一个变化不稳定的状态。对于这个大佬们怎么看?总线阻塞了,中断也要等待释放,才能触发,执行中断函数吗?即使优先级设置到最高也没有用吗?这个优先级和总线的关系到底是怎么样的,小弟现在还没有理解透彻,有没有大佬们能指点一下?

外设总线示意图

外设总线示意图

AI的回答

AI的回答

不正常波形

不正常波形
回复

使用道具 举报

0

主题

49

回帖

49

积分

初级会员

积分
49
发表于 2025-7-14 08:52:11 | 显示全部楼层

中断里面软件操作 io 口,软件操作多少会带来抖动,譬如软件里面走不同的 if else 判断所花费的时间不同
且 DMA 会影响 CPU 的运行速度,导致执行 io 翻转有时间上的抖动

我的做法是用 pwm 输出脉冲,同时使用另一个 timer 硬件计数脉冲
软件定时修改 pwm 输出脉冲的频率就可以调整速度了
通过比较另一个 timer 计数就知道当前位置,然后用 PID 让当前位置达到目标位置
我的这种做法不能精准输出指定数量的脉冲,和伺服电机一样,但是很容易改造成闭环控制(计数timer换成编码器即可),
且 PID 会让输出更柔和,梯形速度规划就可以接近 S 规划效果
且我的这种做法很方便使用 fpga 实现多路电机控制
Screenshot_2025-07-14_08-44-32.png
回复

使用道具 举报

5

主题

269

回帖

284

积分

高级会员

积分
284
发表于 2025-7-14 09:20:07 | 显示全部楼层

回帖奖励 +1 个金币

本帖最后由 DX3906 于 2025-7-14 09:21 编辑

我感觉不一定,看你图里圈了dma但是文字描述没说用dma,这东西倒是确实会占用总线,它和内核各自共享一半总线周期,如果dma正在传输大量数据的时候内核想访问同一总线上的外设就会出现延迟
想验证也很简单,先排查下是不是有开关全局中断的操作,特别是spi读写函数前后,如果spi读写时关了全局中断那内核响应io脉冲中断请求就肯定会延后
排除掉全局中断后,调低或者调高ecat的spi频率,看下io脉冲的被影响程度是不是随spi频率变化
还有就是可以用示波器或者逻辑分析仪抓一下pdi_isr、sync0_isr和io脉冲中断函数的进出时间,和io脉冲波形放一起对比下io脉冲变形是不是发生在进了ecat中断后

中断优先级只是调整内核响应某个中断的先后顺序,至于中断内访问了哪些外设中断优先级是管不了的,这种需要调总线访问优先级,但好像只有h7才有
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-7-14 14:28:25 | 显示全部楼层
DX3906 发表于 2025-7-14 09:20
我感觉不一定,看你图里圈了dma但是文字描述没说用dma,这东西倒是确实会占用总线,它和内核各自共享一半总 ...

我现在定时器中断的优先级最高,屏蔽ethercat spi部分,脉冲波形是下面这样子的
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-7-14 14:51:19 | 显示全部楼层
DX3906 发表于 2025-7-14 09:20
我感觉不一定,看你图里圈了dma但是文字描述没说用dma,这东西倒是确实会占用总线,它和内核各自共享一半总 ...

我试着定时器从Tim2换到Tim1,发现是ether cat SPI的IRQ引脚从高被拉低持续了28us,然后再被拉高,再次被拉高后按照我的理解应该是释放总线了,但是此时脉冲的频率反而降下来了,最奇怪的地方来了,可能是是定时器优先级最高的原因,SPI IRQ引脚从高到被拉低的那段时间,脉冲频率反而是对的。这和我想的完全反了
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-7-14 16:36:18 来自手机 | 显示全部楼层
DX3906 发表于 2025-7-14 09:20
我感觉不一定,看你图里圈了dma但是文字描述没说用dma,这东西倒是确实会占用总线,它和内核各自共享一半总 ...

这两个图是加和不加的区别
mmexport1752477971495.png
mmexport1752478172168.png
回复

使用道具 举报

7

主题

158

回帖

179

积分

初级会员

积分
179
发表于 2025-7-15 08:15:31 | 显示全部楼层

回帖奖励 +1 个金币

想简单点就用硬件的PWM 指定个数,软件的模拟如果是最高优先级不可能打断,被打断只有一个可能,这个中断里面你又发了SPI的数据
回复

使用道具 举报

5

主题

269

回帖

284

积分

高级会员

积分
284
发表于 2025-7-15 08:46:34 | 显示全部楼层
Leo_Yao 发表于 2025-7-14 14:51
我试着定时器从Tim2换到Tim1,发现是ether cat SPI的IRQ引脚从高被拉低持续了28us,然后再被拉高,再次被 ...

irq引脚指的是从站控制器芯片输出的中断信号引脚?如果是的话就测错了,要测的是单片机真正执行中断函数的时间
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-7-15 13:37:50 来自手机 | 显示全部楼层
mygod 发表于 2025-7-15 08:15
想简单点就用硬件的PWM 指定个数,软件的模拟如果是最高优先级不可能打断,被打断只有一个可能,这个中断里 ...

是这样的,后来发现是因为ethercat的spi从ethercat ESC芯片里读写每个字节,都要先把全局中断总开关关掉,都写完这个字节再开过来。我用dma的时候,比较明显,可以理解,DMA中断被关掉,导致连在一块,多发,但是用定时器定时中断,IO口翻转,不是很明白,为什么会先频率正常,后频率不正常偏小,指导下次ethercat spi IRQ信号来了,才有回复一点。
mmexport1752557635561.png
mmexport1752557632754.png
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-7-15 13:42:14 来自手机 | 显示全部楼层
DX3906 发表于 2025-7-15 08:46
irq引脚指的是从站控制器芯片输出的中断信号引脚?如果是的话就测错了,要测的是单片机真正执行中断函数 ...

这个IRQ拉低到再次被拉高的时间不是中断执行的时间吗?我后面又发现了可能的问题根源,是哪个ethercat spi读写ESC芯片时候,是while读写每个字节是先关全局中断,再读写字节,最后再开全局中断。看DMA发脉冲,脉冲偏多会连在一块的现象可以解释了,但是定时器定时中断,翻转io的脉冲现象难以解释。他是每次IRQ信号来了,频率正常一下,然后频率偏低。
mmexport1752557635561.png
mmexport1752557632754.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 03:09 , Processed in 0.057469 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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