日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IMXRT 分散加载文件 修改OCRAM,DTCM、ITCM大小

發布時間:2025/4/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IMXRT 分散加载文件 修改OCRAM,DTCM、ITCM大小 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分散加載
MXRT1052/1064芯片的RAM空間分為四種類型:ITCM,DTCM,OCRAM以及外部SDRAM,其中前面三個屬于芯片內部RAM,RT1052有512KB,RT1064為1MB,支持用戶靜態分配,SDRAM屬于外置RAM,最大支持到1.5G擴展空間。ITCM和DTCM是直接掛在芯片內核總線,速度可以達到與內核同頻的600M,OCRAM掛在Sys AXI 64位總線,速度只能到達133M,外部SDRAM速度則可達到166M,而同時RT1050/1064內又有各32K的指令cache和數據cache,用于提高代碼在外部Nor Flash中XIP執行的效率。從速度的角度看,將所有的用戶代碼分配ITCM/DTCM,能夠發揮到最大性能,從存儲空間大小的角度看,代碼存放在SDRAM或者外部Flash最簡單,而從USB/DMA使用的角度來看,RAM空間分配在OCRAM空間最為方便。所以這些不同RAM類型速度/大小的差異和cache的存在,就決定了要想讓IMXRT性能發揮到最大,就需要用戶根據客戶實際應用手動修改內部RAM空間中ITCM/DTCM/OCRAM的大小分配,并定位關鍵代碼和數據到指定RAM空間中運行。
1.如何將關鍵代碼和數據到指定RAM中運行?
① IAR中首先找到使用的對應分散加載文件,用記事本打開;

② 確定自己的內存分配,如下是默認的一種分配方式。

/* 中斷向量表 */ define symbol m_interrupts_start = 0x70002000; define symbol m_interrupts_end = 0x700023FF;// 代碼存放位置 define symbol m_text_start = 0x70002400; define symbol m_text_end = 0x703FFFFF;// DTCRAM 128K define symbol dtcram_start = 0x20000000; define symbol dtcram_end = 0x2001FFFF;// OCRAM 768K define symbol ocram_start = 0x20200000; define symbol ocram_end = 0x202BFFFF;// itcram 128K 注意不要從0x00000000開始 define symbol itcram_start = 0x00000004; define symbol itcram_end = 0x0001FFFF;/* FLASH配置和ivt等信息 */ define exported symbol m_boot_hdr_conf_start = 0x70000000; define symbol m_boot_hdr_ivt_start = 0x70001000; define symbol m_boot_hdr_boot_data_start = 0x70001020; define symbol m_boot_hdr_dcd_data_start = 0x70001030;

③ 規定堆棧區域大小,根據自己的實際情況分配,堆一般是用malloc函數動態分配內存區域,棧是程序的局部變量存儲空間,可以適當分配大一點。

// 棧大小 局部變量 if (isdefinedsymbol(__stack_size__)) {define symbol __size_cstack__ = __stack_size__; } else {define symbol __size_cstack__ = 0x4000; }// 堆大小 動態分配malloc分配的空間 if (isdefinedsymbol(__heap_size__)) {define symbol __size_heap__ = __heap_size__; } else {define symbol __size_heap__ = 0x8000; }// RAM中的中斷向量表 這里沒有使用 define exported symbol __VECTOR_TABLE = m_interrupts_start; define exported symbol __VECTOR_RAM = m_interrupts_start; define exported symbol __RAM_VECTOR_TABLE_SIZE = 0x0; define memory mem with size = 4G;

④ 定義一些儲存區域和地址塊

// 定義存儲地址區域(region) define region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end]| mem:[from m_text_start to m_text_end];define region DTCRAM_region = mem:[from dtcram_start to dtcram_end - __size_cstack__]; define region ITCRAM_region = mem:[from itcram_start to itcram_end]; define region OCRAM_region = mem:[from ocram_start to ocram_end];// 棧段 棧最好分配在DTCRAM中 define region CSTACK_region = mem:[from dtcram_end - __size_cstack__+1 to dtcram_end];// 定義地址塊 define block CSTACK with alignment = 8, size = __size_cstack__ { }; define block HEAP with alignment = 8, size = __size_heap__ { }; define block RW { readwrite }; define block ZI { zi }; define block NCACHE_VAR { section NonCacheable , section NonCacheable.init }; define block ITCRAM with alignment = 8{ section ITCRAMAccess}; define block DTCRAM with alignment = 8{ section DTCRAMAccess}; define block OTCRAM with alignment = 8{ section OTCRAMAccess};

⑤ 添加IAR自動初始化區域

// 初始化sections initialize by copy { readwrite, section .textrw}; initialize by copy { section ITCRAMAccess, section DTCRAMAccess,section OCRAMAccess}; do not initialize { section .noinit }; //IAR的ICF文件中宏導出給程序使用 place at address mem: m_interrupts_start { readonly section .intvec }; place at address mem:m_boot_hdr_conf_start { section .boot_hdr.conf }; place at address mem:m_boot_hdr_ivt_start { section .boot_hdr.ivt }; place at address mem:m_boot_hdr_boot_data_start { readonly section .boot_hdr.boot_data }; place at address mem:m_boot_hdr_dcd_data_start { readonly section .boot_hdr.dcd_data };keep{ section .boot_hdr.conf, section .boot_hdr.ivt, section .boot_hdr.boot_data, section .boot_hdr.dcd_data };

⑥ 將步驟4中定義的儲存區域和地址塊關聯起來

// 把一系列sections和blocks放置在某個region中。sections和blocks將按任意順序放置。 place in TEXT_region { readonly }; //代碼存放區域 place in DTCRAM_region { block RW }; //RW段存放區域(全局或靜態不為0變量) place in DTCRAM_region { block ZI }; //ZI段存放區域(全局或靜態為0變量) place in OCRAM_region { last block HEAP }; //malloc 動態申請內存區域 place in DTCRAM_region { block NCACHE_VAR }; //NCACHE區域 需要配合MPU使用 place in CSTACK_region { block CSTACK }; //站區域 局部變量place in ITCRAM_region { block ITCRAM }; //ITCRAM區域 place in DTCRAM_region { block DTCRAM }; //DTCRAM區域 place in OCRAM_region { block OCRAM }; //OCRAM區域

⑦ 我們上面在步驟4中定義了地址塊ITCRAMAccess、 DTCRAMAccess、OCRAMAccess,如何在IAR中將變量放到對應地址塊呢?
⑧ 打開fsl_common.h,仿照官方AT_NONCACHEABLE_SECTION宏定義添加如下宏定義。

#if (defined(__ICCARM__)) #define AT_ITCRAM_SECTION(func) func @"ITCRAMAccess" #define AT_DTCRAM_SECTION(func) func @"DTCRAMAccess" #define AT_OCRAM_SECTION(func) func @"OCRAMAccess" #elif(defined(__ARMCC_VERSION)) #define AT_ITCRAM_SECTION(func) __attribute__((section("ITCRAMAccess"))) func #define AT_DTCRAM_SECTION(func) __attribute__((section("DTCRAMAccess"))) func #define AT_OCRAM_SECTION(func) __attribute__((section("OCRAMAccess"))) func #elif(defined(__GNUC__)) #define AT_ITCRAM_SECTION(func) __attribute__((section("ITCRAMAccess"))) func #define AT_DTCRAM_SECTION(func) __attribute__((section("DTCRAMAccess"))) func #define AT_OCRAM_SECTION(func) __attribute__((section("OCRAMAccess"))) func #endif


⑨ 打開BOARD_ConfigMPU(); 函數修改MPU配置,驗證對應的數據分配到了指定位置。

使用宏定義修飾函數或者變量,將函數和變量存放到指定位置。

AT_ITCRAM_SECTION(void delayms(uint16_t ms)) {volatile uint32_t i = 0;while(ms--) {for (i = 0; i < 30000; ++i){__asm("NOP"); /* delay */}} } AT_DTCRAM_SECTION(uint8_t dcrambuf[100][1024]); AT_OCRAM_SECTION(uint8_t orambuf[100][1024]);

⑩ MDK中類似IAR,打開分散加載文件,在里面添加塊ITCRAMAccess、 DTCRAMAccess、OCRAMAccess。通過步驟8中的宏定義可以將關鍵代碼和變量存放到指定位置。


/* FLASH配置和ivt等信息 */ #define m_flash_config_start 0x70000000 #define m_flash_config_size 0x00001000#define m_ivt_start 0x70001000 #define m_ivt_size 0x00001000/* 中斷向量表 */ #define m_interrupts_start 0x70002000 #define m_interrupts_size 0x00000400// 代碼存放位置 #define m_text_start 0x70002400 #define m_text_size 0x003FDC00// DTCRAM 128K #define dtcram_start 0x20000000 #define dtcram_size 0x00020000// OCRAM 768K #define ocram_start 0x20200000 #define ocram_size 0x000C0000// itcram 128K 注意從0x00000004開始 #define itcram_start 0x00000004 #define itcram_size 0x00020000 // 棧大小 局部變量 #if (defined(__stack_size__))#define Stack_Size __stack_size__ #else#define Stack_Size 0x4000 #endif// 堆大小 動態分配malloc分配的空間 #if (defined(__heap_size__))#define Heap_Size __heap_size__ #else#define Heap_Size 0x8000 #endif#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1) LR_m_text m_flash_config_start m_text_start+m_text_size-m_flash_config_start { ; load region size_regionRW_m_config_text m_flash_config_start FIXED m_flash_config_size { ; load address = execution address* (.boot_hdr.conf, +FIRST)}RW_m_ivt_text m_ivt_start FIXED m_ivt_size { ; load address = execution address* (.boot_hdr.ivt, +FIRST)* (.boot_hdr.boot_data)* (.boot_hdr.dcd_data)} #else LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_start { ; load region size_region #endif/* 中斷向量表存放位置 */VECTOR_ROM m_interrupts_start FIXED m_interrupts_size { ; load address = execution address* (RESET,+FIRST)}/* 代碼段存放位置 */TEXT_region m_text_start FIXED m_text_size { ; load address = execution address* (InRoot$$Sections).ANY (+RO)}/* DTCRAM段 */DTCRAM_region dtcram_start dtcram_size-Stack_Size{ ; RW data.ANY (+RW).ANY (+ZI)* (DTCRAMAccess)* (NonCacheable.init)* (NonCacheable)}/* ITCRAM段 */ITCRAM_region itcram_start itcram_size{ ; RW data* (ITCRAMAccess)}/* OCRAM段 */OCRAM_region ocram_start ocram_size{ ; * (OCRAMAccess)}/* 堆區域 */ARM_LIB_HEAP +0 EMPTY Heap_Size { ; Heap region growing up}/* 棧區域 棧是向下生長的 */ARM_LIB_STACK dtcram_start+dtcram_size EMPTY -Stack_Size { ; Stack region growing down} }

動態修改FlexRAM,修改TCRAM大小

RT1052片內的512KB RAM,可以自由分配為ITCRAM、DTCRAM和OCRAM(OCRAM最少32KB)。RT1064相比RT1052,多了512KB的OCRAM,另外的512KB RAM和RT1052一樣,可以自由分配為ITCRAM、DTCRAM和OCRAM。
IMXRT的片內RAM可以根據用戶需求動態分配,512KB的RAM分成16個BANK,每個BANK 由32位寄存器IOMUXC_GPR->GPR17(0x400AC044)中的兩位來確定類型。
? 00b—bank is not used.
? 01b—bank is configured for OCRAM.
? 10b—bank is configured for DTCM.
? 11b—bank is configured for ITCM.
注意ITCRAM、DTCRAM應該為2的冪(32、64、128、256、512)

下圖就是一個簡單的例子,配置DTCRAM 128K、ITCRAM 256K、OCRAM 128K。

配置完IOMUXC_GPR->GPR17(0x400AC044)寄存器,確定每個BANK的類型后,修改寄存器IOMUXC_GPR->GPR14(0x400AC038)確定對應TCM的空間大小,并設置IOMUXC_GPR->GPR16(0x400AC040)開啟動態分配的內存空間。
下面是一個DTCRAM 256K、ITCRAM 128K、OCRAM 128K的分配例子。

/* RT1052/1064 內部SRAM一共分為16個blank 每個blank 都可以選擇類型 * A bank size of 512 kB / 16 = 32 kB* IOMUXC_GPR_GPR17寄存器一共32位, 每兩位控制一個blank的類型* 00b—bank is not used.* 01b—bank is configured for OCRAM.* 10b—bank is configured for DTCM.* 11b—bank is configured for ITCM.*/ IOMUXC_GPR->GPR17 = IOMUXC_GPR_GPR17_FLEXRAM_BANK_CFG(0x55AAAAFF); /*! CM7_CFGITCMSZ* 0b0000..0 KB (No ITCM)* 0b0011..4 KB* 0b0100..8 KB* 0b0101..16 KB* 0b0110..32 KB* 0b0111..64 KB* 0b1000..128 KB* 0b1001..256 KB* 0b1010..512 KB*/IOMUXC_GPR->GPR14 &= ~IOMUXC_GPR_GPR14_CM7_CFGITCMSZ_MASK;IOMUXC_GPR->GPR14 |= IOMUXC_GPR_GPR14_CM7_CFGITCMSZ(8);IOMUXC_GPR->GPR16 |= IOMUXC_GPR_GPR16_INIT_ITCM_EN(1);/*! CM7_CFGDTCMSZ* 0b0000..0 KB (No DTCM)* 0b0011..4 KB* 0b0100..8 KB* 0b0101..16 KB* 0b0110..32 KB* 0b0111..64 KB* 0b1000..128 KB* 0b1001..256 KB* 0b1010..512 KB*/IOMUXC_GPR->GPR14 &= ~IOMUXC_GPR_GPR14_CM7_CFGDTCMSZ_MASK;IOMUXC_GPR->GPR14 |= IOMUXC_GPR_GPR14_CM7_CFGDTCMSZ(9);IOMUXC_GPR->GPR16 |= IOMUXC_GPR_GPR16_INIT_DTCM_EN(1);/* 使能配置 */IOMUXC_GPR->GPR16 &= ~IOMUXC_GPR_GPR16_FLEXRAM_BANK_CFG_SEL_MASK;IOMUXC_GPR->GPR16 |= IOMUXC_GPR_GPR16_FLEXRAM_BANK_CFG_SEL(1);

動態內存分配最好在堆棧初始化之前,因此我們需要將上面的代碼轉換為對應的RAM匯編代碼,放在復位中斷服務函數堆棧初始化前面,打開啟動文件startup_MIMXRT10XX.s文件,找到Reset_Handler的匯編函數,添加對應匯編代碼。

FLEXRAM_BANK_CFG EQU 0x55AAAAFF ITCRAM_SIZE EQU 0x8;128KB 00KB 632KB 764KB 8128KB 9256KB 10: 512KB DTCRAM_SIZE EQU 0x9;256KB 00KB 632KB 764KB 8128KB 9256KB 10: 512KBReset_HandlerCPSID I ; Mask interrupts;IOMUXC_GPR->GPR17 = IOMUXC_GPR_GPR17_FLEXRAM_BANK_CFG(0x55AAAAFF); LDR R0, = 0x400AC044 ; 將IOMUXC_GPR->GPR17的地址放到 寄存器R0中LDR R1, = FLEXRAM_BANK_CFG ; 將BANK劃分結果放到 寄存器R1中STR R1, [R0] ; 將R1 存放到IOMUXC_GPR->GPR17中;IOMUXC_GPR->GPR14 &= ~IOMUXC_GPR_GPR14_CM7_CFGITCMSZ_MASK;;IOMUXC_GPR->GPR14 &= ~IOMUXC_GPR_GPR14_CM7_CFGDTCMSZ_MASK;LDR R0, = 0x400AC038 ; 將IOMUXC_GPR->GPR14的地址放到 寄存器R0中LDR R2, [R0]LDR R3, = 0x00FFFFAND R1, R2, R3 ; R1 = IOMUXC_GPR->GPR14 &= ~IOMUXC_GPR_GPR14_CM7_CFGITCMSZ_MASK中STR R1, [R0] ; 將R1 存放到IOMUXC_GPR->GPR14中;IOMUXC_GPR->GPR14 |= IOMUXC_GPR_GPR14_CM7_CFGITCMSZ(ITCRAM_SIZE);;IOMUXC_GPR->GPR14 |= IOMUXC_GPR_GPR14_CM7_CFGDTCMSZ(DTCRAM_SIZE);LDR R1, = ITCRAM_SIZEMOV R2, R1,LSL#16LDR R1, = DTCRAM_SIZEMOV R3, R1,LSL#20ORR R1, R2, R3LDR R2, [R0]ORR R1, R1, R2STR R1, [R0] ;IOMUXC_GPR->GPR16 |= IOMUXC_GPR_GPR16_INIT_ITCM_EN(1);;IOMUXC_GPR->GPR16 |= IOMUXC_GPR_GPR16_INIT_DTCM_EN(1);;IOMUXC_GPR->GPR16 |= IOMUXC_GPR_GPR16_FLEXRAM_BANK_CFG_SEL(1);LDR R0, = 0x400AC040LDR R1, [R0]ORR R1, R1, #0x7STR R1, [R0] LDR R0, =0xE000ED08LDR R1, =__vector_tableSTR R1, [R0]LDR R2, [R1]MSR MSP, R2LDR R0, =SystemInitBLX R0CPSIE I ; Unmask interruptsLDR R0, =__iar_program_startBX R0

最后修改分散加載文件中地址空間分配、修改MPU配置

總結

以上是生活随笔為你收集整理的IMXRT 分散加载文件 修改OCRAM,DTCM、ITCM大小的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 偷拍精品一区二区三区 | 丰满岳妇伦在线播放 | 国产精品影音先锋 | 无码精品在线视频 | 亚洲精品国产精品乱码不66 | 性生交生活影碟片 | 日本天堂在线视频 | 亚洲国产av一区二区三区 | 国产一区二区中文字幕 | 国产四区 | 91干干| 天堂资源中文在线 | 成人1区2区 | av免费久久 | 欧美亚洲精品天堂 | 亚洲激情中文字幕 | 色婷婷一区二区三区四区 | 伊人久久免费视频 | 91久久精品国产91性色tv | 麻豆最新网址 | 青春草免费视频 | 九九热在线免费视频 | 久草视频首页 | 奇米影视盒 | 玖玖热视频 | 国产妻精品一区二区在线 | 一级免费黄色大片 | www.av在线.com| 国产激情久久 | 嫩草视频免费观看 | 色综合久久88色综合天天免费 | 色就色欧美 | 色骚网| 一区二区三区四区影院 | 中文字幕一区二区三区人妻不卡 | 日本高清不卡一区 | 中文字幕影院 | 97人妻精品一区二区三区 | 午夜精品无码一区二区三区 | 黄色a免费 | 91九色国产ts另类人妖 | eeuss日韩 | 国产又粗又长又黄的视频 | 国产激情一区二区三区四区 | 亚洲九九九九 | 国产乱码精品1区2区3区 | 激情网五月天 | 99夜色| 一区二区三区精品国产 | 国产黄频在线观看 | 伦av综合一区 | 亚洲专区一 | 美女黄视频大全 | 欧美精品亚洲一区 | 中文字幕在线视频精品 | 久久a久久| 三浦惠理子aⅴ一二三区 | 影音先锋中文字幕资源 | 18av视频| 很黄很污的视频网站 | 3d动漫精品啪啪一区二区三区免费 | 国产成人无码精品久久久性色 | 嫩草导航 | 亚洲毛片久久 | 欧美性猛交xxxxx水多 | 国产成人免费片在线观看 | 在线观看的毛片 | av55 | 免费高清av在线看 | 国产丝袜久久 | 亚洲毛片一区 | 丝袜视频在线观看 | 午夜精品久久久久久久 | 激情五月婷婷丁香 | 99精品久久久 | 揉我啊嗯~喷水了h视频 | 亚洲视频一 | 日本少妇中文字幕 | 国产黄色一级片视频 | 国产三区视频 | 亚洲乱码国产乱码精品精软件 | 中文字幕在线播放不卡 | 亚洲第三十七页 | 免费在线看污 | 国产精品久久久一区二区三区 | 精品无码国产一区二区三区51安 | 一级免费黄色大片 | 日韩美女一级片 | 调教撅屁股啪调教打臀缝av | 欧美成人免费一级 | 天堂网在线看 | 日本精品视频在线观看 | 亚洲人性生活视频 | 日韩一级片网站 | 国产调教一区 | 夜夜操网址 | 欧美 丝袜 自拍 制服 另类 | 亚洲国产日韩一区二区 | 日本三级久久久 | 国产又粗又猛又黄又爽的视频 |