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中。
热门推荐
单身一辈子,真的好吗?看看这些真相后再决定!
猫看见主人哭会怎么样(猫咪能感觉到主人的情绪吗)
地暖为何在中国家庭中逐渐失宠?七大原因深度解析
南京一日游最佳路线攻略
车牌照是个人资料吗?公开有风险吗?律师解释法律定义
京东方新型OLED面板超越三星LG,预计2028年中国OLED产能将超韩国
油脂有“料”(库存篇):库存在棕榈油价格形成中的影响分析
外卖店揭秘:厨房藏于深巷,门店照片来自网络
希腊海军陆战队帮助考古人员解开3500年前的盔甲之谜
营养素与保健品的区别
民事诉讼一审撤诉怎么处理?律师代收破产费合法吗?
药源性帕金森综合征
什么是跳频通信?与定频通信相比有何优势?
经常喝酒的人注意啦!这 8 种护肝“神”物,可要收藏好!
北上广二审判决书的法律实践与深度分析
脂溢性皮炎快走开,清爽头皮还回来
AI时代,年轻产品经理的突围路径:从执行者到价值重构者
靖边公安:以民意为导向全面提升警务效能
公寓管理费用包括哪些项目
干煸四季豆:川菜经典家常菜的制作秘诀
马来西亚经济转型的启示:从制造业到高收入国家
流感高发 家庭消毒别再这样做了!无效还伤身
古建筑如何断代——唐、宋、元、明、清
2025年研究生总分多少分?考研冲刺怎么学?
激光共聚焦显微镜在生物医学中的应用与发展趋势
MPV油耗大比拼:仅一款破6,GL8、V级油耗超10!
如何在Windows10中设置和管理启动项:详细操作指南与优化技巧
Docker安装后Win10蓝屏问题分析与解决方案
辅警如何晋升为警察?
“腊肠”与“香肠”的区别