将函数载入到RAM中运行需要以下三个步骤:

(1)用编译器命令#pragma section "<section name>" <user functions> #pragma section 将想要载入RAM运行的函数存储为自定义段名的程序段,其中ax是#pragma section命令中的可选设置——<flags>,a表示allocatable,x表示executable,具体

#pragma section ".flash_driver" ax

void PFlashProgram( uint32 flash, uint32 addr, uint32 word_l, uint32 word_u )
{
uint32 load_cnt;
uint16 endinitSfty_pw = IfxScuWdt_getSafetyWatchdogPasswordInline(); IfxFlash_enterPageMode(addr); /* wait until unbusy */
IfxFlash_waitUnbusy(flash, IfxFlash_FlashType_P0); /* write 32 bytes (8 doublewords) into assembly buffer */
for (load_cnt = ; load_cnt < ; load_cnt++)
{
IfxFlash_loadPage2X32(addr, word_l, word_u);
} /* write page */
IfxScuWdt_clearSafetyEndinitInline(endinitSfty_pw);
IfxFlash_writePage(addr);
IfxScuWdt_setSafetyEndinitInline(endinitSfty_pw); /* wait until unbusy */
IfxFlash_waitUnbusy(flash, IfxFlash_FlashType_P0);
}
#pragma section

(2)在链接脚本中,以自定义的程序段为输入,定义输出段output section:

   /* user defined output section, used to allocate ram space(VMA) for code running in ram, */
/* and also allocate rom space(LMA) to store it */
.code2ram :
{
*(.flash_driver)
*(.flash_driver.*)
. = ALIGN();
} > psram_local AT> pfls0 =

(3)将该输出段.code2ram的LMA、VMA和SIZE等信息加入到copy table中,以使CPU启动时将该段(函数)从ROM拷贝到RAM中(从而正常运行)。这里贴出相关的上下文以便于读者的整体理解

  (注:这里有一个VMA和LMA概念的问题,会在之前的博文——链接脚本(linker script)用法解析(一)中讲解)

/* user defined output section, used to allocate ram space(VMA) for code running in ram, */
/* and also allocate rom space(LMA) to store it */
.code2ram :
{
*(.flash_driver)
*(.flash_driver.*)
. = ALIGN();
} > psram_local AT> pfls0 = .rodata : FLAGS(arl)
{
*(.rodata)
*(.rodata.*)
*(.gnu.linkonce.r.*)
/*
* Create the clear and copy tables that tell the startup code
* which memory areas to clear and to copy, respectively.
*/
. = ALIGN() ;
PROVIDE(__clear_table = .) ;
LONG( + ADDR(.CPU2.zbss)); LONG(SIZEOF(.CPU2.zbss));
LONG( + ADDR(.CPU2.bss)); LONG(SIZEOF(.CPU2.bss));
LONG( + ADDR(.CPU1.zbss)); LONG(SIZEOF(.CPU1.zbss));
LONG( + ADDR(.CPU1.bss)); LONG(SIZEOF(.CPU1.bss));
LONG( + ADDR(.CPU0.zbss)); LONG(SIZEOF(.CPU0.zbss));
LONG( + ADDR(.CPU0.bss)); LONG(SIZEOF(.CPU0.bss));
LONG( + ADDR(.zbss)); LONG(SIZEOF(.zbss));
LONG( + ADDR(.sbss)); LONG(SIZEOF(.sbss));
LONG( + ADDR(.bss)); LONG(SIZEOF(.bss));
LONG( + ADDR(.sbss4)); LONG(SIZEOF(.sbss4));
LONG(-); LONG(-);
PROVIDE(__copy_table = .) ;
LONG(LOADADDR(.CPU2.zdata)); LONG( + ADDR(.CPU2.zdata)); LONG(SIZEOF(.CPU2.zdata));
LONG(LOADADDR(.CPU2.data)); LONG( + ADDR(.CPU2.data)); LONG(SIZEOF(.CPU2.data));
LONG(LOADADDR(.CPU1.zdata)); LONG( + ADDR(.CPU1.zdata)); LONG(SIZEOF(.CPU1.zdata));
LONG(LOADADDR(.CPU1.data)); LONG( + ADDR(.CPU1.data)); LONG(SIZEOF(.CPU1.data));
LONG(LOADADDR(.CPU0.zdata)); LONG( + ADDR(.CPU0.zdata)); LONG(SIZEOF(.CPU0.zdata));
LONG(LOADADDR(.CPU0.data)); LONG( + ADDR(.CPU0.data)); LONG(SIZEOF(.CPU0.data));
LONG(LOADADDR(.zdata)); LONG( + ADDR(.zdata)); LONG(SIZEOF(.zdata));
LONG(LOADADDR(.sdata)); LONG( + ADDR(.sdata)); LONG(SIZEOF(.sdata));
LONG(LOADADDR(.data)); LONG( + ADDR(.data)); LONG(SIZEOF(.data));
LONG(LOADADDR(.sdata4)); LONG( + ADDR(.sdata4)); LONG(SIZEOF(.sdata4));
LONG(LOADADDR(.code2ram)); LONG( + ADDR(.code2ram)); LONG(SIZEOF(.code2ram));
LONG(-); LONG(-); LONG(-);
. = ALIGN();
} > pfls0 .text : FLAGS(axl)
{
*(.text)
*(.text.*)
*(.gnu.linkonce.t.*)
*(.gnu.warning) /* .gnu.warning sections are handled specially by elf32.em. */
. = ALIGN();
} > pfls0

以上的示例来源于TC297的Flash驱动测试程序。

链接脚本(Linker Script)应用实例(一)使用copy table将函数载入到RAM中运行的更多相关文章

  1. [转]Linux下的lds链接脚本详解

    转载自:http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml     一. 概论 每一个链接过程都由链接脚本(lin ...

  2. Linux下的lds链接脚本基础

    转载:http://soft.chinabyte.com/os/104/12255104.shtml   今天在看uboot引导Linux部分,发现要对链接脚本深入了解,才能知道各个目标文件的内存分布 ...

  3. Linux下的lds链接脚本简介

    转载:http://hubingforever.blog.163.com/blog/static/171040579201192472552886/   一. 概论 每一个链接过程都由链接脚本(lin ...

  4. [转]Linux下的链接脚本基础

    [转]http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml 1. 前言 (1)每一个链接过程都由链接脚本(linke ...

  5. Linux下的lds链接脚本详解【转】

    转自:http://www.cnblogs.com/li-hao/p/4107964.html 转载自:http://linux.chinaunix.net/techdoc/beginner/2009 ...

  6. Linux下的lds链接脚本详解

    1. 概论2. 基本概念3. 脚本格式4. 简单例子5. 简单脚本命令6. 对符号的赋值7. SECTIONS命令8. MEMORY命令9. PHDRS命令10. VERSION命令11. 脚本内的表 ...

  7. Linux下的lds链接脚本简介(一)

    转载自:http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml 一. 概论 每一个链接过程都由链接脚本(linker ...

  8. 链接脚本(Linker Script)用法解析(一) 关键字SECTIONS与MEMORY

    1.MEMORY关键字用于描述一个MCU ROM和RAM的内存地址分布(Memory Map),MEMORY中所做的内存描述主要用于SECTIONS中LMA和VMA的定义. 2.SECTIONS关键字 ...

  9. GNU linker script,ld script,GNU链接脚本

    https://blog.csdn.net/itxiebo/article/details/50937412 https://blog.csdn.net/itxiebo/article/details ...

随机推荐

  1. [转载]2.8 UiPath中断活动Break的介绍和使用

    一.Break的介绍 Break: 用于结束当前循环. 注意: Break控件只能用于For Each 循环中 二.Break在UiPath中结合For Each循环的使用 1.打开设计器,在设计库中 ...

  2. 一道笔试题(vue,react)

    题目: vue代码 <template> <div class="colculate"> <div> <select v-model=&q ...

  3. Java ->在mybatis和PostgreSQL Json字段作为查询条件的解决方案

    Date:2019-11-15 读前思考: 你没想到解决办法? PostgreSQL 数据库本身就支持还是另有解决办法? 说明:首先这次数据库使用到Json数据类型的原因,这次因为我们在做了一个app ...

  4. PHP 格式化公钥私钥(pem文件)

    <?php header("Content-Type: text/html; charset=utf-8"); $filename = dirname(__FILE__).& ...

  5. 分析facebook的AsyncDisplayKit框架,async-display使用async-transaction

    上一篇<分析facebook的AsyncDisplayKit框架中的Transaction的工作原理>介绍了fb的asdk的异步事务ASAsyncTransaction,本篇介绍其在asd ...

  6. linux后台运行程序--nobup

    用途:不挂断地运行命令. 语法:nohup Command [ Arg - ] [ & ] 描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断 ...

  7. win10中java环境变量配置

    首先,应该安装jdk,jdk的安装一般是jdk8,一般情况下去官网下载,此处有jdk8的网盘链接: -- 在安装jdk时候,可以看下这篇jdk和jre区别的博客--,有助于理解两者的区别和联系. 接触 ...

  8. 护网杯2019 mergeheap --pwn

    护网 又是签到 一天 这道题一开始 不懂得如何泄露 libc 信息,就蒙了  后来群里师傅也是刚刚好 做出 到这里 我就接着做了 . 先看下保护,发现  全开了 然后 就看下流程 大概 就是添加  c ...

  9. 真的,Kafka 入门一篇文章就够了

    初识 Kafka 什么是 Kafka Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区.多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订 ...

  10. css控制ul标签下的指定li标签样式

    ul li:first-child{ }  第一个ul li:last-child{ }   最后一个ul li:nth-child(4){ } 指定第几个,4就是代表第四个ul li:nth-chi ...