KEIL中如何程序在 RAM 中运行

前言
最近老是遇到使用KEIL时需要将部分或者全部程序放到RAM中运行的问题。故此花了不少时间搜索资料和几番尝试,现将其总结在本篇文章中,也是为大家以后的工作节省时间罢。本文中会介绍通过STM32F411Nucleo的一个例子来介绍几种让程序在RAM中运行的方法。在该例子中,通过调用ToggleLED函数来翻转LED2亮灭。接下来,我们将通过多种方法将这段代码放在RAM中运行。

ToggleLED函数从Flash中执行的情况
我们先来看看ToggleLED函数从Flash中执行的情况。下面是ToggleLED函数和它的调用情况。在main函数的while(1)里调用ToggleLED。

Linker的配置为,见下图:
Flash起始地址:0x08000000
RAM起始地址:0x20000000

编译后从map文件可以看到,ToggleLED以及其中调用到的HAL_GPIO_TogglePin和HAL_Delay函数的地址都在FLASH中。

将翻转LED的程序放到SRAM中执行
方法一:通过#pragma arm section code = “RAMCODE ”和#pragma arm section。参考Example1代码。
这种方式,可以同时将多个函数放到指定的section。具体方法如下:
1. 修改.sct文件,自定义一个叫做RAMCODE的section,放在RW_IRAM1执行区域,地址范围0x20000000~0x20020000。

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
  *.o(RAMCODE)
    .ANY (+RW +ZI)
  }


}

2. 在工程中使用前面修改的.sct文件

3.以#pragma arm section code = “RAMCODE” 开头,以#pragma arm section结尾。将所有需要放到RAMCODE section的函数包括进来。编译时,编译器会自动将这些函数放到RAMCODE所在0x20000000开始的区域。 


4.从map文件里,可以看到这四个函数都已经被放到了SRAM中。

方法二:通过__attribute__((section(“name ”)))
在KEIL中可以通过__attribute__((at(address)))的方式将变量放到指定的位置。
通过__attribute__((section(“name ”)))的方式将变量或者函数放到指定的位置。
下面我们来看看如何通过这种方式将程序放到SRAM中执行。可以参考Example2的代码。
1.同样,我们需要修改.sct文件,自定义一个叫做RAMCODE的section,并在工程选项的linker页面中,选择定义好的.sct文件。(见方法一中的第1,2步 同第一种方法)

2.在需要放到RAM中的函数前,用__attribute__((section("RAMCODE")))声明该函数放在RAMCODE section中。注意,该函数中调用到的所有函数也要放到RAMCODE section中。


3.从编译后的map文件可以看出,ToggleLED以及它调用到的所有函数都被到了RAM中。

方法二可以覆盖方法一,也就是说如果你同时用方法一和方法二对同一个函数的执行区域做了说明。最终起作用的是方法二。我们可以通过Example3来说明
1.修改.sct文件。将SRAM分为两个执行区RW_IRAM1和RW_IRAM2。Section RAMCODE1,RAMCODE2分别位于0x20000000开始,和0x20010000开始的两个64KB的区域。

2.在代码中, HAL_GetTick被放在了#pragma的作用域内被声明放在RAMCODE1 section,同时又用__attribute__( ( section ( "RAMCODE2" ) ) ) 将其放在RAMCODE2的section内。

3.编译完成后,我们再看看map文件中HAL_GetTick到底被放到了哪个section。

从map里可以看到,最终HAL_GetTick被放在了RAMCODE2 section中。

将整个程序放到SRAM中执行
前面我们介绍了将一个或多个程序放到指定地址执行的方法。如果需要放到指定地址的程序比较多,我们还可以将这些需要放到指定地址的程序集中放到一个或几个C文件中,然后在.sct文件中将这些C文件生成的目标文件放到指定地址。
在这里,我们将尝试将整个程序放到SRAM中执行。复位后程序从FLASH启动,之后将从SRAM执行所有的程序。下面是具体的步骤。可以参考Example4的代码。
1.将中断向量表和中断处理程序放到SRAM中

新建一个startup_stm32f411xe_ram.s文件,放到0x20000000开始的位置(在.sct文件中修改)。注意这里是新建,而不是直接将原来的文件放到SRAM中,为什么呢?大家可以思考一下。在startup_stm32f411xe_ram.s里定义新的SECTION,叫做RESET_ram(还有其他的修改,请对照参考代码)。


在后面的.sct中将把RESET_ram这个section放到SRAM开始的位置上(见第3步)。


2.在SystemInit中将中断向量表的偏移地址设置为0x20000000。使能VECT_TAB_SRAM。

3.修改.sct文件,将运行时需要的所有目标文件都放到SRAM执行区中。这里中断向量表有同样的两份,一份在0x08000000开始的位置,一份在0x20000000开始的位置。


4. 编译完成后,从map文件或者跟踪调试的结果都可以看到。系统复位以后,从main函数开始,所有的程序都在RAM中运行了。

另外,如果你的程序中有用到ARM底层的库,可以在.sct文件中加入*armlib*(+RO)来将所有用到的库文件放到SRAM中。


示例程序资源下载地址:

http://download.csdn.net/download/lijianboyangting/10108214

  • 21
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Keil是一款集成的开发环境,可用于嵌入式系统的软件开发。在Keil编写的代码可以被RAM(随机存取存储器)运行Keil具有强大的编译器和调试功能,可以将编写的代码转换为目标可执行文件。在这个过程,代码的变量和函数将被分配到RAM。因此,RAM是代码在运行时存储数据和指令的区域。 在Keil运行代码时,首先需要编写代码,并在编译过程将代码转化为可执行文件。这个可执行文件可以被下载到目标硬件上,然后通过调试工具进行调试和运行。在这个过程,代码的变量和函数将被加载到RAM,并在运行时被处理器执行。 RAM的容量和性能在不同的嵌入式系统可能会有所不同。在使用Keil开发嵌入式系统时,可以根据系统的需求和RAM的容量选择适当的目标硬件。 总之,Keil作为一款集成的开发环境,可以将编写的代码转化为可执行文件,并在RAM运行。它为嵌入式系统的软件开发提供了强大的工具和功能。 ### 回答2: Keil是一种嵌入式系统开发工具,可以帮助开发者编写和调试嵌入式软件。嵌入式系统通常包含了一个微控制器和相应的外围设备,而Keil可以帮助将代码运行在这个嵌入式系统上。 RAM(Random Access Memory)是一种计算机内部用于读取和写入数据的临时存储器。在Keil,我们可以使用RAM来存储和运行代码。 当我们使用Keil进行开发时,我们需要在RAM存储我们编写的代码。为了在RAM运行代码,我们需要进行以下步骤: 1. 首先,我们需要创建一个新的项目,并将我们的代码添加到项目。 2. 在Keil,我们可以使用C语言或汇编语言来编写代码。我们可以使用编辑器来书写我们的代码,并且Keil还提供了代码自动补全、语法高亮等功能,使得编写代码更加方便和高效。 3. 一旦我们的代码编写完成,我们需要编译代码。编译器将我们的代码转换为机器语言,并生成可执行文件。 4. 接下来,我们需要下载可执行文件到目标设备的RAM。这可以通过连接目标设备并使用编程器进行下载完成。 5. 下载完成后,我们可以通过调试器来运行我们的代码。调试器可以让我们逐行执行代码并查看变量的值,以帮助我们调试代码并排查问题。 6. 最后,我们可以在Keil使用输出窗口来查看代码运行时的发生的事件和信息。 总之,Keil可以帮助我们编写、编译和调试嵌入式软件,并在目标设备的RAM运行代码。使用Keil进行开发,我们可以更加高效地开发嵌入式系统,并且方便地进行代码调试和优化。 ### 回答3: Keil是一款广泛使用的嵌入式开发工具,它可用于开发各种嵌入式系统,包括单片机和嵌入式微处理器等。在Keil,我们可以使用C/C++语言编写代码,并通过编译、链接和调试等步骤将代码转换为可以在目标硬件上运行的机器码。 RAM是一种临时存储器,用于存放程序运行时所需的数据及变量。在Keil,我们可以利用RAM来存储和操作程序的变量。使用RAM可以提高程序运行速度,因为RAM的访问速度比其他存储器(如ROM)更快。 在Keil,我们可以使用指令将程序的变量分配到RAM。首先,我们需要在代码定义和声明变量,例如int类型的变量。然后,我们可以使用关键字“__RAM”的修饰符将变量声明为RAM变量。当我们编译和链接代码时,编译器会根据变量的声明和修饰符将其分配到RAM。 在运行代码时,RAM变量将被加载到RAM存储器,并可以在程序执行过程进行读写操作。通过使用RAM变量,我们可以实现对程序数据的实时操作和修改。然而,需要注意的是,RAM的容量是有限的,所以我们需要合理使用RAM资源,避免出现内存溢出的情况。 总之,Keil可以通过将代码的变量声明为RAM变量来存储和操作程序的数据。使用RAM可以提高程序运行效率,并实现对数据的实时操作。合理使用RAM资源是开发过程需要注意的一个方面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值