在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于 IAR Embedded Workbench 的自研 MCU 芯片軟件函數與變量內存布局優化精控方法

安芯 ? 來源:jf_29981791 ? 作者:jf_29981791 ? 2025-04-30 16:38 ? 次閱讀

嵌入式軟件開發領域,MCU芯片軟件的架構設計與內存布局的精細規劃對系統性能和穩定性起著關鍵作用。本文檔聚焦于IAR Embedded Workbench環境下,為自研MCU芯片軟件提供了一套詳盡的函數和變量指定section放置方法與操作流程,兼具過程記錄與詳細說明,旨在打造一份實用的參考指南,助力開發者精準掌控程序的內存分布與執行邏輯。文檔涵蓋從默認section表的介紹,到多種放置手段的闡釋,以及實際配置示例的展示,為后續的開發工作奠定堅實基礎。

IAR Embedded Workbench作為一款廣受認可的嵌入式開發工具,具備豐富的功能與靈活的配置選項。在該環境下,軟件開發者可巧妙運用多種方法,將函數和變量精準放置于指定的section中。這一操作對于優化程序的內存使用效率、提升系統響應速度以及增強代碼的可維護性具有重要意義。例如,通過將特定的代碼或數據放置在合適的內存區域,可以充分利用MCU芯片的硬件特性,實現更高效的緩存利用、減少內存訪問延遲等效果。

文檔深入淺出地講解了多種放置方式,包括使用@操作符、#pragma location命令、GCC風格的attribute屬性以及#pragma default_variable_attributes和#pragma default_function_attributes命令等,開發者可根據實際需求靈活選擇。同時,還提供了諸如as32x601_rom.icf、Port_MemMap.h和Port.c等實際配置示例,涵蓋了從內存區域定義、section分配到函數與變量屬性設置的完整流程,為開發者提供了直觀且易于實踐的參考。

默認section表

IAR Embedded Workbench中有很多默認的section用于放置對應的變量和函數:

除了用于您的應用程序的ELF部分之外,這些工具還出于多種目的使用許多其他ELF段:

  • 以.debug開頭的段通常包含DWARF格式的調試信息。
  • 以.iar.debug開頭的段包含IAR格式的補充調試信息
  • 以.comment開頭的段包含用于構建文件的工具和命令行
  • 以.rel或.rela開頭的段包含ELF重定位信息
  • 以.symtab開頭的段包含文件的符號表
  • 以.strtab開頭的段包含符號表中符號的名稱
  • 以.shstrtab開頭的段包含各段的名稱。

將變量放到指定的section

使用@操作符

可以使用 @ 將變量放到指定的section:

staticuint32_t TaskCounter @".mcal_const_cfg" = 1;

使用 #pragma location 命令

可以使用 #pragma location命令將變量放到指定的section:

#pragma location = ".mcal_const_cfg"staticuint32_t TaskCounter = 1;

使用 GCC 風格的屬性 attribute ((section ))

可以使用 GCC 風格的屬性 attribute ((section ))將變量放到指定的section:

staticuint32_t TaskCounter attribute ((section (".mcal_const_cfg"))) = 1;

使用 #pragma default_variable_attributes 命令

上面的方法可以將單個變量放到指定的section,如果需要將多個變量放到指定的section,上面的方法會顯得有點繁瑣。可以使用 #pragma default_variable_attributes 命令將多個變量放到指定的section:

#pragma default_variable_attributes = @ ".mcal_const_cfg"staticuint32_t TaskCounter = 1; staticuint32_t TaskLedRedCounter = 2; #pragma default_variable_attributes =

將函數放到指定的section

使用@操作符

可以使用 @ 將函數放到指定的section:

voidStartTaskLedRed(void *argument) @ ".mcal_text";

使用 #pragma location 命令

可以使用 #pragma location命令將函數放到指定的section:

#pragma location = ".mcal_text"voidStartTaskLedRed(void *argument);

使用 GCC 風格的屬性 attribute ((section ))

可以使用 GCC 風格的屬性 attribute ((section ))將函數放到指定的section:

voidStartTaskLedRed(void *argument) attribute ((section (".mcal_text")));

使用 #pragma default_variable_attributes 命令

上面的方法可以將單個函數放到指定的section,如果需要將多個函數放到指定的section,上面的方法會顯得有點繁瑣。可以使用 #pragma default_function_attributes命令將多個函數放到指定的section:

#pragma default_function_attributes = @ ".mcal_text"voidStartTaskLedRed(void *argument); voidStartTaskLedGreen(void *argument); voidStartTaskLedBlue(void *argument); #pragma default_function_attributes =

使用示例

as32x601_rom.icf

/****************************************************************************** * FILE VERSION / define exported symbol _link_file_version_2 = 1; / * SPECIALS // * * MEMORY REGIONS / define symbol ICFEDIT_region_FLASH_start = 0x10000000; define symbol ICFEDIT_region_FLASH_end = 0x11FFFFFF; define symbol ICFEDIT_region_SRAM0_start = 0x20000000; define symbol ICFEDIT_region_SRAM0_end = 0x2001FFFF; define symbol ICFEDIT_region_SRAM1_start = 0x20020000; define symbol ICFEDIT_region_SRAM1_end = 0x2003FFFF; define symbol ICFEDIT_region_SRAM2_start = 0x20040000; define symbol ICFEDIT_region_SRAM2_end = 0x2005FFFF; define symbol ICFEDIT_region_SRAM3_start = 0x20060000; define symbol ICFEDIT_region_SRAM3_end = 0x2007FFFF; / * * SIZES / define symbol ICFEDIT_size_cstack = 0x2000; define symbol ICFEDIT_size_proc_stack = 0x0; define symbol ICFEDIT_size_heap = 0x2000; / * * BUILD FOR ROM *****************************************************************************/ keep symbol __iar_cstart_init_gp; define memory mem with size = 4G; define region ROM_region = mem:[from ICFEDIT_region_FLASH_start to ICFEDIT_region_FLASH_end ]; define region RAMCODE_region = mem:[from ICFEDIT_region_SRAM0_start to ICFEDIT_region_SRAM0_end ]; define region RAM_region = mem:[from ICFEDIT_region_SRAM1_start to ICFEDIT_region_SRAM1_end ] | mem:[from ICFEDIT_region_SRAM2_start to ICFEDIT_region_SRAM2_end ]; initialize by copy { readwrite }; do not initialize { section .noinit }; define block CSTACK with alignment = 16, size = CSTACK_SIZE { }; define block HEAP with alignment = 16, size = HEAP_SIZE { }; define block RW_DATA { rw section .data}; define block RW_DATA_INIT { ro section .data_init}; define block RW_BSS {rw section .bss}; define block RW_DATA_ALL with static base GPREL { block RW_DATA, block RW_BSS }; "STARTUP" : place at start of ROM_region { readonly section .init }; place in ROM_region { readonly, block RW_DATA_INIT }; place in ROM_region { readonly section .text, section .mcal_text, section .access_code_rom}; place in ROM_region { readonly section .rodata, section .mcal_const_cfg, section .mcal_const, section .mcal_const_no_cacheable}; place in RAMCODE_region { readwrite section .text, section .ramcode, block RW_DATA_ALL }; place in RAM_region { readwrite, block CSTACK, block HEAP }; place in RAM_region { section .mcal_data, section .dma_dest_buffer, section .mcal_shared_data }; place in RAM_region { section .mcal_bss, section .mcal_bss_no_cacheable, section .dma_dest_buffer_bss, section .mcal_shared_bss };

第13、14行:定義FLASH,起始地址和結束地址。 第41行:定義了ROM_region區域,起始地址和結束地址。 第63行:定義一個名為 ROM_region 的內存區域,并將三個只讀代碼段 .text、.mcal_text 和 .access_code_rom 放置在這個區域內。。

Port_MemMap.h

#define MEMMAP_MISSMATCH_CHECKER#if defined (_IAR_C_AS32x601_)#ifdef PORT_START_SEC_CODE#undef PORT_START_SEC_CODE#undef MEMMAP_MISSMATCH_CHECKER#pragma default_function_attributes = @ ".mcal_text"#endif#ifdef PORT_STOP_SEC_CODE#undef PORT_STOP_SEC_CODE#undef MEMMAP_MISSMATCH_CHECKER#pragma default_function_attributes =#endif#endif#ifdef MEMMAP_MISSMATCH_CHECKER#error"MemMap.h, No valid section define found."#endif

第1行:定義了一個宏 MEMMAP_MISSMATCH_CHECKER,用于檢查包含的正確的符號。 第3行:定義了一個ifdef,當定義了 IAR_C_AS32x601 時,會執行下面的代碼。 第5行:定義了一個ifdef,當定義了 PORT_START_SEC_CODE 時,會執行下面的代碼。 第11行:定義了一個ifdef,當定義了 PORT_STOP_SEC_CODE 時,會執行下面的代碼。 第19行:定義了一個ifdef,當定義了 MEMMAP_MISSMATCH_CHECKER 時,說明輸入定義錯誤,將會拋出一個錯誤。

Port.c

#define PORT_START_SEC_CODE#include"Port_MemMap.h" FUNC(void, PORT_CODE) Port_Init(P2CONST(Port_ConfigType, AUTOMATIC, PORT_APPL_CONST) ConfigPtr) { #if (PORT_ENABLE_DEV_ERROR_DETECT == STD_ON)/* When PostBuild is used and #(Variants) > 1, the input parameter 'ConfigPtr' is mandatory to be different than NULL_PTR. * In case of error, return immediately and report DET errors. */#if (PORT_PRECOMPILE_SUPPORT == STD_ON)if (NULL_PTR != ConfigPtr) { #elseif (NULL_PTR == ConfigPtr) { #endif/* (PORT_PRECOMPILE_SUPPORT == STD_ON) *//* If development error detection for the Port module is enabled: * The function shall raise the error PORT_E_INIT_FAILED if the parameter ConfigPtr is Null Pointer.*/ (void)Det_ReportError((uint16)PORT_MODULE_ID, PORT_INSTANCE_ID, PORT_INIT_ID, PORT_E_INIT_FAILED); } else { #endif/* (PORT_ENABLE_DEV_ERROR_DETECT == STD_ON) */#if (PORT_PRECOMPILE_SUPPORT == STD_ON) l_PortConfig_ptr = &Port_PreCompileConfig_st; /* Avoid compiler warning */ (void)ConfigPtr; #else/* (PORT_PRECOMPILE_SUPPORT == STD_OFF) */ l_PortConfig_ptr = ConfigPtr; #endif/* (PORT_PRECOMPILE_SUPPORT == STD_ON) *//* Initializes the Port driver with the given configuration */ Port_LLDriver_Init(l_PortConfig_ptr); #if (PORT_ENABLE_DEV_ERROR_DETECT == STD_ON) } #endif/* (PORT_ENABLE_DEV_ERROR_DETECT == STD_ON) */ } #define PORT_STOP_SEC_CODE#include"Port_MemMap.h"

第1行:定義了一個宏 PORT_START_SEC_CODE,將會執行#pragma default_function_attributes = @ ".mcal_text",會將函數放置在.mcal_text區域。 第32行:定義了一個宏 PORT_STOP_SEC_CODE,會結束函數的默認屬性設置。

效果示例

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17718

    瀏覽量

    358155
  • IAR
    IAR
    +關注

    關注

    5

    文章

    367

    瀏覽量

    37123
收藏 人收藏

    評論

    相關推薦

    IAR全面支持芯馳科技車規MCU芯片E3650

    2025年4月22日,全場景智能車芯引領者芯馳科技與全球嵌入式軟件開發解決方案領導者IAR正式宣布,IAR Embedded Workbench
    的頭像 發表于 04-23 15:45 ?415次閱讀

    如何將項目從IAR遷移到Embedded Studio

    本文描述如何將IAR EWARM項目遷移到SEGGER Embedded Studio(簡稱SES)中。
    的頭像 發表于 02-25 17:11 ?378次閱讀
    如何將項目從<b class='flag-5'>IAR</b>遷移到<b class='flag-5'>Embedded</b> Studio

    IAR與紫光同芯合作,全面支持THA6系列汽車芯片

    近日,全球領先的嵌入式系統開發軟件解決方案提供商IAR與業內知名的芯片及解決方案提供商紫光同芯攜手宣布,最新版本的IAR Embedded
    的頭像 發表于 12-27 11:46 ?1126次閱讀

    IAR Systems最新版開發環境全面賦能芯海科技32位MCU芯片

    隨著IAR Embedded Workbench for Arm 9.32版本對芯海科技MCU系列的全面支持,雙方將攜手為開發者提供更加高效、便捷的開發體驗,共同推動物聯網、工業控制、
    的頭像 發表于 11-14 14:47 ?764次閱讀
    <b class='flag-5'>IAR</b> Systems最新版開發環境全面賦能芯海科技32位<b class='flag-5'>MCU</b><b class='flag-5'>芯片</b>

    IAR支持旗芯微車規級MCU,助力汽車行業智能化發展

    在全球汽車電子產業迅猛發展的背景下,IAR與蘇州旗芯微半導體有限公司(簡稱“旗芯微”)攜手宣布了一項重大合作成果:IAR Embedded Workbench for Arm 9.60
    的頭像 發表于 10-23 11:09 ?975次閱讀

    比亞迪最快于11月實現算法量產,推進智駕芯片進程

    10月21日市場傳出消息,比亞迪正計劃整合其新技術院下的智能駕駛團隊,目標是在今年11月實現智能駕駛算法的量產,并持續推進智能駕駛芯片
    的頭像 發表于 10-22 15:57 ?1217次閱讀

    IAR與芯科集成攜手,賦能中國汽車行業RISC-V MCU創新研發

    2024年7月16日,全球嵌入式系統開發軟件領域的領軍者IAR Systems與芯科集成電路(簡稱“芯科集成”)聯合宣布了一項重要合作成果:IAR Embedded
    的頭像 發表于 07-17 14:37 ?2w次閱讀

    ?IAR全面支持芯科集成CX3288系列車規RISC-V MCU

    全球領先的嵌入式系統開發軟件解決方案供應商IAR與芯科集成電路(以下簡稱“芯科集成”)聯合宣布,最新版本IAR Embedded Workbench
    的頭像 發表于 07-16 17:32 ?965次閱讀
    ?<b class='flag-5'>IAR</b>全面支持芯科集成CX3288系列車規RISC-V <b class='flag-5'>MCU</b>

    芯科集成與IAR展開生態合作,IAR全面支持CX3288系列車規MCU

    IAR嵌入式開發解決方案已全面支持芯科集成CX3288系列車規RISC-V MCU,共同推動汽車高品質應用的安全開發 中國上海,2024年7月16日——全球領先的嵌入式系統開發軟件解決方案供應商
    發表于 07-16 16:17 ?383次閱讀

    IAR全面支持芯馳科技E3系列車規MCU產品E3119/E3118

    IAR與全場景智能車芯引領者芯馳科技宣布進一步擴大合作,最新版IAR Embedded Workbench for Arm已全面支持芯馳科技的E3119/E3118車規級
    的頭像 發表于 07-15 10:16 ?138次閱讀
    <b class='flag-5'>IAR</b>全面支持芯馳科技E3系列車規<b class='flag-5'>MCU</b>產品E3119/E3118

    IAR全面支持矽力杰SA32系列車規MCU

    在全球嵌入式系統開發軟件領域,IAR以其卓越的解決方案而享有盛譽。近日,IAR與矽力杰半導體達成戰略合作,共同宣布即將推出的IAR Embedded
    的頭像 發表于 06-27 17:27 ?1166次閱讀

    IAR將推出全面支持矽力杰SA32BXX車規ASIL-B MCU

    26日——全球領先的嵌入式系統開發軟件解決方案供應商IAR與矽力杰半導體(以下簡稱“矽力杰”)聯合宣布,即將推出的最新版本IAR Embedded
    的頭像 發表于 06-26 15:08 ?929次閱讀

    芯海通用 MCU應用筆記 :在 IAR 及 MDK 開發環境下使用 printf 函數重定向移植差異指南

    最新發布的集成開發環境 IAR Embedded Workbench for Arm 9.32 版本已全面支持芯海科技 32 位 MCU 芯片
    發表于 05-16 11:56

    芯海應用筆記:通用 MCU 基于 IAR 芯片IAR9 開發指南

    MCU 芯片。芯海科技基于 IAR 環境開發芯片包,給用戶更多的編譯選擇,提高用戶開發靈活性。本應用筆記從芯片包結構、DEMO 例程下載使
    發表于 05-16 11:52

    IAR版本為Embedded Workbench 6.5 Kickstart 1.4 編繹報錯怎么解決?

    請教 IAR 這個錯誤是什么問題 在IAR版本為Embedded Workbench 6.0 Kickstart 1.30 編繹正常沒出錯 在I
    發表于 05-09 06:36
    主站蜘蛛池模板: 伊人久久综合成人亚洲 | good韩国理论在线三级 | www射射一区 | 一本到视频在线 | 婷婷综合五月天 | 欧美色成人综合 | 国产精品9999久久久久仙踪林 | 欧美激情xxxx性bbbb | 日本高清不卡视频 | 一级特黄a 大片免费 | 国模于子涵啪啪大胆 | 亚洲一区二区影视 | 午夜免费剧场 | 黄色美女网站在线观看 | 成人二区 | 欧日韩视频777888 | 羞羞色男人的天堂伊人久久 | 国产婷婷高清在线观看免费 | vr性资源在线观看 | 欧美精品啪啪 | 亚洲天堂网在线观看 | 婷婷色综合久久 | 欧美色吧视频在线观看 | 午夜黄色影片 | 性欧美videofree另类超大 | 日韩免费视频一区二区 | 狠狠色噜噜狠狠狠狠黑人 | 国产成人v爽在线免播放观看 | 免费伦费一区二区三区四区 | 男人操女人免费 | 欧美jizzhd精品欧美4k | 日本精品一在线观看视频 | 天天操天天干天天插 | 一级片免费视频 | 色婷婷在线观看视频 | 噜噜噜色网 | v天堂网| 欧美日本俄罗斯一级毛片 | 长腿丝袜美女被啪啪 | 国产狂喷冒白浆免费视频 | 天天干天天操天天添 |