精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

如何在MCU上進行實際的部署

恩智浦MCU加油站 ? 來源:恩智浦MCU加油站 ? 作者:恩智浦MCU加油站 ? 2022-08-11 09:02 ? 次閱讀

本篇將是系列文章的最后一篇,在MCU上進行實際的部署。 小編就不再給大家復習歷史了,直接開始正題。如果想溫習前兩部分內容,請點擊此處和此處。

首先給大家介紹一下我們將要使用的離線Flash燒寫工具,名為JFlashLite,他有一個兄弟叫JFLash,既然是Lite就是輕量版本的JFlash工具。

當然,需要大家自行下載Segger Jlink工具包。是的,我們需要一條JLink。隨后找到JFlashLite工具,他長這樣(請忽略這里的1176,我們還沒有配置):

ca0e5400-190c-11ed-ba43-dac502259ad0.png 比起下圖他的哥哥JFlash,是不是很清爽的界面: ca385c6e-190c-11ed-ba43-dac502259ad0.png

當然,我們今天的主角是JFlashLite,稍后會介紹如何進行配置并下載

程序編寫

工具介紹完了,下面正式開始編寫配套程序,所使用的平臺是i.MX RT1060, 開發板是IMXRT1060EVKB:

劃分FLASH以及sdram區域,sdram區域負責加載flash中內容,加速內存訪問:我們的開發板上有一個8MB的Flash,內存映射地址為0x60000000,首先保留1MB的頭部區域以存儲代碼,其作用后續會提到。那么我們就剩下7MB大小的空間,由于數據一般較大,劃分4MB作為數據存儲區,剩下的3MB存儲模型。同樣的,在sdram區域,內存映射地址為0x80000000也同樣開辟這樣大的兩塊內存區,不過,為了防止數據溢出,我們僅針對于sdram區域,在數據區和模型區中間插入256B的數據保護區,并填充0xdeadbeef,最終的內存布局如下:

Flash上內存分配

ca5d443e-190c-11ed-ba43-dac502259ad0.png

Sdram內存分配

ca6d6f08-190c-11ed-ba43-dac502259ad0.png

利用JflashLite工具進行燒寫:

打開JFlashLite工具點擊…選擇器件為1062xxxxA:

ca83319e-190c-11ed-ba43-dac502259ad0.png

選擇對應的數據文件以及模型進行燒寫,燒寫地址要依據上述定義的分配,即模型數據燒寫到0x60100000,圖像數據燒寫到0x60400000:

caa07470-190c-11ed-ba43-dac502259ad0.png

cac7d83a-190c-11ed-ba43-dac502259ad0.png

選擇好之后,點擊Program Device即可進行燒寫;針對于模型數據,yao注意將以.tflite結尾的模型文件,重命名為.bin文件。

Scf文件編寫,主要考慮到,運行時,將flash中的數據,拷貝到sdram中,以提高運行速度,這里聲明兩個區域負責存儲ER_tflite_model以及ER_test_data

#define m_text_start                   0x80000400
#define FLASH_LOAD 7 * 1024 * 1024
LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_start {   ; load region size_region
  VECTOR_ROM m_interrupts_start FIXED m_interrupts_size { ; load address = execution address
    * (.isr_vector,+FIRST)
  }
  ER_m_text m_text_start FIXED m_text_size - FLASH_LOADER_SIZE { ; load address = execution address
    * (InRoot$$Sections)
    .ANY (+RO)
  }
 
#if (defined(FLASH_LOAD))
  ER_ test_data +0 EMPTY 4 * 1024 * 1024 {}
  ER_PLACEHOLDER1 +0 EMPTY FILL 0xdeadbeef 256{} 
  ER_tflite_model +0 EMPTY 3 * 1024 * 1024 {}  
  ER_PLACEHOLDER2+0 EMPTY FILL 0xdeadbeef 256{}
  ER_EMPTY m_text_start + m_text_size EMPTY 0{}
#endif

主代碼編寫,針對于邊界溢出檢測代碼,簡單起見,只檢測首地址處值,不同則表示溢出,死循環等待

typedef struct {
uint32_t n, h, w, c;
uint8_t data[0];
}data_t;
// use a split area, total 7MB:
// tflite model 3MB
// img_data 4MB
#define FLASH_BASE (0x60100000)
#define MB(x)  (x * 1024 * 1024)

#define lr_model_data_len (MB(3))
#define lr_model_data  FLASH_BASE
#define lr_model_data_end (lr_model_data + lr_model_data_len)

#define lr_img_data_len  (MB(4))
#define lr_img_data  (lr_model_data_end)  // 0x60200000
#define lr_img_data_end (lr_img_data + lr_img_data_len)

// declare the sdram memory
extern uint8_t Image$$ER_tflite_model$$ZI$$Base[];
#define model_data Image$$ER_tflite_model$$ZI$$Base

extern uint8_t Image$$ER_test_data$$ZI$$Base[];
#define img_data Image$$ER_test_data$$ZI$$Base

extern uint8_t Image$$ER_PLACEHOLDER1$$ZI$$Base[];
#define PLACEHOLDER1 Image$$ER_PLACEHOLDER1$$ZI$$Base

extern uint8_t Image$$ER_PLACEHOLDER2$$ZI$$Base[];
#define PLACEHOLDER2 Image$$ER_PLACEHOLDER2$$ZI$$Base

#define DO_MEMCPY(name) memcpy((void*)name, (void*)lr_##name, lr_##name##_len)
#define PRE_INIT() 
    do{ 
DO_MEMCPY(model_data);
DO_MEMCPY(img_data); 
            while(0xdeadbeef != *(uint32_t*) PLACEHOLDER1) ;   
                         while(0xdeadbeef != *(uint32_t*) PLACEHOLDER2) ;          
    }while(0);

定義好了一些宏之后,就是模型的初始化函數:

void tflite_engine_init(){
#ifdef FLASH_LOAD
PRE_INIT()
#endif
SysTick_Config(CLOCK_GetCoreSysClkFreq() / 1000);
MODEL_AllocateTensor((void*)tensorArena, sizeof(tensorArena));
if (MODEL_Init(model_data) != kStatus_Success)
    {
        PRINTF("Failed initializing model");
        for (;;) {}
    }
}

測試數據如何獲取呢,利用我們剛才定義的data_t結構體:

data_t *image = (data_t*)img_data;
image_data_ptr = image->data;

這樣,我們就拿到了存儲在flash并且已經被搬運到了sdram上的數據了,接下來就是編譯運行了。

實際運行與測試

測試時候,要注意首先確保我們的開發板已經是XIP啟動,即從Nor Flash啟動,并且保證在flash的頭部,燒寫過一個完整的可執行鏡像,比如hello_world程序,其中會包含Flash的一些配置信息,這一步小編就不再舉例,還請大家自行準備。

這樣,我們的BootRom會據此幫我們配置好Flash,程序中就不用手動調用Flash的初始化代碼了。

還要注意,代碼要全部運行在SDRAM或是其他介質上,因為我們已經將flash據為己有了。

下面是內存鏡像的樣子,首先是model:

caed9214-190c-11ed-ba43-dac502259ad0.png

再者是測試數據,前四個uint32類型的數據剛好是小編這里定義的數據長度100張128*128*3的rgb彩色圖:

cb15207c-190c-11ed-ba43-dac502259ad0.png

連上板子和PC,并打開串口控制臺即可查看輸出結果,小編所選用的模型是一個水果識別的模型,下面是最后一組數據的輸出結果,證明我們的程序運行成功!

cb448380-190c-11ed-ba43-dac502259ad0.png

展望

當然,小編給大家分享的這個方法,不僅可以應用在神經網絡AI推理上,可以當作一個低配版的flashloader,以供大家靈活地更新靜態數據資源。

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

    關注

    146

    文章

    17019

    瀏覽量

    350374
  • FlaSh
    +關注

    關注

    10

    文章

    1623

    瀏覽量

    147785
  • 工具包
    +關注

    關注

    0

    文章

    46

    瀏覽量

    9525

原文標題:一種基于MCU的神經網絡模型在線更新方案之MCU實戰篇

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    何在資源有限的MCU上進行圖形應用設計

    第二種是以NXP官方推出的GUI Guider為代表的動態加載策略,即只加載在系統啟動后顯示的屏幕,后面如果需要顯示哪一個屏幕再動態加載。
    發表于 10-20 09:56 ?2913次閱讀

    何在TINA上進行電荷放大器的仿真?

    想請問一下,電荷放大器選用什么樣的運放比較好,儀器放大器可以嗎? 如何在TINA上進行電荷放大器的仿真?
    發表于 08-19 06:18

    何在原電路上進行添加保護電路和修改 ,請高手指導!

    剛畢業的小白 領導讓設計拾音器 有一篇TI家最簡單的電路資料,經過元器件和選型后,確定了麥克風用PUI家POM-3535L,放大器用TI的OPA172,脈沖調制用TI的PCM1800E,但只能實現簡單聲音信號,如何在原電路上進行添加保護電路和修改 ,請高手指導!
    發表于 11-07 16:53

    何在最大分辨率的LCD上進行DouthGaSUS分布?

    何在最大分辨率的LCD上進行DouthGaSUS分布?請你幫幫我好嗎?
    發表于 08-16 09:07

    何在STM32F103上進行CAN通信的管腳重映射配置和使用

    CAN通信管腳重映射1. 摘要本篇筆記主要介紹,如何在STM32F103上進行CAN通信的管腳重映射配置和使用2. 準備工作1), IAR 8.3.12), 運行...
    發表于 08-19 06:20

    何在stm32f103上進行匯編語言測試呢

    何在stm32f103上進行匯編語言測試呢?有哪些步驟?
    發表于 10-08 08:45

    何在MCU上進行內存管理與分配

    從事嵌入式產品開發已有十余年了,從最開始的8051一直用到現在流行的Cortex M系列的內核的單片機。從最開始用VC6.0開發PC端的軟件到現在使用Mircrosoft WPF框架進行PC端的軟件開發。發現現在的新人對MCU的內存管理與分配上真是一無所知。我就談談如
    發表于 11-04 06:06

    何在MDK5上進行STM32設計跑馬燈程序并進行編譯及仿真?

    何在MDK5上進行STM32設計跑馬燈程序并進行編譯及仿真?
    發表于 11-10 07:57

    何在esp8266 Node MCU的硬件上部署LVGL

    前言本文,介紹如何在esp8266 Node MCU的硬件上部署LVGL項目。使用的屏幕使用型號是ST7735 TFT 128x128屏幕。(一)arduinoIDE esp8266環境配置自行
    發表于 12-08 07:15

    何在MCU片內進行Flash讀寫呢

    何在MCU片內進行Flash讀寫呢?其過程是怎樣的?
    發表于 12-13 06:51

    何在Ubuntu系統上進行中文支持

    1、Ubuntu系統上進行中文支持Firefly 的Ubuntu系統默認是英文版,現在剛剛發布了最新的雙系統固件Ubuntu上有了很多更新。這里就順便說明下如何在Ubuntu系統上進行中文支持:這是
    發表于 06-13 17:21

    在FPGA上進行圖像處理及其示例

    借助FPGA技術和NI視覺開發模塊,您可以對從相機采集的圖像進行高速現場可編程門陣列(FPGA)處理。 FPGA處理尤其適用于要求圖像采集和處理之間具有低延遲的應用。 本文概述了如何在FPGA上進行圖像處理。
    發表于 11-17 06:00 ?1.9w次閱讀

    使用Devtron在Kubernetes多集群上進行開發

    在本文中,您將學習如何在多集群環境中使用 Devtron 在 K8S 上進行應用開發。
    的頭像 發表于 11-17 09:50 ?818次閱讀

    2分鐘快速教你如何在華為模擬器ensp上進行抓包?

    2分鐘快速教你如何在華為模擬器ensp上進行抓包?
    的頭像 發表于 12-05 11:25 ?4452次閱讀

    何在AT32 MCU上使用FPU功能

    何在AT32 MCU上使用FPU功能
    的頭像 發表于 11-01 17:18 ?4028次閱讀
    如<b class='flag-5'>何在</b>AT32 <b class='flag-5'>MCU</b>上使用FPU功能