<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      痞子衡嵌入式:了解i.MXRTxxx系列ROM API及其與i.MXRT1xxx系列的差異


        大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MXRTxxx系列ROM API設計細節

        痞子衡之前寫過兩篇文章 《利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可輕松IAP》《其實i.MXRT1050,1020,1015系列ROM也提供了FlexSPI driver API》 基本把i.MXRT1xxx全系列的ROM API及其FlexSPI NOR驅動設計都講清楚了,其實i.MXRTxxx系列的ROM API設計跟i.MXRT1xxx系列的設計思路差不多(其實本就是同一個恩智浦研發小組負責的),僅有一些微小區別,本文痞子衡主要就是點出那些區別。

      一、ROM基址差異

        ROM API代碼首先是在BootROM里,BootROM代碼是出廠前固化在ROM區域的。因為架構設計的關系,i.MXRTxxx系列和i.MXRT1xxx系列的ROM區域在系統內存里的映射地址不同。

        下表是i.MXRTxxx系列代表型號i.MXRT500的部分系統內存映射,可以看到ROM區域起始地址是0x03000000(非安全域)。目前i.MXRTxxx都是Cortex-M33內核,支持TrustZone特性,所以0x13000000也是ROM起始地址(安全域),為了通用性,我們認0x03000000就可以了,這個地址在安全狀態和非安全狀態下都能被訪問。

        下表是i.MXRT1xxx系列代表型號i.MXRT1060的部分系統內存映射,可以看到ROM區域起始地址是0x00200000。i.MXRT1xxx系列都是Cortex-M7內核,沒有TrustZone特性,不存在i.MXRTxxx上那樣的兩種狀態域下的地址。

      二、API基址備份位置差異

        在i.MXRT1xxx系列ROM API介紹的文章里,痞子衡介紹過g_bootloaderTree地址值被復制了一份放在了BootROM中斷向量表第8個向量的位置處(該向量為ARMv7-M架構下未定義的系統向量),因此讀取0x0020001c處開始的4bytes便能找到i.MXRT1xxx系列的g_bootloaderTree。

        但是由于i.MXRTxxx是Cortex-M33內核,屬于ARMv8-M架構,從下圖中可以看出ARMv8-M架構下中斷向量表第8個向量是SecureFault,已經被定義了,因此BootROM把g_bootloaderTree地址值放到了第9個向量的位置處(該向量為ARMv8-M架構下未定義的系統向量),故讀取0x03000020處開始的4bytes才能找到i.MXRTxxx系列的g_bootloaderTree(這種方式在實際API調用中并不可取,至于原因嘛,先賣個關子)。

        下面是i.MXRT500 BootROM工程的startup文件(IAR版),g_bootloaderTree確實在第9個向量處:

              MODULE  ?cstartup
      
              ;; Forward declaration of sections.
              SECTION CSTACK:DATA:NOROOT(3)
              SECTION .intvec:CODE:NOROOT(2)
      
              EXTERN  __iar_program_start
              EXTERN  g_bootloaderTree
              PUBLIC  __vector_table
              PUBLIC  __vector_table_0x1c
      
              DATA
      
      __vector_table
              DCD     sfe(CSTACK)
              DCD     Reset_Handler
              DCD     DefaultISR
              DCD     HardFault_Handler
              DCD     DefaultISR
              DCD     DefaultISR
              DCD     UsageFault_Handler
      __vector_table_0x1c
              DCD     SecureFault_Handler
              DCD     g_bootloaderTree
              DCD     0
              DCD     0
              DCD     SVC_Handler
              DCD     DefaultISR
              DCD     0
              DCD     DefaultISR
              DCD     SysTick_Handler
                      ;; ...
      

      三、API原型定義差異

        下面是i.MXRTxxx系列ROM API原型定義及其實例(適用i.MXRT500/600),基本形式跟i.MXRT1xxx差不多,但是API功能更豐富,除了FlexSPI NOR驅動,還有iap api、USB low-level driver、otp driver等(我們知道,i.MXRTxxx與LPC系列同根同源,LPC系列ROM里一般都會集成很多經典SDK驅動,比如內部flash、low power驅動,有了這些穩定的驅動API,LPC系列的用戶手冊里甚至都會省去這些IP的寄存器介紹,直接就是API的介紹)。

      typedef struct
      {
          void (*runBootloader)(void *arg);
          uint32_t version;
          const char *copyright;
          const bootloader_context_t *runtimeContext;
          const kb_interface_t *kbApi;
          const usb_driver_interface_t *usbDriver;
          const USBD_API_T *lpcUsbDriver;
          const flexspi_nor_flash_driver_t *flexspiNorDriver;
          const ocotp_driver_t *otpDriver;
          const skboot_authenticate_interface_t *skbootAuthenticate;
      } bootloader_api_entry_t;
      
      //! @brief Static API tree.
      __root const bootloader_api_entry_t g_bootloaderTree @".rom_api_tree_section" = {
          .runBootloader = bootloader_user_entry,
          .version = MAKE_VERSION('K', 3, 0, 0),
          .copyright = "Copyright 2019 NXP.",
          .runtimeContext = &g_bootloaderContext,
          .kbApi = &g_romApiInterface,
          .usbDriver = &g_usbDriverInterface,
          .flexspiNorDriver = &g_flexspiNorFlashDriverInterface,
          .otpDriver = &g_otpDriverInterface,
          .skbootAuthenticate = &g_skbootAuthenticateInterface,
      };
      

      四、API實例鏈接差異

        i.MXRT1xxx系列ROM API實例g_bootloaderTree都是讓鏈接器自由鏈接的,因此每個具體型號的實際ROM API鏈接地址沒有一致的規律可循(這也是為什么要在中斷向量表里固定位置統一保存一份),而這點在i.MXRTxxx上有了改進,i.MXRTxxx里將g_bootloaderTree放到了 .rom_api_tree_section 段里,在鏈接文件里將該段固定鏈接在ROM區域最后4KB處(BootROM代碼沒有把全部ROM空間用盡)。

        下面是i.MXRTxxx BootROM源文件中g_bootloaderTree的定義,加了段修飾。此外還有額外的k_romcrc,標示API實例區域的結束。

      __root const bootloader_api_entry_t g_bootloaderTree @".rom_api_tree_section" = {
          .runBootloader = bootloader_user_entry,
          .version = MAKE_VERSION('K', 3, 0, 0),
          .copyright = "Copyright 2019 NXP.",
          .runtimeContext = &g_bootloaderContext,
          // ...
      };
      
      __root const uint32_t k_romcrc @".romcrc" = 0xdeadbeef;
      

        下面是i.MXRTxxx鏈接文件(IAR工程)中 .rom_api_tree_section 段的處理(i.MXRT500型號示例,ROM空間是192KB)。你可能好奇為啥ROM_API_TREE_xx等值是放在0x13000000開始的安全域ROM空間映射,BootROM屬于上電啟動第一級,負責芯片系統的安全和啟動,當然是工作在安全狀態下,可以訪問安全域地址空間。

      define symbol __ICFEDIT_region_ROM_API_TREE_start__     = 0x1302f000;
      define symbol __ICFEDIT_region_ROM_API_TREE_end__       = 0x1302f0ff;
      define symbol __ICFEDIT_region_ROM_CRC_CHECKSUM_start__ = 0x1302fffc;
      define symbol __ICFEDIT_region_ROM_CRC_CHECKSUM_end__   = 0x1302ffff;
      
      define region ROM_API_TREE_region = mem:[from  __ICFEDIT_region_ROM_API_TREE_start__ to  __ICFEDIT_region_ROM_API_TREE_end__];
      define region ROM_CRC_CHECKSUM = mem:[from  __ICFEDIT_region_ROM_CRC_CHECKSUM_start__ to  __ICFEDIT_region_ROM_CRC_CHECKSUM_end__];
      
      place in ROM_API_TREE_region { section .rom_api_tree_section };
      place in ROM_CRC_CHECKSUM { section .romcrc };
      

        基于上面的設計,你才會在i.MXRT500參考手冊里Non-Secure Boot ROM章節看到如下ROM API地址及結構信息圖(圖中僅標了常用的API功能函數),實際ROM API調用時,App的執行其實都是經過ROM引導和認證的,App中既可以訪問安全域地址(0x1302f000)來調用API,也可以訪問非安全域地址(0x0302f000)來調用API。

        最后再來回答前面賣的關子,為什么i.MXRTxxx系列通過BootROM中斷向量表第9個向量值來訪問ROM API這種方式并不可取?其實從BootROM煞費苦心地將g_bootloaderTree固定鏈接在ROM區域最后4KB處,你就能看出其用意。如果你掛上調試器直接訪問i.MXRTxxx的ROM區域前20KB的空間,你會發現無法訪問,在App里AHB方式讀這個區域,也會直接產生HardFault,因為BootROM里做了特殊設計故意隱藏了前20KB空間,這個空間里存放了BootROM想要保護的數據和代碼,至于內容是啥,純屬機密,恕不奉告,哈哈。

        至此,i.MXRTxxx系列ROM API設計細節痞子衡便介紹完畢了,掌聲在哪里~~~

      歡迎訂閱

      文章會同時發布到我的 博客園主頁CSDN主頁知乎主頁微信公眾號 平臺上。

      微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

      posted @ 2020-08-06 21:47  痞子衡  閱讀(1936)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 99视频在线精品国自产拍| 国产一区二区三区麻豆视频| 国产福利片无码区在线观看| 91人妻熟妇在线视频| 国产成人麻豆亚洲综合无码精品| 亚洲av无码之国产精品网址蜜芽| 四虎网址| 国产永久免费高清在线| 午夜激情小视频一区二区| 少妇被粗大的猛烈进出动视频| 国产成人无码AV片在线观看不卡 | 国产av中文字幕精品| 人摸人人人澡人人超碰97| 麻豆精品一区二区综合av| 日本japanese丰满白浆| 亚洲 自拍 另类小说综合图区| 丁香婷婷在线观看| 国产精品高清中文字幕| 亚洲欧美日韩综合一区在线| 香蕉EEWW99国产精选免费| 无码射肉在线播放视频| 女人下边被添全过视频的网址| 无码国产精品一区二区免费式芒果| 亚洲精品国产精品国在线 | 美女一区二区三区亚洲麻豆| 国产成人一区二区三区免费| 人妻无码中文字幕| 亚洲av成人无码精品电影在线 | 久久人搡人人玩人妻精品| 欧美成人午夜在线观看视频| 无码国产精品一区二区av| 一区二区丝袜美腿视频| 交口县| 亚洲av无码一区二区三区网站| 青青草国产精品一区二区| 亚洲中文字幕一区二区| 亚洲AV无码东方伊甸园| 亚洲中文字幕一区二区| 日本丰满护士bbw| 诏安县| 乌克兰丰满女人a级毛片右手影院|