【嵌入式】使代码在RAM中运行
2020-06-11 本文已影响0人
Blue_Well
目前很多芯片都是with cache的运行机制,就是需要先把代码从Flash中拷贝到Cache中才能执行,这种方式有一个通病,就是代码首次被执行的时候速度会比较慢。如果是类似通过GPIO模拟一些协议的应用,那么这个问题就会直接造成第一次操作外设失败的情况,对于某些应用来说是不允许的。在keil中有一个比较好的方法,就是先将代码拷贝到RAM中再执行。
实现方法:
通过查看Option->Target,可以看到ROM的起始地址是0x1000000,RAM的起始地址是0x20003000,即我们的目标就是需要将代码拷贝到0x20003000地址中执行。
- 打开Option->Linker,然后按照以下步骤操作。
- 在.sct文件中增加以下代码,“RAMCODE”可以自定义。
- 将需要在RAM中执行的代码放在#pragma arm section code = "RAMCODE"和#pragma arm section之间,然后调用即可。
对比验证:
默认情况下,编译工程后从map文件可以看到,函数是存放在ROM(addr = 0x10005205)中的。
而通过上述方法编译后,函数改存放到RAM中(addr = 0x20003001)。
另外的方法:
右键main.c->Options for File,按照下图选择IRAM。
按照下图所示操作。
配置完之后,重新编译工程,下载到目标板中,main.c的代码就会在RAM中运行。
对比验证:
默认情况下,main函数会分配在ROM区(addr = 0x10005224)
经过上面的配置后,函数改存放到RAM中(addr = 0x20005478)。
总结
在ROM区执行和RAM区执行的区别在于,前者是只有当代码需要的时候,Cache才会从flash中搬出来运行,而后者是在上电初始化的时候就已经全部搬过去了,所以在运行的时候函数已经在RAM中了,并且这段代码会一直占用这个RAM不会被释放,类似于一个全局变量。前者如果超出了Cache的大小,可能会被释放掉,等下次执行的时候需要重新搬。