美文网首页
【嵌入式】使代码在RAM中运行

【嵌入式】使代码在RAM中运行

作者: Blue_Well | 来源:发表于2020-06-11 15:11 被阅读0次

    目前很多芯片都是with cache的运行机制,就是需要先把代码从Flash中拷贝到Cache中才能执行,这种方式有一个通病,就是代码首次被执行的时候速度会比较慢。如果是类似通过GPIO模拟一些协议的应用,那么这个问题就会直接造成第一次操作外设失败的情况,对于某些应用来说是不允许的。在keil中有一个比较好的方法,就是先将代码拷贝到RAM中再执行。
    实现方法:
    通过查看Option->Target,可以看到ROM的起始地址是0x1000000,RAM的起始地址是0x20003000,即我们的目标就是需要将代码拷贝到0x20003000地址中执行。

    1. 打开Option->Linker,然后按照以下步骤操作。
    1. 在.sct文件中增加以下代码,“RAMCODE”可以自定义。
    1. 将需要在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的大小,可能会被释放掉,等下次执行的时候需要重新搬。

    相关文章

      网友评论

          本文标题:【嵌入式】使代码在RAM中运行

          本文链接:https://www.haomeiwen.com/subject/viybtktx.html