在Keil下如何把程序放到RAM中运行-1
- 格式:pdf
- 大小:241.04 KB
- 文档页数:6
MDK编译指定函数到RAM的方法(ARM平台)
这里,我用的是STM32F401CE ,为了优化部分算法的执行效率,考虑将算法编译到RAM中(前提RAM足够使用)
这里以MDK5 为例(MDK4方法一样):
前面略过一些条件筛选,比如:你的单片机是否支持分散加载
1、新建一个.c文件,把要优化的算法(方法)放到这个.c文件中,
比如:TEST.c,将该添加的头文件添加上去,保证这个文件能编译通过
2、将TEST.c添加到你的工程中,然后点击该文件,鼠标右键,如
图所示:
3、打开Options for File ‘TEST.c’窗口:
在Code/Const 对应的下拉框中选择要编译的RAM区域,OK 关闭窗口,这时TEST.c文件会出现一个雪花的标记:
4、再次编译工程,这样就实现了指定函数编译到指定RAM区的
过程
老A
2015年8月7日09:41。
keil中malloc的用法Keil 是一种嵌入式系统开发工具,主要用于嵌入式设备的编程和调试。
在嵌入式系统中,资源管理非常重要,包括内存的分配和释放。
在Keil 中,可以使用标准库函数`malloc` 来进行动态内存分配。
本文将详细介绍Keil 中`malloc` 函数的用法和原理,并提供一步一步的回答。
# 第一部分:什么是动态内存分配动态内存分配是在程序运行时根据需要临时分配内存空间。
与静态内存分配不同,静态内存分配发生在编译时,而动态内存分配在程序运行时动态进行。
动态内存分配使得程序可以根据需要动态增加或减少内存,并提高内存利用率。
# 第二部分:`malloc` 函数的介绍`malloc` 函数是C 标准库中的一种内存分配函数,用于在堆(Heap)中分配指定大小的内存空间。
它的函数原型如下:cvoid* malloc(size_t size);`malloc` 函数接受一个`size_t` 类型的参数`size`,表示需要分配的内存空间大小(单位为字节)。
函数返回一个`void*` 类型的指针,指向分配的内存空间的起始地址。
# 第三部分:`malloc` 函数的使用步骤下面将一步一步介绍在Keil 中使用`malloc` 函数的详细步骤。
步骤1:包含头文件在使用`malloc` 函数之前,需要包含`<stdlib.h>` 头文件,该头文件中包含了`malloc` 函数的定义。
可以使用以下代码包含头文件:c#include <stdlib.h>步骤2:声明指针变量在使用`malloc` 函数之前,需要声明一个指针变量,用于存储分配的内存空间的起始地址。
可以使用以下代码声明指针变量:cint* ptr;步骤3:分配内存空间使用`malloc` 函数来分配指定大小的内存空间,并将返回的指针赋值给指针变量。
可以使用以下代码分配内存空间:cptr = malloc(sizeof(int) * num_elements);上述代码中,`sizeof(int)` 表示一个整数占用的内存空间大小(通常为4 字节),而`num_elements` 表示需要分配的元素个数。
STM32 在Keil MDK 环境下RAM 上代码调试
自从51 后就没碰过了Keil 了~从昨天下午又开始再次使用Keil MDK~不过
这次是for ARM 的~前几天的STM32W108 调试统统是在IAR 上进行的~刚在STM32F103ZE-EK 上进行了一个例程的调试~就发现原来更有方法在RAM 中
进行代码调试的配置~以前在IAR 中知道有个iar- cfg.icf 文件是关于存储分配的~貌似也可以如此~不过没实际操作过不敢下结论~索性就在Keil 下来了个尝
试~比较坎坷~也学到不少东西~
废话少说,进入正题~(Keil4 下的画面~这个配置的方法跟是3 一样~)
步骤与图示:
1.先给个CPU 的数据,需要注意的是三个红圈的地方,架构,型号,Flash
和SRAM 大小~如图1
图1
2.Target 的设置
1)勾上可以用微库,减小生成代码的大小
2,3)分别定义ROM 区位置及大小和RAM 区位置和大小。
在这里需要说
明的是,Cortex-M3 的架构有4G 的寻址空间,而Flash 的起始地址在
0x08000000,RAM 地址在0x20000000,在这里进行了第一次相关地址的更改~ 如图2
0x1000 为4K~这里的0xc000 则为48K 的ROM 分配~RAM 的为16K~基本上移植个uCOS-II 都够用了~。
KEIL FOR ARM 下LPC22xx 的外部RAM 用法工作笔记:调试外部RAM,我是在CS0 上外扩了一个64K 的RAM,也就是地址从0X80000000 开始。
开始不知道REALVIEW 的设置,所以总是不能读写RAM,没有输出信号,在KEIL 下要做如下设置。
一、在Options for Target Targe 1 下,选择Asm 菜单,在Conditional Assembly Control Symbols 下的输入框中填上EXTERNAL_MODE,然后按OK 结束,二、Startup.s 这个文件也要做一定的改动。
EMC_SETUP EQU 1 ;使能外部RAM 控制。
BCFG0_SETUP EQU 1 ;使能CS0 控制。
如果用到别的片选,则都要使能。
BCFG0_Val EQU 0x1000554A; ;;此时要注意BCFG0 这个寄存器的设置,要仔细看内容,其分别定义了读、写、连续的时钟周期,重要的是,如果是RAM,RVLE 位一定要置1,别的要根据你RAM 的速度,来设置一个合适的值,位29、28 决定了RAM 的宽度,8 位、16 位、32 位等。
三、另一个设置就是比较重要的PINSEL2PINSEL2_Val EQU 0x0F000914的设置的为16 位总线,A1-23 地址线使能,使能CS0,OE ,WE;别的引脚则设置为了I/O,这个寄存器的位4、5 应该看明白,你选择的是多少位的总线,然后就是看你需要的选择了。
综上,设置了这几种寄存器,外部RAM 就可以正常工作了。
如果以上设置的不对,则可能没有WE 信号,也可能不产生CS0;下面是一个简单的例子。
#define RAMADDR 0x80000000 //外部RAM 的基址。
下ARM 程序在RAM 中调试的方法软件环境:ReavView MDK3.04硬件平台:ZLG 公司出品的LPC2104开发板使用条件:目标代码 < RAM 空间(此应用中为16KB)编译工具为RealView ,见下图设置方法:(以LPC2104开发板为例,并认为你已经掌握了Keil uV3的基本使用方法)1.建立工程,选择正确的芯片2.设定代码区和数据区,见下图其中IROM1和IRAM1的设置都不再是缺省值。
IROM1的设置是为了让代码定位到RAM里。
IRAM1的设置是为了避免数据与代码冲突。
3.在线调试设置,见下图注意:要选中实际使用的硬件仿真器(如ULINK)其下的Load application at start 一定不要选中设置好INI文件[1]RAM.ini 文件内容如下:FUNC void Setup (void) {PC = 0x40000000;}Setup(); // Setup for DownloadLOAD DebugInRam\interrupt.axf INCREMENTAL // Downloadg, main其中DebugInRam\interrupt.axf为你要下载的目标文件(注意替换)4.修改startup.s选项选中startup.s,点右键,选择“options for file’startup.s’”再选择“asm”页,如下图在define 中填入“RAM_MODE”和“REMAP”5.设置完成试试吧!其它使用缺省选项(或你的个性化设置),正确设置好仿真器(如ULINK),编译,不用烧写到flash中(即不要点击),而是直接点击进入DEBUG状态,你应该看见类似下图的画面,PC为0x4000xxxx说明程序在RAM中运行。
参考文献1.MCU123《关于ARM怎样在RAM中运行》2. 周立功等《ARM微控制器基础与实战》北京航空航天大学出版社2003本文作者:杨广京中科院自动化所。
分享:KEIL中配置J-Link在RAM中调试的⽅法Moses娄'的STM32学习笔记(⼀):STM32在Keil MDK环境下RAM上代码调试的配置⼼得~⾃从51后就没碰过了Keil了~从昨天下午⼜开始再次使⽤Keil MDK~不过这次是for ARM 的~前⼏天的STM32W108调试统统是在IAR上进⾏的~刚在STM32F103ZE-EK上进⾏了⼀个例程的调试~就发现原来更有⽅法在RAM中进⾏代码调试的配置~以前在IAR中知道有个iar-cfg.icf⽂件是关于存储分配的~貌似也可以如此~不过没实际操作过不敢下结论~索性就在Keil下来了个尝试~⽐较坎坷~也学到不少东西~废话少说,进⼊正题~(Keil4下的画⾯~这个配置的⽅法跟是3⼀样~)步骤与图⽰:1.先给个CPU的数据,需要注意的是三个红圈的地⽅,架构,型号,Flash和SRAM⼤⼩~如图1图12.Target的设置1)勾上可以⽤微库,减⼩⽣成代码的⼤⼩2,3)分别定义ROM区位置及⼤⼩和RAM区位置和⼤⼩。
在这⾥需要说明的是,Cortex-M3的架构有4G的寻址空间,⽽Flash的起始地址在0x08000000,RAM地址在0x20000000,在这⾥进⾏了第⼀次相关地址的更改~如图20x1000为4K~这⾥的0xc000则为48K的ROM分配~RAM的为16K~基本上移植个uCOS-II 都够⽤了~图23.Output的设置强调⼀下Name of Executable吧~这⾥默认的应该是project的名字,我习惯改成output~⽽且这与编译后产⽣的*.axf和*.sct⽂件名字都有关联~没勾选HEX~感觉选了也没⽤~写到SRAM中的是。
见图3图34.Listing Label~没啥说的~不上图了~默认~/doc/1e7bb1106edb6f1aff001f4e.html er Label~更没啥说的~同上~6.C/C++ Label~貌似都没啥说的我后⾯就不⽤写了~再同上。
keil中的manage run的用法在Keil中,"Manage Run"是一个非常有用的功能,它允许用户控制和管理程序的运行和调试。
通过Keil的"Manage Run"功能,用户可以执行以下操作:
1.下载程序:用户可以将已编译的程序下载到目标器件上。
这对于调试和测试程序的功能和性能非常有用。
2.运行程序:用户可以通过单步执行、连续执行或按需执行的方式运行程序。
这使得用户能够逐步调试程序并观察其行为。
3.设置断点:用户可以在程序中设置断点,以暂停程序的执行,并查看此时的变量值、寄存器状态等信息。
这有助于定位和修复程序中的错误。
4.监视变量:用户可以选择变量并进行监视,以便在程序执行过程中实时查看其值的变化。
这对于检查程序状态和调试变量的问题非常有用。
5.跟踪函数调用:用户可以跟踪程序中的函数调用过程,以了解
函数之间的调用关系和参数传递情况。
这有助于理解程序的执行流程。
6.调试程序:用户可以通过Keil的调试器来查看寄存器的值、堆
栈的状态等信息,以及执行单步调试或回退步骤。
这有助于定位和修
复程序中的错误。
另外,Keil的"Manage Run"功能也可以与其他工具和功能结合使用,例如内存查看器、逻辑分析器、功耗分析器等,以提供更全面的
调试和分析能力。
单片机动态加载函数到ram运行1.引言1.1 概述概述部分的内容可以简要介绍文章的主题和背景,以及该主题的重要性和意义。
以下是一种可能的写作思路:概述部分的内容应该首先引起读者对于单片机动态加载函数到RAM 运行这一话题的兴趣和关注。
在现代科技的快速发展中,单片机作为一种重要的微控制器,被广泛应用于各个领域。
然而,由于单片机的存储资源有限,往往无法同时加载所有需要的函数,这给开发和应用带来了困难。
本文将探讨如何实现单片机动态加载函数到RAM运行的方法,该方法可以在单片机运行时根据需求加载需要的函数,极大地提高了系统的灵活性和可拓展性。
通过这种动态加载函数的方式,不仅可以节省存储资源,还可以灵活应对不同的应用场景,加速系统的执行速度。
同时,本文也将介绍一些单片机动态加载函数的应用场景,展示其在实际项目中的价值。
通过本文的研究和探讨,读者将深入了解单片机动态加载函数到RAM 运行的原理和方法,并能够应用于实际项目中,提升单片机系统的性能和功能。
下面将对文章的结构进行详细展开。
1.2文章结构1.2 文章结构本文分为引言、正文和结论三个部分。
每个部分的内容如下:引言部分主要包含对本文主题的概述,文章结构的简要介绍以及本文的目的。
- 1.1 概述:介绍单片机动态加载函数到RAM运行的概念和意义。
说明在传统单片机开发中,程序一般都是在编译时就写入到ROM中,而本文将探讨如何动态加载函数到RAM中运行的技术与方法。
- 1.2 文章结构:对本文的章节组成进行说明,分别是引言、正文和结论。
介绍每个部分的内容和目的,以便读者可以更好地理解文章。
- 1.3 目的:明确本文的目的是为了介绍单片机动态加载函数到RAM 运行的方法和应用场景,帮助读者了解并掌握该技术的实现和应用。
正文部分主要介绍了单片机的概念和功能,以及动态加载函数的概念和优势。
- 2.1 单片机的概念和功能:对单片机进行简要介绍,包括单片机的定义、组成和基本功能。
Keil和MDK共存,按照以下步骤:1 先安装Keil C51,安装目录改为:"D:\Keil2"(我是安装在D盘的)2 再安装RealView MDK,目录:"D:\Keil"3 把Keil2下的C51文件夹全部复制到Keil下4 把Keil2下的UV4(或者UV3)下的所有文件复制粘贴到Keil下的UV4文件夹里,注意,如果提示有重复的文件,是否覆盖时,一律选择否,即不覆盖.5 把Keil2下的Tools.ini文件内容复制,粘贴到Keil下的Tools.ini文件的尾部,并将里面所有的"Keil2"替换成"Keil",保存追问我把他们都卸载了重新装可是先装完了51打开一看发现里面居然ARM的.....还是接着装?回答这样的,你又装错了吧?首先,你要确定你的两个,一个是Keil C51,另一个是MDK第二,把你现在已经装好的再卸载掉,并且把所有的安装文件全部删除,一点痕迹不能有,建议你最好用360卸载,切记把所有的已经安装了的文件全部删除。
第三,严格按照我以上的步骤来。
追问装错应该不是。
卸载是在控制面板卸载的并已将所有东西清除。
现在里面找不到51如STC 的东西。
现在打开51的project已经无法工作了。
回答就我知道的,Keil C51里本来就没有STC的东西,你要用STC除非得装插件,你装成功的标志是:1 新建一个工程,能够选到一些知名企业的51器件,如AT8952之类的,然后能够正常的编辑,编译2 新建一个工程,能够选到一些知名企业的ARM器件,如STM32之类的,然后能够正常的编辑,编译。
在Keil下如何把程序放到RAM中运行
1.概述:
有一个客户想用K60的GPIO口模拟某硬件接口的时序,为此叫我帮他把一段测试GPIO 口翻转速率的程序放到RAM中去运行,希望这样能够提高GPIO口翻转的速率。
我根据他的要求进行了试验,得到的结果虽然与开始的预期不大一样,但是仍然具有参考价值。
特此记录如下。
试验条件:
硬件:MK60DN256VLL10超核开发板
软件开发环境:Keil uVision 5.1
系统时钟设置:使用外部50MHz晶振作为PLL参考时钟源,倍频到100MHz,各个时钟频率如下:
CPU_CLK: 100MHz
BUS_CLK: 50MHz
FLASH_CLK: 25MHz
先测试客户原始的程序,用示波器测量GPIO口,得到翻转速率为4.545MHz,波形如下图:
检查程序,发现在操作GPIO口的语句中使用的是“|=”赋值语句,也就是每次操作都先读寄存器的值,然后进行修改,然后再写回到寄存器中,如下:
PTD->PSOR |= (1<<GPIO_Pin_0);
PTD->PCOR |= (1<<GPIO_Pin_0);
因为Kinetis的GPIO口的置高和置低寄存器(即上面的PSOR和PCOR)本身就具有位操作的功能——它们只改变写入“1”的位对应的管脚状态,而不会改变写入“0”的位对应的管脚状态,所以可以把上面的语句改为直接赋值语句,如下:
PTD->PSOR = (1<<GPIO_Pin_0);
PTD->PCOR = (1<<GPIO_Pin_0);
修改后重新测试,得到GPIO口的翻转速率为7.813MHz,波形如下图:
以上两个测试,程序都还是在Flash中运行的。
接下来,我试验把程序放到RAM中运行的效果,具体步骤如下节所述。
2.放到RAM中运行:
首先,修改工程的属性设置,在“Linker”页,去掉”Use Memory Layout from Target Dialog”前面的勾,然后点“Edit…”按钮编辑Keil自动生成的sct文件,如下图:
在sct文件中加入一个“.relocate_code”段的定义,并把它放在RAM中,如下面红字部分:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x00000000 0x00040000 { ; load region size_region
ER_IROM1 0x00000000 0x00040000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x1FFF8000 0x00008000 { ; RW data
*(.relocate_code)
.ANY (+RW +ZI)
}
}
把翻转GPIO口的程序做成一个函数,用“#pragma arm section”编译器指令把它定位到RAM中,具体程序如下:
#pragma arm section code = ".relocate_code"
void FuncInRam(void)
{
while(1)
{
PTD->PSOR = (1<<GPIO_Pin_0);
PTD->PCOR = (1<<GPIO_Pin_0);
}
}
#pragma arm section code
注意:在函数后面要用“#pragma arm section”编译器指令恢复缺省的定位,使后面的程序仍然放在FLASH中。
修改完后把程序下载到开发板运行,通过调试器界面可以看到那个函数确实是在RAM 中运行的,然后用示波器看管脚的波形。
然而,结果看到GPIO口的翻转速率仍然是7.813MHz,波形与前面一次的没有任何区别。
其实,这个结果并不是因为前面的步骤有什么错误,而是因为K60带有CACHE,并且缺省设置是使能的,CPU通过CACHE访问Flash。
当程序跳转的范围不是很大时,CPU可以直接从CACHE中得到需要的指令,CACHE的速度和RAM的速度是完全相同的,所以这种情况
下程序在RAM中运行的速度和在FLASH中运行的速度完全一样。
那么,还有没有其他的方法可以提高程序的运行速度(GPIO口的翻转速率)呢?
答案是:有的。
3.修改编译器的优化级别:
Keil下新建工程的缺省设置是不使用编译器的优化功能对程序进行优化的,因此程序的运行速度会比较慢,但是调试起来会比较方便。
要提高程序的运行速度,就要修改工程属性中“C/C++”页的“Optimization”设置,把它设为“Level 3 (-O 3)”,并且把下面的“Optimize for Time”选项打上勾。
如下图:
然后重新编译程序,下载到开发板运行,得到GPIO口的翻转速率提高到了20MHz,波形如下图:
从图中看到,GPIO口的输出波形已经不是方波,而是三角形的脉冲。
这是因为GPIO管脚的片内硬件驱动电路的翻转速度有限,在数据手册中可以查到相关的数据,与实测结果完全吻合,如下表:。