问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

KEIL中让程序在RAM中运行的办法

创作时间:
作者:
@小白创作中心

KEIL中让程序在RAM中运行的办法

引用
1
来源
1.
https://m.book118.com/html/2024/1226/7121001122010013.shtm

在嵌入式系统开发中,有时需要将程序代码从Flash迁移到RAM中运行,以提高执行效率或满足特定的系统需求。本文将通过一个STM32F411 Nucleo开发板的实例,详细介绍如何在KEIL开发环境中实现这一目标。

最近在使用KEIL时,经常遇到需要将部分或全部程序放到RAM中运行的问题。经过一番搜索和尝试,现将总结分享如下,希望能为大家节省时间。本文将以STM32F411 Nucleo开发板为例,介绍几种让程序在RAM中运行的方法。具体来说,我们将通过多种方式将LED翻转函数(ToggleLED)的代码放在RAM中运行。

ToggleLED函数从Flash中执行的情况

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

void ToggleLED(void)
{
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    /* Insert a 100ms delay */
    HAL_Delay(100);
}

int main(void)
{
    ……
    /*##-3-Toggle PA05 IO in an infinite loop #################################*/
    while (1)
    {
        ToggleLED();
    }
}

Linker的配置如下图所示:

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

将翻转LED的程序放到SRAM中执行

方法一:通过#pragma arm section code="RAMCODE"和#pragma arm section

这种方式可以同时将多个函数放到指定的section。具体方法如下:

  1. 修改.sct文件,自定义一个叫做RAMCODE的section,放在RW_IRAM1执行区域,地址范围0x00。
LR_IROM1 0x00000000 { ; load region size_region
    ER_IROM1 0x00000000 { ; load address = execution address
        *.o(RESET,+First)
        * (InRoot$$Sections)
        .ANY(+RO)
    }
    RW_IRAM1 0x20000000 { ; RW data
        *.o(RAMCODE)
        .ANY(+RW+ZI)
    }
}
  1. 在工程中使用前面修改的.sct文件

  2. 使用#pragma arm section code="RAMCODE"和#pragma arm section将需要放到RAMCODE section的函数包括进来。编译时,编译器会自动将这些函数放到RAMCODE所在地址区域。

#pragma arm section code="RAMCODE"
void ToggleLED(void)
{
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    /* Insert a 100ms delay */
    HAL_Delay(100);
}

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    /* Check the parameters */
    assert_param(IS_GPIO_PIN(GPIO_Pin));
    GPIOx->ODR ^= GPIO_Pin;
}

uint32_t HAL_GetTick(void)
{
    return tick;
}

void HAL_Delay(__IO uint32_t Delay)
{
    uint32_t tickstart = 0;
    tickstart = HAL_GetTick();
    while ((HAL_GetTick() - tickstart) < Delay);
}
#pragma arm section

通过上述配置,编译后从map文件可以看到,ToggleLED以及其中调用到的HAL_GPIO_TogglePin和HAL_Delay函数的地址都在SRAM中。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号