您尚未登录。

楼主 # 2026-07-25 12:30:35

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,413
积分: 1372.5

勾选micro lib为什么会影响sysTick?

用的复旦微的单片机,读取d18b20温度用到了sysTick的延时函数。
后来加其他功能时勾选了微库,结果d18b20就读不出数来了。用逻辑分析仪观测了下,读18b20的过程明显比之前的程序长了。
一开始以为是其他中断影响了,最后发现是微库的问题。
那么,微库为什么会影响stsTick?

离线

楼主 #1 2026-07-25 13:50:58

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,413
积分: 1372.5

Re: 勾选micro lib为什么会影响sysTick?

https://zhuanlan.zhihu.com/p/1951087973048259773
根据这边文章,M0单片机没有除法器,执行除法需要时间。

/*** @brief us级延时函数(阻塞模式)
* @param count 计数周期
* @note 延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
* @note 该函数为weak函数,用户可选择其他定时器重新定义实现该函数
* @retval 无
*/__weak void std_delayus(uint32_t count)
{
    count = STD_DELAY_US * count;
    count = count > 16777216 ? 16777216 : count;
    SysTick->LOAD = count - 1;
    SysTick->VAL = 0;
    while(!((SysTick->CTRL >> 16) & 0x1));
}
#defineSTD_DELAY_US(SystemCoreClock/1000000)
/**<STD中用于计时的基础值,与计时周期有关*/

但是,我用的单片机,自带库里的延时函数,用到的是右移操作,而不是除法,为什么也会造成不准?

__WEAK void FL_DelayUs(uint32_t count)
{
    count = FL_DELAY_US * count;
    count = count > 16777216 ? 16777216 : count;
    SysTick->LOAD = count - 1;
    SysTick->VAL = 0;
    while(!((SysTick->CTRL >> 16) & 0x1));
}

---------------------------
晕,发现了:

#define FL_DELAY_US                (SystemCoreClock/1000000)

最近编辑记录 Gentlepig (2026-07-25 13:54:15)

离线

#2 2026-07-27 08:33:13

ctspot_1cc92412
会员
注册时间: 2026-07-27
已发帖子: 1
积分: 1

Re: 勾选micro lib为什么会影响sysTick?

用perf_counter就可以解决问题了

离线

楼主 #3 2026-07-27 09:58:57

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,413
积分: 1372.5

Re: 勾选micro lib为什么会影响sysTick?

最后定位到是SystemCoreClock/1000000 这个除法运算导致的,使用微库后会让除法运算执行的更慢。

上面提到MicroLIB虽然减少code size,但是有些函数会执行的更慢,这次遇到的问题恰恰就对应这一条。这其实对应的用时间换空间的概念,对于某些运算,>MicroLIB执行时间变长了,换回的好处是空间占用更小。实际使用中需要在空间和时间上做一定的取舍。

ARM Cortex-M0+没有硬件除法器,除法是相对复杂的操作,相比加法、减法和乘法,需要更多的CPU周期才能完成。

没明白,为什么使用微库会增加除法运算的时间。
之所以使用微库,就是为了使用printf重定向串口这个功能。貌似不勾选微库,体积更小吧?

离线

#4 2026-07-27 18:17:51

aozima
会员
所在地: 深圳
注册时间: 2019-05-25
已发帖子: 488
积分: 335.5
个人网站

Re: 勾选micro lib为什么会影响sysTick?

你的芯片内核是否M0?

如果是的话,那2楼的分析就很合理了。
因为MCU没有除法指令,那么这个除法指令就由编译提前编译好的*libc来提供,一般不是由编译器现场提供。
那么这时不同的libc的实现就有所不同,性能和资源占用也各不相同。

可以调试时单步跟进去看下使用不同库生成的除法操作,实际有多少条指令,以及用了多少时间。

最近编辑记录 aozima (2026-07-27 18:34:31)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn


东莞哇酷科技有限公司开发