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。具体方法如下:
- 修改.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)
}
}
在工程中使用前面修改的.sct文件
使用#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中。
热门推荐
简化投资策略,专注于一至两种稳定方法
深圳市个人所得税计算方法(税率表)
从火灾报警系统、水系统失灵,到消防设施整体改造,这个小区是如何做到的?
拔牙多久能排除干槽症?来看看怎么判断有没有干槽症
皖浙1号公路自驾攻略:徽州最惬意的路线
刑事卷宗包括哪几部分
香港旅游发展局:香港旅游入境指南
跑步装备完全指南:从跑鞋到智能设备,如何科学选择运动装备?
裁员如何减少赔偿纠纷
416不锈钢圆棒:耐腐蚀环境的首选材料
专科护士——“传承 引领 发展” 我们的未来
全球机场如何开展应急救援演练?
欧几里德OK镜和菁视OK镜哪个好?从多个维度进行对比分析!
中医梳头法:唤醒头部经络,告别亚健康
机械键盘最响的轴是什么?如何选择适合自己的轴体?
高级工程师评审-从材料准备到避坑指南
宠物健康:小猫弓背原因及应对
猫咪"不好动"怎么办?全方位解析原因与应对方案
上海“冬夜文旅”火出圈,哪些地方正在释放城市B面活力
海通策略:4月是A股重要时间节点 三个维度前瞻一季报线索
大学在线阅卷:如何确保考试评分的公正性?
最新一代生物可吸收心脏支架在上海研发成功
C语言小游戏开发入门:以井字棋为例
不锈钢阳台内护栏立柱间距规范与安全标准
护士也能多点执业?国家卫健委:研究完善护士区域化注册制度,能否破解低收入困境?
如何快速回本基金投资?这种回本策略对投资者有何影响?
个人借款欠条内容怎么写合法有效
AI技术助力公众号写作,快速生成优质内容
2025年深圳在职人才引进办理指南(个人申办)
十大实用的玛瑙真假辨别方法 10个玛瑙鉴定小方法分享