TM4C123的ROM函数和非ROM函数区别

前言

在开发TM4C123的时候,我看到ROM函数和非ROM函数。例如ROM_FPUEnable()和FPUEnable()函数,这两个就只是前缀不一样。有什么区别和不同?

相同点

ROM函数和非ROM函数的作用起始是一样的,比如上面的例子ROM_FPUEnable()和FPUEnable()这两个函数都是用于使能浮点单元。他们两个从运行结果上来看,效果是相同的。

不同点

官方解释

TI官方论坛解释:https://e2echina.ti.com/support/microcontrollers/other/f/other-microcontrollers-forum/758349/tm4c123ge6pz-rom-rom

(1)ROM版的是内嵌在BOOT ROM中的,而普通版本的,是以库形式提供的。
(2)所以,ROM版的好处在于,可以节省程序空间,但缺点是调用时需要一个wait states,影响执行效率;而普通版的正好相反。
(3)如何取舍取决于具体应用。如果对程序的大小要求比较严苛,就使用ROM版的;而对执行效率要求比较高的话,就选择普通版的。

ROM_FPUEnable()函数实现

(1)如下是ROM_FPUEnable()的实际函数实现。我们查阅芯片手册可以知道0x01000000是ROM的起始地址。
(2)而ROM包含如下四个元素
<1>TivaWare™引导加载程序和向量表
<2>TivaWare外设驱动库(DriverLib)发布的特定产品外设和接口
<3>高级加密标准(AES)加密表
<4>循环冗余检查(CRC)错误检测功能
(3)下面也介绍到,ROM中的外设驱动程序库api可以被应用程序调用,减少了对Flash内存的需求,并将Flash内存释放出来用于其他用途(例如应用程序中的其他特性)。
(4)所以说,ROM函数是直接调用ROM中的数据,这样可以有效的节约Flash负载。

#define ROM_FPUEnable    ((void (*)(void))ROM_FPUTABLE[0])

#define ROM_FPUTABLE            ((uint32_t *)(ROM_APITABLE[26]))

#define ROM_APITABLE            ((uint32_t *)0x01000010)

在这里插入图片描述

FPUEnable()函数实现

我们可以看到,他就是直接对寄存器进行操作。我们查手册知道,他这个就是直接对对应的寄存器进行操作。所以会会编写进入代码段,也就会进入Flash中

#define HWREG(x)              (*((volatile uint32_t *)(x)))
#define NVIC_CPAC             0xE000ED88  // Coprocessor Access Control
#define NVIC_CPAC_CP10_M        0x00300000  // CP10 Coprocessor Access
#define NVIC_CPAC_CP11_M        0x00C00000  // CP11 Coprocessor Access
#define NVIC_CPAC_CP10_FULL     0x00300000  // Full Access
#define NVIC_CPAC_CP11_FULL     0x00C00000  // Full Access

void
FPUEnable(void)
{
    //
    // Enable the coprocessors used by the floating-point unit.
    //
    HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) &
                         ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) |
                        NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL);
}

在这里插入图片描述

建议

(1)从我个人的角度来看,我建议一些初始化的程序,也就是while(1)之前的函数都采用ROM函数。这样能够尽可能的节约程序空间。
(2)while(1)之中的程序可以根据需求来选择是ROM还是非ROM版本。如果while(1)中程序很多,就采用ROM版本,如果并不多,还是采用非ROM版本更好。
(3)中断程序中,最好使用非ROM版本的函数,因为中断程序要求快速响应。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
tm4c123g是一款单片机,它具有延时函数的特性。在tm4c123g中,常用的延时函数是SysCtlDelay。这个函数可以通过传入一个参数来实现延时的功能。延时的时间可以通过计算得到,具体的计算方法是将系统时钟频率除以一个常数,然后乘以延时的毫秒数。例如,如果要延时500毫秒,可以使用以下代码:SysCtlDelay(500*(SysCtlClockGet()/3000))。其中,SysCtlClockGet()函数用于获取当前的系统时钟频率。需要注意的是,使用delay函数会导致单片机在延时期间处于暂停状态,这可能会浪费资源并对单片机内部的运算产生影响。因此,在使用延时函数时,应尽量避免使用,并考虑其他更有效的方法来实现相同的功能。另外,需要注意的是,当系统时钟频率高于40MHz时,实际的延时时间可能会大于设置的值,这是因为芯片内部Flash的读取频率最大只能达到40MHz。在这种情况下,可以考虑使用ROM_SysCtlDelay()函数来实现更准确的延时。 #### 引用[.reference_title] - *1* *2* [tm4c123gxl库函数调包侠养成(一)——————基本系统时钟与delay函数](https://blog.csdn.net/qq_43725844/article/details/89023338)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [TM4C123G学习记录(1)--时钟](https://blog.csdn.net/wxc971231/article/details/95043609)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风正豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值