数码之家

 找回密码
 立即注册
搜索
查看: 3640|回复: 11

[STM] IO输出速度跟不上内核,那内核会怎么办,先跑还是干等

[复制链接]
发表于 2020-11-13 13:55:57 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 南天音乐 于 2020-11-13 13:57 编辑

如题,我们都知道STM32F103的内核时钟有72M,但IO却不可能达到一样的速度进行输出。如要控制一个IO输出,以寄存器操作为例,控制PC2输出高电平
GPIOC->BSRR=(u16)0x0004;
这条语句编译为汇编时可能就2条指令,应该在几个指令周期就执行完了,内核执行完这些指令之后,是不管IO口是否输出了想要的电平继续往下执行其它指令,还是在等待IO输出到想要的电平才继续往下执行?
目前来看,应该是会等待的,但从汇编指令上来是看不出的,应该是硬件完成的。具体等待多长时间,是否与配置GPIO的输出速度有关联呢,这个没测试过,手册貌似也没找到相应的说明。
可以确定的是,程序没事不要总去设置GPIO,即使是输出相同的状态,尽量能用变量就用变量,想想我之前有贪图方便直接类似如下直接操作GPIO
while(1)
{
        ....
        if(a)
        {
                GPIOC->BSRR=(u16)0x0004;
        }
        else
        {
                GPIOC->BRR=(u16)0x0004;
        }
        ....
}
其实无形之中已经等效为
while(1)
{
        ....
        if(a)
        {
                GPIO_Out_1;
                Delay(0xffffff);//夸张的延时
        }
        else
        {
                GPIO_Out_0;
                Delay(0xffffff);
        }
        ....
}
触目惊心的延时直接拖慢了系统的整体运行。可能普通应用每什么关系,可对于要实时信号处理的来说,这就要命了。
以上仅为个人观点,有啥不正确的地方欢迎指教。

打赏

参与人数 1家元 +20 收起 理由
家睦 + 20

查看全部打赏

发表于 2020-11-13 17:25:59 | 显示全部楼层
不敢苟同。没有说清楚是怎么判断内核是停在那里了。个人认为,内核改写完寄存器的值就算完事了,后续电平的输出应该是硬件逻辑部分处理的。

打赏

参与人数 1家元 +6 收起 理由
家睦 + 6

查看全部打赏

回复 支持 2 反对 0

使用道具 举报

发表于 2020-11-13 17:49:56 | 显示全部楼层
非专业人士,个人理解:
1、内核会一直执行指令,不会等待外设反馈。否则外设故障整个内核宕机?
2、GPIO输出速度取决于输出驱动电路,属于独立的硬件与内核无关。内核只是给对应寄存器传递数据,寄存器被改变后,触发相应驱动电路,从而修改IO状态。
3、"能用变量就用变量" 不对,操作变量的本质还是操作GPIO寄存器。

打赏

参与人数 1家元 +10 收起 理由
家睦 + 10

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2020-11-14 15:08:47 | 显示全部楼层
内核操作的只是相应地址上的寄存器(内存)中的数据,读也是这样的
回复 支持 1 反对 0

使用道具 举报

发表于 2020-11-14 17:11:24 | 显示全部楼层
CPU不会等待IO的,设置完IO的控制寄存器后,CPU就往后执行了.
回复 支持 2 反对 0

使用道具 举报

发表于 2020-11-15 12:14:24 | 显示全部楼层
等个屁,内核只会完成操作后接着下一条指令处理,而且其实内核想等也等不了,因为GPIO控制器也不知道电平什么时候会转换和建立。
是的,内核通过数据总线访问GPIO控制器,修改某个GPIO状态,GPIO控制器也只是把控制信号向下一级传输,后面还有N多逻辑门最后再到输出的MOSFET,最后啥时候IO状态能真正改变,精确时间没人知道,所以一般为了保证准确转换再进行下一步操作,你可以加几条NOP等待。
这事我就经历过,一个按键扫描程序,单步调试运行良好,一退出调试模式全速执行就不停地乱跳,搞了半天发现是内核速度远高于GPIO速度,结果只能在改变GPIO后加一点延时才解决。所以内核不能等GPIO,也没法等。
回复 支持 反对

使用道具 举报

发表于 2020-11-15 12:20:16 | 显示全部楼层
la45088d1 发表于 2020-11-15 12:14
等个屁,内核只会完成操作后接着下一条指令处理,而且其实内核想等也等不了,因为GPIO控制器也不知道电平什 ...

你的想法是错误的,没有任何硬件机制能够强制内核去等待GPIO的电平变化,除非你在软件部分做处理,写个条件循环,等到GPIO的电平回读值跟预设值一致后再执行下一步,否则不可能实现内存等GPIO这种荒唐的结果。在某些时序严谨的场合你可以试试,不过由于GPIO响应可以在几个周期内完成,所以根据设定的转换速度,适当加几条NOP就足够了。
我STM32都是直接用ASM操作寄存器,我对Cortex-M3的内核和STM32的结构本身还是比较了解的,据我所知,不存在这种奇怪的机制,也没有必要存在这种机制。
回复 支持 反对

使用道具 举报

发表于 2020-11-16 10:04:53 | 显示全部楼层
楼主说:“目前来看,应该是会等待的”,这个是怎么判断的?没看到楼主给具体的说明。
回复 支持 反对

使用道具 举报

发表于 2020-11-16 16:48:22 | 显示全部楼层
本帖最后由 jcdzxh 于 2020-11-16 16:50 编辑

楼主真心对这个有兴趣,得用汇编测试......
结论是IO可以响应过来,2T
ldr r0,=0x40010800
ldr r1,=0x100
str r1,[r0,#0x10]
str r1,[r0,#0x14]

str r1,[r0,#0x10]
str r1,[r0,#0x14]

str r1,[r0,#0x10]
str r1,[r0,#0x14]

str r1,[r0,#0x10]
str r1,[r0,#0x14]

str r1,[r0,#0x10]
str r1,[r0,#0x14]

...........
跑跑看,抓PA8波形
回复 支持 反对

使用道具 举报

发表于 2020-11-16 20:50:28 | 显示全部楼层
jcdzxh 发表于 2020-11-16 16:48
楼主真心对这个有兴趣,得用汇编测试......
结论是IO可以响应过来,2T
ldr r0,=0x40010800

STM32F1系列我看过50MHz速度下,上升沿和下降沿大概可以在10ns多一点完成,所以不停反转在72MHz时钟下是可以做到的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-17 21:14:26 | 显示全部楼层
上面的大神们是对的,我的观点确实是错误的。我提这个问题,是受网上几个试验结论误导了,这些问题包括:
1.STM32F103 IO翻转最大速度问题
2.FSMC刷屏比用IO模拟刷屏快?
3.用直接操作寄存器方式驱动IO输出TFT时序,时钟不加延时,TFT也能正确响应。(与第一点结论矛盾)
4.帖子“发现 STM32 纯刷屏还是挺给力的,速度达到85每秒”。感觉这个刷屏速度不应该这么低。
实践出真知,草率了。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-2 22:04 , Processed in 0.156000 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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