实例详解——编译器命令#pragma section作用于函数时作用域是否覆盖到其子函数...

本文通过实例探讨了在C编程中使用#pragma section命令时,当作用于函数时,是否会将子函数一并存储到指定的程序段。通过对代码的调整和编译后的map文件分析,揭示了#pragma section命令会将函数及其调用的子函数一同存储到特定段,这对于理解代码执行和存储至关重要,特别是在涉及Flash操作和RAM限制的嵌入式系统中。
摘要由CSDN通过智能技术生成

在之前的博客【链接脚本(Linker Script)应用实例(一)使用copy table将函数载入到RAM中运行】中,我们第一步使用#pragma section命令将PFlashProgram函数存储至程序段.flash_driver,具体程序如下:

#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 = 0; load_cnt < 4; 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

编译之后的map文件如下,可以看到PFlashProgram函数生成的程序段大小为280字节。下面对函数的内容进行调整后重新编译,以验证将PFlashProgram函数存储到.flash_driver程序段时是否同时也将IfxFlash_enterPageMode、IfxFlash_waitUnbusy及IfxFlash_loadPage2X32等子函数同时存储到该段。这个问题之所以值得关注,是因为若不将其子函数也存储到该段,子函数将默认存储在ROM(Flash)中,那么PFlashProgram函数执行到其子函数时将从Flash而不是RAM中取指令。由于TC297不支持Flash操作函数对其所在的Flash进行擦写(Flash大多都具有这种特性)(Flash操作函数必须在RAM中或另一个Flash Bank中运行从而执行擦写操作),PFlashProgram函数无法成功执行对PFlash的写入操作。另外,了解#pragma section命令的这个特性也有助于程序员对代码存储与执行情况的掌握。

Linker version: GNU ld version (GNU Binutils) 2.20 (TriCore) using BFD version (GNU Binutils) 2.20 (v2.3), Tool Version v2.7
Name of linker executable: c:/hightec/toolchains/tricore/v4.9.1.0-infineon-2.0/bin/../lib/gcc/tricore/4.9.4/../../../../tricore/bin/ld.exe
Date of link run: Thu Sep 05 10:42:28 2019
Name of linker map file: Flash_test.map

>>> Symbols (global (S = g) and static (S = l); sorted by address)

============================================================================================================================================================
Start      End        Size S Name                                   Memory      O-Sec        I-Sec         Input object                                     
============================================================================================================================================================
0x00000290 0x00000290    0 g __TRICORE_DERIVATE_MEMORY_MAP__        *ABS*       *ABS*        *ABS*         *ABS*
0x00000400 0x00000400    0 g LCF_ISTACK0_SIZE                       *ABS*       *ABS*        *ABS*         *ABS*
0x00000400 0x00000400    0 g LCF_ISTACK1_SIZE                       *ABS*       *ABS*        *ABS*         *ABS*
0x00000400 0x00000400    
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值