0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

把指定代码、常数或变量到某个特定地址的一个方法

麦辣鸡腿堡 来源:Microchip微芯 作者:Microchip微芯 2023-01-22 14:52 次阅读

问:如何指定代码、常数或变量到某个特定的地址?

答:使用“#pragma psect”伪指令来把代码、常数或变量放到你定制的psect。于是你就可以使用链接器选项来把这个定制的psect放到你想要的地址。Pragma psect的语法是:

#pragma psect original_psect=new_psect

这里的“original_psect”是标准的code、constant或变量原来位于的psect名称,这个orignal psect名称可以从map文件的symbol table里找到。 一个symbol table的示例:

__Lstrings strings 0008 __Lstringtable stringtable 0008

__Lstruct struct 0020 __Ltemp temp 0070

__Ltext text 0190 __Lvectors vectors 000B

__S0 (abs) 0800 __S1 (abs) 0190

_exit init 0004 _main text0 07FD

_serial const1 0009 intlevel0 intentry 0004

_serial const1 0009 ; 这个变量是这样声明的“const int serial = 5621;”

_serial是变量名加前下划线,const1是psect名称

这里在“const”后面有一个数字,也即“const1”,这个数字可以是任何数字,也就是说,它不一定是1。你可以使用“%%u”来代替这个数字,对于大部分的后面带有数字的psect都可以这样,除了rbss_x和rdata_x。因为rbss_x和rdata_x是每个bank的RAM变量,rbss_0代表bank 0,rbss_1代表bank 1,依此类推……

“new_psect”是你要定制的psect的名称,可以使任意名称,但是不能和标准psect同名。

示例,声明把“serial”放到一个新的psect里去是这样做的:

#pragma psect const%%u=fixed_serial

const int serial = 5621;

每一个“#pragma psect”伪指令应该是在一个独立的文件中被声明,也就是说,所有的在“#pragma psect”下面声明的变量都会被放到新的定制psect中去。

// --File serial.c

#pragma psect const%%u=fixed_serial

const int serial = 5621;

// --End file

// --File serial.h

extern int serial;

// --End file

具体放置这个新的定制psect,你将需要加入一些额外的命令行选项。

-L-Pcustom_psect=addressh

这里'-L'是传递选项给链接器,'-P'是定位一个psect到特定的地址,'custom_psect'是你想要定位的psect的名称,'addressh'是你想要定位到的16进制地址。例如:

PICC -16f877 main.c serial.c -L-Pfixed_serial=50h

对于'text' psect有一些特殊问题。一个类似于'#pragma psect text%%u=myPsect'的伪指令会把所有的text psect放置到单个用户定制的psect里。而优化器一直认为每个psect只包含一个函数。这将会产生bank切换的错误。

要避免这个问题,可以对用户定制psect名称也使用'%%u'后缀,例如:

#pragma psect text%%u=myPsect%%u

这样多个用户定制的psect将被产生。

例如:

//file test.c

#pragma psect text%%u=myPsect%%u

void func()

{

}

void func2()

{

}

void main()

{

}

//end file

你可以从列表文件和map文件中看到下面这些信息

'func()' is in psect 'myPsect0'

'func1()' is in psect 'myPsect1'

'main()' is in psect 'myPsect2'

你于是就可以用'-L-P'选项给每一个psect清楚地分配地址。

所以,要把这些函数放到500h地址,你可以使用下面的编译选项:

-L-PmyPsect0=500h,myPsect1,myPsect2

请注意-L-P 选项是没有ROM页边界的检查,你需要自己确保这个函数(psect)是不会超越页边界的,(译者注:PICC要求每个函数都必须是在同一个ROM页里的)。请查看使用说明书来得到更多关于'#pragma psect'的信息。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码器
    +关注

    关注

    41

    文章

    3360

    浏览量

    131539
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66771
收藏 人收藏

    评论

    相关推荐

    softune如何变量定义在指定RAM地址

    你好,请问如何变量定义在指定RAM地址? 例如
    发表于 01-18 10:48

    TC275如何将指定变量放在指定地址中?

    如何在代码中以及Lcf_Gnuc.lsl如何修改,能够将某个变量放在指定地址中,能否给示例
    发表于 02-06 08:08

    IAR小课堂 | 如何将组函数变量放在特定段内

    本文描述了在不使用多个#pragma location指令的情况下,在指定的段中放置多个函数变量的两种方法。讨论可以使用#pragma location将
    发表于 12-11 10:02

    如何在特定地址放置变量

    如何在特定地址放置变量? - spartan3e - microblaze - SDK 14.2
    发表于 04-06 15:02

    有办法802.1as的协议报文队列指定某个特定的qos队列中去吗

    按照手册执行qbv的测试时,发现802.1as的协议报文也会被qbv的门控限制住,那么请问是否有办法802.1as的协议报文队列指定某个特定的qos队列中,避免被误伤?
    发表于 12-31 07:28

    MuonRiber studio中怎么变量定义在指定地址

    MuonRiber studio中我怎么变量定义在指定地址,或是怎么变量定义在
    发表于 09-14 06:36

    如何在Keil中将函数变量编译到指定地址

    如何在Keil中将函数变量编译到指定地址在Keil 中将函数变量编译到
    发表于 10-19 06:51

    全局变量和成员变量的区别分析

    成员变量指定维度的成员变量,用于标识某个维度成员。简介由 Analysis Services 内部使用的值,以标识某个维度成员。Membe
    发表于 12-11 13:50 6730次阅读
    全局<b class='flag-5'>变量</b>和成员<b class='flag-5'>变量</b>的区别分析

    全局变量和成员变量的区别分析

    成员变量指定维度的成员变量,用于标识某个维度成员。简介由 Analysis Services 内部使用的值,以标识某个维度成员。Membe
    发表于 12-11 13:50 1147次阅读
    全局<b class='flag-5'>变量</b>和成员<b class='flag-5'>变量</b>的区别分析

    如何将变量存储在指定内存地址 (基于Keil MDK-ARM)

    如何将变量存储在指定内存地址(基于Keil MDK-ARM)
    的头像 发表于 02-29 16:32 1.3w次阅读
    如何将<b class='flag-5'>变量</b>存储在<b class='flag-5'>指定</b>内存<b class='flag-5'>地址</b> (基于Keil MDK-ARM)

    Keil中指定代码段与常量在Flash中地址方法

    图 分配代码文件到Flash指定位置方法 在.sct文件中指定代码输出文件(.o格式)到Flash
    发表于 11-20 14:36 20次下载
    Keil中<b class='flag-5'>指定</b><b class='flag-5'>代码</b>段与常量在Flash中<b class='flag-5'>地址</b><b class='flag-5'>方法</b>

    【STM32CubeIDE】将变量定义到指定地址

    使用Keil在使用Keil编写程序的时候我们可以很轻松的将变量定义到指定地址uint8_t array[1024] __attribute__((at(0x20010000
    发表于 12-27 19:08 27次下载
    【STM32CubeIDE】将<b class='flag-5'>变量</b>定义到<b class='flag-5'>指定</b><b class='flag-5'>地址</b>

    映射位到某个RAM变量方法

    问:我想访问某个字节中的单个位,但是当我尝试用绝对变量结构定义一个位变量时,例如: static bit bitvar @ ((unsigned)bytevar)*8+0; 我得到一个编译
    的头像 发表于 01-22 15:11 398次阅读

    基于IAR指定RL78程序地址空间说明

    基于IAR实现C文件指定地址存放&函数指定地址存放,定义变量指定
    的头像 发表于 06-19 15:24 1564次阅读
    基于IAR<b class='flag-5'>指定</b>RL78程序<b class='flag-5'>地址</b>空间说明

    js中如何判断数组中包含某个特定的值

    在JavaScript中,我们可以通过多种方法来判断一个数组中是否包含某个特定的值。以下是一些常用的方法: 使用indexOf()方法:in
    的头像 发表于 11-30 16:21 354次阅读