[其他] 华大单片机DDL库与lite库的区别

[复制链接]
 楼主| 9dome猫 发表于 2021-1-15 21:07 | 显示全部楼层 |阅读模式
大家使用华大单片机的时候,会发现在SDK开发包的驱动库及样例文件夹中会有DDL和lite两个版本的例程(因为样例也是基于相应的驱动库来开发的,所以本文后面为了称呼方便,我们把驱动库及样例简称为库)。下面两图列出了HC32F005和HC32L136 驱动库及样例文件夹中的两种库。
 楼主| 9dome猫 发表于 2021-1-15 21:08 | 显示全部楼层
 楼主| 9dome猫 发表于 2021-1-15 21:08 | 显示全部楼层
 楼主| 9dome猫 发表于 2021-1-15 21:09 | 显示全部楼层
大家肯定会关心这两种库的区别和在使用的是时候如何来选择的问题。如果有工程师比较早就接触并使用了华大单片机会发现之前只有DDL的库,在2019年的时候出现了lite库。至于这两个库的区别大家记住“lite库是精简高效的库”这句话就可以。
 楼主| 9dome猫 发表于 2021-1-15 21:09 | 显示全部楼层
先来段DDL库中uart.c里定义的Uart_EnableIrq()函数

  1. /**
  2. ******************************************************************************
  3. ** \brief  UART通信中断使能函数设置
  4. **
  5. ** \param [in] u8Idx通道号,enIrqSel发送or接收中断使能
  6. **
  7. ** \retval OK配置成功
  8. **\retval ErrorInvalidParameter配置失败
  9. ******************************************************************************/
  10. en_result_t Uart_EnableIrq(uint8_t u8Idx,
  11.                            en_uart_irq_sel_t enIrqSel)
  12. {
  13.     stc_uart_instance_data_t* pstcData = NULL;
  14.     ASSERT(IS_VALID_CH(u8Idx));
  15.     ASSERT(IS_VALID_IRQSEL(enIrqSel));
  16.     pstcData = UartGetInternDataPtr(u8Idx);
  17.     if (NULL == pstcData)
  18.     {
  19.         return ErrorInvalidParameter;
  20.     }
  21.     switch(enIrqSel)
  22.     {
  23.         case  UartTxIrq:
  24.             pstcData->pstcInstance->SCON_f.TCIE  = 1u;
  25.             break;
  26.         case  UartRxIrq:
  27.             pstcData->pstcInstance->SCON_f.RCIE  = 1u;
  28.             break;
  29.         case  UartFEIrq:
  30.             pstcData->pstcInstance->SCON_f.FEIE  = 1u;
  31.             break;
  32.         case  UartCtsIrq:
  33.             pstcData->pstcInstance->SCON_f.CTSIE = 1u;
  34.             break;
  35.         case  UartPEIrq:
  36.             pstcData->pstcInstance->SCON_f.PEIE  = 1u;
  37.             break;
  38.         case  UartTxEIrq:
  39.             pstcData->pstcInstance->SCON_f.TXEIE = 1u;
  40.             break;
  41.         default:
  42.             return (ErrorInvalidParameter);      
  43.     }
  44.     return Ok;
  45. }
 楼主| 9dome猫 发表于 2021-1-15 21:10 | 显示全部楼层
DDL库更多的是按软件工程的思想来写出的,里面做了非常多的安全措施(如用ASSERT()断言函数来判断数据是否合法,取数据会判断是否有效等),这样在程序出问题的时候会很容易查到问题的根源。当然可靠性增加同样会增加芯片的代码量和编译后生成的文件的大小,并且会降低实现同样功能时芯片的执行效率。DDL库大多数不支持ARM最新编译器ARMCC V6。
 楼主| 9dome猫 发表于 2021-1-15 21:11 | 显示全部楼层
我们再看下lite库中uart.c文件中的Uart_EnableIrq()函数

  1. /**
  2. ******************************************************************************
  3. ** \brief  UART通信中断使能函数设置
  4. **
  5. ** \param [in] UARTx通道号,enIrqSel发送or接收中断使能
  6. **
  7. ** \retval OK配置成功
  8. ** \retval ErrorInvalidParameter配置失败
  9. ******************************************************************************/
  10. en_result_t Uart_EnableIrq(M0P_UART_TypeDef* UARTx, en_uart_irq_sel_t enIrqSel)
  11. {
  12.     SetBit((uint32_t)(&(UARTx->SCON)), enIrqSel, TRUE);

  13.     return Ok;
  14. }

 楼主| 9dome猫 发表于 2021-1-15 21:13 | 显示全部楼层
大家看后什么感觉?清爽了吧?更符合大家的使用习惯了吧?是的,这样写出来的程序代码量非常小,而且执行效率会很高。但同时也失去了一定的可靠性(例如这里写入一个芯片中没有的UART,如UART5,程序是不会返回错误标记的)。lite库增加了对ARM最新编译器ARMCC V6的支持。
 楼主| 9dome猫 发表于 2021-1-15 21:14 | 显示全部楼层
大家清楚这两种库的区**,现在我们分别打开两个库中的空模板工程template,进行编译,查看编译结果。先看DDL库ARMCC V5.06编译,编译结果如下图
3268260019509e6fb9.png
 楼主| 9dome猫 发表于 2021-1-15 21:15 | 显示全部楼层
 楼主| 9dome猫 发表于 2021-1-15 21:15 | 显示全部楼层
 楼主| 9dome猫 发表于 2021-1-15 21:16 | 显示全部楼层
通过上面的对比可以看出同样的编译器,lite库的程序会显著比DDL的库的生成的文件小,因为这个空模板本身没有什么功能,节省了这么多的空间已经相当可观。
同样的程序使用不同的编译器会发现 ,ARMMCC V6编译器无论是生成文件的大小,还是编译的速度都有很大的优势。
 楼主| 9dome猫 发表于 2021-1-15 21:18 | 显示全部楼层
edyd 发表于 2021-1-16 22:21 | 显示全部楼层
学习了。谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

138

主题

1574

帖子

2

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