91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于 IAR Embedded Workbench 的自研 MCU 芯片軟件函數(shù)與變量內(nèi)存布局優(yōu)化精控方法

安芯 ? 來源:jf_29981791 ? 作者:jf_29981791 ? 2025-04-30 16:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

默認(rèn)section表

IAR Embedded Workbench中有很多默認(rèn)的section用于放置對(duì)應(yīng)的變量和函數(shù):

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

  • 以.debug開頭的段通常包含DWARF格式的調(diào)試信息。
  • 以.iar.debug開頭的段包含IAR格式的補(bǔ)充調(diào)試信息
  • 以.comment開頭的段包含用于構(gòu)建文件的工具和命令行
  • 以.rel或.rela開頭的段包含ELF重定位信息
  • 以.symtab開頭的段包含文件的符號(hào)表
  • 以.strtab開頭的段包含符號(hào)表中符號(hào)的名稱
  • 以.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 風(fēng)格的屬性 attribute ((section ))

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

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

使用 #pragma default_variable_attributes 命令

上面的方法可以將單個(gè)變量放到指定的section,如果需要將多個(gè)變量放到指定的section,上面的方法會(huì)顯得有點(diǎn)繁瑣??梢允褂?#pragma default_variable_attributes 命令將多個(gè)變量放到指定的section:

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

將函數(shù)放到指定的section

使用@操作符

可以使用 @ 將函數(shù)放到指定的section:

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

使用 #pragma location 命令

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

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

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

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

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

使用 #pragma default_variable_attributes 命令

上面的方法可以將單個(gè)函數(shù)放到指定的section,如果需要將多個(gè)函數(shù)放到指定的section,上面的方法會(huì)顯得有點(diǎn)繁瑣??梢允褂?#pragma default_function_attributes命令將多個(gè)函數(shù)放到指定的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,起始地址和結(jié)束地址。 第41行:定義了ROM_region區(qū)域,起始地址和結(jié)束地址。 第63行:定義一個(gè)名為 ROM_region 的內(nèi)存區(qū)域,并將三個(gè)只讀代碼段 .text、.mcal_text 和 .access_code_rom 放置在這個(gè)區(qū)域內(nèi)。。

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行:定義了一個(gè)宏 MEMMAP_MISSMATCH_CHECKER,用于檢查包含的正確的符號(hào)。 第3行:定義了一個(gè)ifdef,當(dāng)定義了 IAR_C_AS32x601 時(shí),會(huì)執(zhí)行下面的代碼。 第5行:定義了一個(gè)ifdef,當(dāng)定義了 PORT_START_SEC_CODE 時(shí),會(huì)執(zhí)行下面的代碼。 第11行:定義了一個(gè)ifdef,當(dāng)定義了 PORT_STOP_SEC_CODE 時(shí),會(huì)執(zhí)行下面的代碼。 第19行:定義了一個(gè)ifdef,當(dāng)定義了 MEMMAP_MISSMATCH_CHECKER 時(shí),說明輸入定義錯(cuò)誤,將會(huì)拋出一個(gè)錯(cuò)誤。

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行:定義了一個(gè)宏 PORT_START_SEC_CODE,將會(huì)執(zhí)行#pragma default_function_attributes = @ ".mcal_text",會(huì)將函數(shù)放置在.mcal_text區(qū)域。 第32行:定義了一個(gè)宏 PORT_STOP_SEC_CODE,會(huì)結(jié)束函數(shù)的默認(rèn)屬性設(shè)置。

效果示例

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    147

    文章

    18917

    瀏覽量

    397870
  • IAR
    IAR
    +關(guān)注

    關(guān)注

    5

    文章

    409

    瀏覽量

    38535
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    成功點(diǎn)亮并上車!對(duì)標(biāo)Orin X,Momenta芯片來了

    電子發(fā)燒友網(wǎng)報(bào)道(文/梁浩斌)近日有消息稱,輔助駕駛系統(tǒng)供應(yīng)商Momenta的芯片已經(jīng)成功點(diǎn)亮,并開始進(jìn)行裝車測(cè)試。 ? 這也意味著,2023年Momenta從外部合作轉(zhuǎn)向
    的頭像 發(fā)表于 08-14 09:10 ?8272次閱讀
    成功點(diǎn)亮并上車!對(duì)標(biāo)Orin X,Momenta<b class='flag-5'>自</b><b class='flag-5'>研</b><b class='flag-5'>芯片</b>來了

    嵌入式軟件開發(fā)工具市場(chǎng)新動(dòng)向:訂閱制趨勢(shì)下的中國開發(fā)者選擇

    面對(duì)軟件業(yè)從永久授權(quán)模式廣泛轉(zhuǎn)向訂閱制的行業(yè)趨勢(shì),作為行業(yè)兩大主流嵌入式軟件開發(fā)工具,即Keil MDK與IAR Embedded Workbenc
    的頭像 發(fā)表于 01-30 17:20 ?721次閱讀
    嵌入式<b class='flag-5'>軟件</b>開發(fā)工具市場(chǎng)新動(dòng)向:訂閱制趨勢(shì)下的中國開發(fā)者選擇

    瑞薩RL78F2x系列MCU在三種開發(fā)環(huán)境下的選項(xiàng)字節(jié)與安全I(xiàn)D設(shè)置方法

    不同的開發(fā)環(huán)境,設(shè)置方法也各不相同。本文將手把手教你如何在主流的CS+for CC、e2studio和IAR Embedded Workbench中完成這兩項(xiàng)重要配置。
    的頭像 發(fā)表于 12-11 16:33 ?4616次閱讀
    瑞薩RL78F2x系列<b class='flag-5'>MCU</b>在三種開發(fā)環(huán)境下的選項(xiàng)字節(jié)與安全I(xiàn)D設(shè)置<b class='flag-5'>方法</b>

    通過優(yōu)化代碼來提高MCU運(yùn)行效率

    。 內(nèi)存訪問優(yōu)化 充分利用緩存:如果MCU有Cache,盡量保證代碼和數(shù)據(jù)的局部性,即讓相關(guān)的數(shù)據(jù)在內(nèi)存中連續(xù)存放。 避免內(nèi)存碎片:在動(dòng)態(tài)
    發(fā)表于 11-12 08:21

    CW32 MCU用什么IDE開發(fā)?

    推薦使用IAR Embedded Workbench for ARM、Keil μVision for ARM等IDE開發(fā)CW32 MCU應(yīng)用,其中新版本
    發(fā)表于 11-12 07:52

    如何在IAR Embedded Workbench for Arm中開發(fā)和調(diào)試Infineon MOTIX MCU

    Infineon MOTIX MCU集成了感應(yīng)、控制和驅(qū)動(dòng)電機(jī)的所有基本功能,支持繼電器、半橋和全橋直流和 BLDC 電機(jī)應(yīng)用,為先進(jìn)的電機(jī)控制應(yīng)用提供全面的解決方案[1]。
    的頭像 發(fā)表于 11-08 14:24 ?8251次閱讀
    如何在<b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b> for Arm中開發(fā)和調(diào)試Infineon MOTIX <b class='flag-5'>MCU</b>

    如何在 IAR Embedded Workbench for ARM 開發(fā)環(huán)境中啟用可配置數(shù)據(jù)閃存并設(shè)置大小?

    如何在 IAR Embedded Workbench for ARM 開發(fā)環(huán)境中啟用可配置數(shù)據(jù)閃存并設(shè)置大?。?/div>
    發(fā)表于 08-26 07:49

    請(qǐng)問如何在 IAR Embedded Workbench for ARM 開發(fā)環(huán)境中啟用可配置數(shù)據(jù)閃存并設(shè)置大小?

    如何在 IAR Embedded Workbench for ARM 開發(fā)環(huán)境中啟用可配置數(shù)據(jù)閃存并設(shè)置大???
    發(fā)表于 08-20 06:23

    Arm CEO:公司正在芯片

    據(jù)外媒路透社報(bào)道,Arm CEO Rene Haas透露,Arm正在投資開發(fā)自有芯片,并計(jì)劃將部分利潤投資于制造自己的芯片和其他組件。與之對(duì)應(yīng)的是Arm預(yù)測(cè)的下一財(cái)季經(jīng)營業(yè)績也會(huì)因?yàn)?b class='flag-5'>自
    的頭像 發(fā)表于 07-31 11:49 ?619次閱讀

    「芯生態(tài)」杰發(fā)科技AC7870攜手IAR開發(fā)工具鏈,助推汽車電子全棧全域智能化落地

    IAR Embedded Workbench for Arm已全面支持杰發(fā)科技AutoChips車規(guī)級(jí)MCU AC7870,為其提供涵蓋開發(fā)、調(diào)試、
    的頭像 發(fā)表于 07-22 12:06 ?681次閱讀
    「芯生態(tài)」杰發(fā)科技AC7870攜手<b class='flag-5'>IAR</b>開發(fā)工具鏈,助推汽車電子全棧全域智能化落地

    高端芯片,服務(wù)器芯片傳來好消息!

    電子發(fā)燒友網(wǎng)報(bào)道(文/黃晶晶)當(dāng)前,處理器已經(jīng)跨過了能用的階段,逐漸走向好用,但無論是消費(fèi)級(jí)還是服務(wù)器級(jí)都面臨著如何在性能上接近國外高端產(chǎn)品,以及生態(tài)上如何更加完善的問題。國內(nèi)廠商對(duì)于服務(wù)器芯片
    的頭像 發(fā)表于 05-18 09:25 ?7981次閱讀
    高端<b class='flag-5'>芯片</b><b class='flag-5'>自</b><b class='flag-5'>研</b>,服務(wù)器<b class='flag-5'>芯片</b>傳來好消息!

    MCU芯片閃存驅(qū)動(dòng)的實(shí)現(xiàn):OpenOCD詳細(xì)過程記錄與操作指南

    功能強(qiáng)大的開源調(diào)試工具,廣泛應(yīng)用于嵌入式系統(tǒng)開發(fā)中,為系統(tǒng)調(diào)試與程序燒錄提供了重要支持。 隨著MCU芯片項(xiàng)目的不斷推進(jìn),如何實(shí)現(xiàn)其與OpenOCD的無縫對(duì)接成為關(guān)鍵問題之一。而閃存
    的頭像 發(fā)表于 05-08 10:51 ?2470次閱讀
    <b class='flag-5'>自</b><b class='flag-5'>研</b><b class='flag-5'>MCU</b><b class='flag-5'>芯片</b>閃存驅(qū)動(dòng)的實(shí)現(xiàn):OpenOCD詳細(xì)過程記錄與操作指南

    IAR全面支持芯馳科技車規(guī)MCU芯片E3650

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

    普源電亮相MWC 2025及Embedded World 2025

    2025年3月,在全球科技舞臺(tái)聚光燈下,中國測(cè)試測(cè)量行業(yè)先進(jìn)企業(yè)普源電(RIGOL)接連亮相巴塞羅那世界移動(dòng)通信大會(huì)(MWC2025)與紐倫堡嵌入式展(Embedded World 2025),展示了其在通信、嵌入式與物聯(lián)網(wǎng)領(lǐng)域的最新產(chǎn)品和解決方案,吸引了全球觀眾的目光
    的頭像 發(fā)表于 03-17 09:36 ?1144次閱讀

    PCB布局優(yōu)化:HT4088電源管理芯片的設(shè)計(jì)要點(diǎn)

    學(xué)習(xí)如何通過優(yōu)化PCB布局來充分發(fā)揮HT4088電源管理芯片的性能和穩(wěn)定性。
    的頭像 發(fā)表于 03-08 15:09 ?1507次閱讀