历史上的今天
返回首页

历史上的今天

今天是:2025年01月21日(星期二)

正在发生

2021年01月21日 | STM32Cube LL能高效的原因

2021-01-21 来源:eefocus

1写在前面

有些应用要求MCU能高效处理,特别是跑一些算法时,对CPU执行效率这一块有要求。


网上有很多文章说STM32Cube HAL执行效率不高,代码量大等问题,导致很多没入门,或初学的朋友产生各种各样的疑惑。


承认,HAL相对来说有这些问题,那么与之对应的STM32Cube LL恰好避免了这样的问题。


2LL能高效的原因

简单总结一下原因:巧妙运用C语言静态的,内联函数直接操作寄存器。


当然,这是其中重要的原因,还有一些其它原因,这里不描述。


你会在LL库.h文件中发现大量类似,静态,内联函数直接读写寄存器的函数。


比如:读写IO口


__STATIC_INLINE uint32_t LL_GPIO_ReadOutputPort(GPIO_TypeDef *GPIOx)

{

  return (uint32_t)(READ_REG(GPIOx->ODR));

}


__STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)

{

  WRITE_REG(GPIOx->BSRR, (PinMask >> GPIO_PIN_MASK_POS) & 0x0000FFFFU);

}


其中__STATIC_INLINE,就是静态、内联:


#define __STATIC_INLINE  static __inline


而读写位的定义:

图片


这里面的红定义,在众多外设.h中都在调用。比如使能USART:


LL使能USART:


__STATIC_INLINE void LL_USART_Enable(USART_TypeDef *USARTx)

{

  SET_BIT(USARTx->CR1, USART_CR1_UE);

}



标准外设库使能USART:


void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_USART_ALL_PERIPH(USARTx));

  assert_param(IS_FUNCTIONAL_STATE(NewState));

  

  if (NewState != DISABLE)

  {

    /* Enable the selected USART by setting the UE bit in the CR1 register */

    USARTx->CR1 |= USART_CR1_UE;

  }

  else

  {

    /* Disable the selected USART by clearing the UE bit in the CR1 register */

    USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_UE);

  }

}


你会明显发现:LL库的执行效率更高。


3拓展:内联函数

写到这里,就顺便复习一下内联函数。


内联函数是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展。
---来自百度百科


通常,程序执行时,处理器从内存中读取代码执行。当程序中调用一个函数时,程序跳到存储器中保存函数的位置,开始读取代码执行,执行完后再返回。


为了提高速度,C语言定义了inline函数,告诉编译器把函数代码在编译时直接拷贝到程序中,这样就不用执行时另外读取函数代码。


提示:

当内联函数很大时,会有相反的作用,因此一般比较小的函数才使用内联函数。



4拓展:软件框架思维

LL之所以高效,是因为它巧妙运用了一些C语言知识,没有太多封装,直接或间接对寄存器进行操作。


而能这样实现,归功于ST开发团队设计了这么一个中间层软件框架。


对于有大型项目开发经验的人来说,一个项目的框架对整个项目影响很大。


就好比你建一栋楼,如果楼层框架都没造好,你觉得这栋楼质量会好吗?


所以,这里就提到,我们编程时,特别项目较大,需要考虑一下软件框架,一个好的框架能让你你的项目达到事半功倍的效果。


推荐阅读

史海拾趣

Baumer Electric Ag公司的发展小趣事

Baumer Electric Ag公司创立于1952年,初期主要专注于微动开关的生产。面对市场竞争的激烈,公司创始人Herbert Baumer凭借其敏锐的市场洞察力和坚定的决心,带领团队不断研发新产品,提升技术水平。1960年,公司成功推出首个程序控制系列,标志着Baumer在电控生产流程监控和控制领域取得了重要突破。

DBM Optix公司的发展小趣事

在发展过程中,DBM Optix也面临过不少挑战和危机。例如,某次全球供应链紧张导致公司原材料供应受到影响,生产进度一度受阻。面对这一挑战,DBM Optix迅速调整采购策略,积极寻找新的供应商,并加强与现有供应商的合作。同时,公司还加强了内部管理,优化生产流程,提高生产效率。这些努力使得DBM Optix成功度过了危机,并继续保持良好的发展势头。

Cypress Industries公司的发展小趣事

2020年,Cypress迎来了其发展历程中的一个重要时刻——与德国半导体巨头英飞凌(Infineon)的合并。这次合并使Cypress成为英飞凌的一部分,双方在技术、市场和资源等方面实现了互补和整合。这次合并不仅增强了Cypress在全球半导体市场的竞争力,也为其未来的发展提供了更广阔的空间。

以上故事均基于Cypress Semiconductor(赛普拉斯半导体)的发展历史而创作,旨在客观描述公司在电子行业中的发展历程和成就。

Daco Semiconductor Co Ltd公司的发展小趣事

随着技术的不断成熟,Daco开始积极寻求市场拓展。公司首先与几家知名的电子设备制造商建立了合作关系,为其提供定制的半导体解决方案。同时,Daco也积极参与国际半导体展览和交流活动,与全球的行业同仁建立了广泛的联系。通过不断的市场拓展和战略合作,Daco的产品逐渐进入了全球市场,公司的知名度和影响力也得到了显著提升。

ENPIRION公司的发展小趣事

在电源管理领域,ENPIRION公司不断面临各种技术挑战。例如,如何满足企业级、工业级、通信等市场对产品的高可靠性要求?如何提供最优的电源转换率以降低成本和散热?为了应对这些挑战,ENPIRION公司不断投入研发力量,推出了一系列创新的电源管理解决方案。这些解决方案不仅满足了市场的需求,还进一步巩固了ENPIRION公司在电源管理领域的领先地位。

Bellin Dynamic Systems公司的发展小趣事

在追求经济效益的同时,Bellin Dynamic Systems也积极履行社会责任,致力于可持续发展。公司注重环保和节能技术的研发和应用,努力降低生产过程中的能耗和排放。此外,公司还积极参与社会公益事业,通过捐款、资助等方式回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

以上是我为您模拟构建的关于Bellin Dynamic Systems在电子行业中发展起来的几个可能故事。请注意,这些故事是基于一般性的行业趋势和公司发展路径构建的,并非真实发生的事件。如果您需要更具体的信息,建议直接查阅Bellin Dynamic Systems的官方资料或相关新闻报道。

问答坊 | AI 解惑

技术瞻望:SOP超越摩尔定律

 到2010年,“超越摩尔定律”的趋势——专注于系统级集成而不是晶体管密度将带来革命性的超多功能电子器件。   SOP延伸摩尔定律   还记得集成相机和移动电话这一大胆之举吗?或者把移动电话功能添加到PDA?这种方法依靠的是摩尔定律: 集成电 ...…

查看全部问答>

LPC1768调试心得(转载)

在自己的日志里写了调试心得1,结果没啥反应。唉,还是发贴吧,没人回帖,至少可以看看有几个人看过帖子吧。 最新工作体会,铁打的营盘,流水的兵。 最新发现一颗taobao零售价格4块RMB不到PHY,我的天。不过商业级的,工业级的依旧贵啊。 首先回 ...…

查看全部问答>

一种呼叫电路

养老院呼叫系统怎么设计,、 当有老人按按纽时,主机对应的房间二极管灯亮,并且嗽叭一直有音乐响下去,只要不按复位按纽,音乐会一直在响,对应的灯一直会亮。整个电路用的是6V或12V电源供电。不需要对讲功能。采用的是N+1线路…

查看全部问答>

免费下载:单片机毕业论文

一共收集了33个设计题目:  1. 16×16点阵(滚动显示)论文+程序  2. cdma通信系统中的接入信道部分进行仿真与分析  3. LED显示屏动态显示和远程监控的实现  4. MCS-51单片机温度控制系统  5. USB接口设计  6. ...…

查看全部问答>

89系列的单片机可以用的红外解码在stc12系列却不能用

#include#include#include\"1602.h\" #define  NOP()  _nop_()   /* 定义空指令 */ #define uchar unsignedchar#define uint unsigned int#define delayNOP();{_nop_();_nop_();_nop_();_nop_();}; void delay(uchar ...…

查看全部问答>

这颗料您想要吗?

利用16位电压输出DAC AD5370提供具有可编程工业电平输出范围的40通道输出 …

查看全部问答>

对毕业设计毫无头绪

毕设题目:基于zigbee的智能插座。网上找了好久都没找到有用的资料,完全没思路啊。。有没有大神有相关的资料的?? …

查看全部问答>

如何设置AT91SAM9G20的PIT中断

麻烦大家看一下,我的代码如下,我想在PIT中断服务程序中从串口发送一个字节,并让LED灯闪烁。可Main函数好像一执行到MyPrvSetupTimerInterrupt就有问题,即无法响应中断服务程序,也无法进入Main函数的for循环中,问题出在哪?麻烦各位的解答了! ...…

查看全部问答>