大家使用华大单片机的时候,会发现在SDK开发包的驱动库及样例文件夹中会有DDL和lite两个版本的例程(因为样例也是基于相应的驱动库来开发的,所以本文后面为了称呼方便,我们把驱动库及样例简称为库)。下面两图列出了HC32F005和HC32L136 驱动库及样例文件夹中的两种库。
大家肯定会关心这两种库的区别和在使用的是时候如何来选择的问题。如果有工程师比较早就接触并使用了华大单片机会发现之前只有DDL的库,在2019年的时候出现了lite库。至于这两个库的区别大家记住“lite库是精简高效的库”这句话就可以。
先来段DDL库中uart.c里定义的Uart_EnableIrq()函数
/**
******************************************************************************
** \brief UART通信中断使能函数设置
**
** \param [in] u8Idx通道号,enIrqSel发送or接收中断使能
**
** \retval OK配置成功
**\retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t Uart_EnableIrq(uint8_t u8Idx,
en_uart_irq_sel_t enIrqSel)
{
stc_uart_instance_data_t* pstcData = NULL;
ASSERT(IS_VALID_CH(u8Idx));
ASSERT(IS_VALID_IRQSEL(enIrqSel));
pstcData = UartGetInternDataPtr(u8Idx);
if (NULL == pstcData)
{
return ErrorInvalidParameter;
}
switch(enIrqSel)
{
case UartTxIrq:
pstcData->pstcInstance->SCON_f.TCIE = 1u;
break;
case UartRxIrq:
pstcData->pstcInstance->SCON_f.RCIE = 1u;
break;
case UartFEIrq:
pstcData->pstcInstance->SCON_f.FEIE = 1u;
break;
case UartCtsIrq:
pstcData->pstcInstance->SCON_f.CTSIE = 1u;
break;
case UartPEIrq:
pstcData->pstcInstance->SCON_f.PEIE = 1u;
break;
case UartTxEIrq:
pstcData->pstcInstance->SCON_f.TXEIE = 1u;
break;
default:
return (ErrorInvalidParameter);
}
return Ok;
}
DDL库更多的是按软件工程的思想来写出的,里面做了非常多的安全措施(如用ASSERT()断言函数来判断数据是否合法,取数据会判断是否有效等),这样在程序出问题的时候会很容易查到问题的根源。当然可靠性增加同样会增加芯片的代码量和编译后生成的文件的大小,并且会降低实现同样功能时芯片的执行效率。DDL库大多数不支持ARM最新编译器ARMCC V6。
我们再看下lite库中uart.c文件中的Uart_EnableIrq()函数
/**
******************************************************************************
** \brief UART通信中断使能函数设置
**
** \param [in] UARTx通道号,enIrqSel发送or接收中断使能
**
** \retval OK配置成功
** \retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t Uart_EnableIrq(M0P_UART_TypeDef* UARTx, en_uart_irq_sel_t enIrqSel)
{
SetBit((uint32_t)(&(UARTx->SCON)), enIrqSel, TRUE);
return Ok;
}
大家看后什么感觉?清爽了吧?更符合大家的使用习惯了吧?是的,这样写出来的程序代码量非常小,而且执行效率会很高。但同时也失去了一定的可靠性(例如这里写入一个芯片中没有的UART,如UART5,程序是不会返回错误标记的)。lite库增加了对ARM最新编译器ARMCC V6的支持。
大家清楚这两种库的区别后,现在我们分别打开两个库中的空模板工程template,进行编译,查看编译结果。先看DDL库ARMCC V5.06编译,编译结果如下图
lite库ARMMCC V5.06编译,编译结果如下图
再看下lite库ARMMCC V6编译,编译结果如下图
通过上面的对比可以看出同样的编译器,lite库的程序会显著比DDL的库的生成的文件小,因为这个空模板本身没有什么功能,节省了这么多的空间已经相当可观。
同样的程序使用不同的编译器会发现 ,ARMMCC V6编译器无论是生成文件的大小,还是编译的速度都有很大的优势。
最后总结
优点 | 缺点 | |
---|---|---|
DDL 库 | 软件可靠性高 | 占空间,效率差,不支持ARMMCC V6 |
Lite库 | 省空间,效率高,支持ARMMCC V6 | 软件可靠性要工程师自己掌控 |
经过上面的介绍相信大家都已经知道该选哪个库来开发了,如果还有不明白的欢迎公众号留言交流。
关注微信公众号『芯缘意码』,查看更多内容,回复“加群”加入技术交流群。
淘宝 店铺 搜索 『芯缘意码』,购买开发学习板仿真器。