色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

【御芯微UCM108E開發板試用體驗】二次開發代碼啟動分析

開發板試用精選 ? 來源:開發板試用 ? 作者:電子發燒友論壇 ? 2022-11-24 17:05 ? 次閱讀

本文來源電子發燒友社區,作者:許鵬虎, 帖子地址:https://bbs.elecfans.com/jishu_2286915_1_1.html

UCM108E二次開發代碼啟動分析

簡介

UCM108E內置了一顆RISC-V核心的UC8188MCU,所以其實也是在分析UC8188的啟動過程。UC8188 是一款高性能 MCU GNSS 多模衛星導航接收機 SoC 芯片。 芯片集成了 RISCV 32 位通用處理器, 數字基帶處理器, 射頻前端, 具有 4Mb 內嵌的閃存。 擁有 SPI、I2CUARTx2 以及其它豐富的外設。

啟動過程分析

  1. MCU啟動一般情況下是從reset中斷開始的,我們拿到的這顆MCU也是這樣,找到它的啟動匯編代碼,找到reset中斷入口

XoLRjU.md.png

  1. 分析這段啟動代碼
/* reset 中斷入口 */
reset_handler:
  csrw mtvec, x0
  csrci  mstatus, 0x08
  /* 1. 將所有寄存器置位為0 set all registers to zero */
  mv  x1, x0
  mv  x2, x1
  mv  x3, x1
  mv  x4, x1
  mv  x5, x1
  mv  x6, x1  
  mv  x7, x1 
  mv  x8, x1  
  mv  x9, x1 
  mv x10, x1
  mv x11, x1
  mv x12, x1
  mv x13, x1
  mv x14, x1
  mv x15, x1
  mv x16, x1
  mv x17, x1
  mv x18, x1
  mv x19, x1
  mv x20, x1
  mv x21, x1
  mv x22, x1
  mv x23, x1
  mv x24, x1
  mv x25, x1
  mv x26, x1
  mv x27, x1
  mv x28, x1
  mv x29, x1
  mv x30, x1
  mv x31, x1

#ifdef ARCH_RISCV_FPU
  fssr    x0
  fmv.s.x f0, x0
  fmv.s.x f1, x0
  fmv.s.x f2, x0
  fmv.s.x f3, x0
  fmv.s.x f4, x0
  fmv.s.x f5, x0
  fmv.s.x f6, x0
  fmv.s.x f7, x0
  fmv.s.x f8, x0
  fmv.s.x f9, x0
  fmv.s.x f10,x0
  fmv.s.x f11,x0
  fmv.s.x f12,x0
  fmv.s.x f13,x0
  fmv.s.x f14,x0
  fmv.s.x f15,x0
  fmv.s.x f16,x0
  fmv.s.x f17,x0
  fmv.s.x f18,x0
  fmv.s.x f19,x0
  fmv.s.x f20,x0
  fmv.s.x f21,x0
  fmv.s.x f22,x0
  fmv.s.x f23,x0
  fmv.s.x f24,x0
  fmv.s.x f25,x0
  fmv.s.x f26,x0
  fmv.s.x f27,x0
  fmv.s.x f28,x0
  fmv.s.x f29,x0
  fmv.s.x f30,x0
  fmv.s.x f31,x0
#endif

  /* 2. 初始化堆棧 stack initilization */
  la   x2, _stack_start


_start:
  .global _start
  
  /* 3. 將bss段清零 clear BSS */
  la x26, _bss_start
  la x27, _bss_end

  bge x26, x27, zero_loop_end

zero_loop:
  sw x0, 0(x26)
  addi x26, x26, 4
  ble x26, x27, zero_loop
zero_loop_end:

  /* 4. 運行全局初始化函數 Run global initialization functions */
  li a0, 1                      /* set app mode */
  call  set_program_type
  
  call  boot_noop
  call  boot_strap /* 關閉全局中斷 配置時鐘和XIP */
  call  __libc_init_array
  j main_entry   /* 跳轉到main_entry 在下面*/
.section .crt0, "ax" 

main_entry:
  addi   x10, x0, 0
  /* Baud Rate 156250 
  *clock divider, SYSCLK/156250/16-1
  *5MHZ 1; 50MHZ 19
  * 103.68Mhz clk, 115200 sv model 89
  * 19.6608Mhz clk, VHD model, value 4. VHD
  * 196/2Mhz   VHD model value 84 for 115200
  */
  //addi   x11, x0, 84 //98Mhz, 1152000 for sim
  addi   x11, x0, 70  //131.072Mhz, 115200 for sim
  //addi   x11, x0, 22 //26M DCXO, just leave it here, not necessary
  //jal  uart_set_cfg 
  
  /* jump to main program entry point (argc = argv = 0) */
  addi x10, x0, 0
  addi x11, x0, 0
  jal x1, entry   /* 跳轉到entry函數 */

  jal  uart_wait_tx_done;

  /* if program exits call exit routine from library */
  jal  x1, exit
  1. 通過以上的分析,我們看到最后是跳轉到entry函數去了,這個entry就是rt-thread的入口函數,接下來,我們看在這個函數里做了哪些事情

XoLXuD.md.png

  1. 在entry函數里面其實就是調用了rtthread_startup()函數,然后,我們重點分析一下這個函數里面都做了哪些事情
int rtthread_startup(void)
{
    // 關閉全局中斷
    rt_hw_interrupt_disable();

    /* board level initialization
     * NOTE: please initialize heap inside board initialization.
     * 板子相關的初始化,主要是啟動了systick
     */
    rt_hw_board_init();

    /* show RT-Thread version */
    rt_show_version();

    /* 系統定時器初始化,后續的任務切換調度都會用到這個timer,timer system initialization */
    rt_system_timer_init();

    /* 初始化系統調度器 scheduler system initialization */
    rt_system_scheduler_init();

#ifdef RT_USING_SIGNALS
    /* signal system initialization */
    rt_system_signal_init();
#endif

    /* 創建main線程并啟動 create init_thread */
    rt_application_init();

    /* 創建timer線程并啟動 timer thread initialization */
    rt_system_timer_thread_init();

    /* 創建空閑線程并啟動 idle thread initialization */
    rt_thread_idle_init();

#ifdef RT_USING_SMP
    rt_hw_spin_lock(&_cpus_lock);
#endif /*RT_USING_SMP*/

    /* 啟動調度器 start scheduler */
    rt_system_scheduler_start();

    /* never reach here */
    return 0;
}
  1. 通過對以上的分析,我們大概知道rt-thread創建了幾個必要的線程并啟動了調度器,這個時候就會啟動剛才創建的線程,其中用戶關心的則是main線程,我們看下main線程里面做了哪些工作
/* the system main thread */
void main_thread_entry(void* parameter)
{
    extern int main(void);

#ifdef RT_USING_COMPONENTS_INIT
    /* RT-Thread components initialization */
    rt_components_init();
#endif

#ifdef RT_USING_SMP
    rt_hw_secondary_cpu_up();
#endif
    /* invoke system main function */
#if defined(__CC_ARM) || defined(__CLANG_ARM)
    {
        extern int $Super$$main(void);
        $Super$$main(); /* for ARMCC. */
    }
#elif defined(__ICCARM__) || defined(__GNUC__) || defined(__TASKING__)
    main();  // 運行main函數
#endif
}
  1. 其實這個線程最終是為了調用main函數,也就是我們用戶編程的入口函數
int main(void)
{
        int_disable();
        REG_INT_PEND = 0x0;
#ifdef _WTG_OPEN_
        wdt_init(UC_WATCHDOG, 5000);
        wdt_enable(UC_WATCHDOG);
#endif
        InitUart(UART_BSP_115200);
        GnssStart(get_pos, 0x7f, FALSE, NULL);
        
        g_hTaskUartTx = rt_thread_create("Task Uart Tx", TaskUartTx, NULL, TSK_STACK_SIZE_UART_TX, 10, 10);
        
        if(g_hTaskUartTx == RT_NULL)
                printf("tx task create failed!rn");
        else
        {
                rt_thread_startup(g_hTaskUartTx);
                printf("tx task is start!rn");
        }
        
        g_hTaskUartRx = rt_thread_create("Task Uart Rx", TaskUartRx, NULL, TSK_STACK_SIZE_UART_RX, 10, 10);
        
        if(g_hTaskUartRx == RT_NULL)
                printf("rx task create failed!rn");
        else
        {
                rt_thread_startup(g_hTaskUartRx);
                printf("rx task is start!rn");
        }
#ifdef _WTG_OPEN_
        wdt_feed(UC_WATCHDOG);
#endif
}
  1. 分析到這里我們應該清楚的知道UCM108E從上電到main的整個運行流程了。

如果大家對rt-thread感興趣,可以訪問官網獲取更多學習資料。后續還會分享RISC-V任務切換相關知識。

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

    關注

    4

    文章

    57

    瀏覽量

    3324
  • 開發板試用
    +關注

    關注

    3

    文章

    301

    瀏覽量

    2111
  • UCM108E
    +關注

    關注

    0

    文章

    13

    瀏覽量

    152
收藏 人收藏

    評論

    相關推薦

    TSW14J56EVM板卡提供二次開發的接口怎么使用的?

    TSW14J56EVM板卡提供二次開發的接口怎么使用的,有沒有詳細的使用說明文檔?
    發表于 01-03 07:29

    開發板/主板Android系統APK簽名文件使用方法,實用干貨

    主板/開發板Android系統,APK系統簽名文件使用方法
    的頭像 發表于 12-26 09:43 ?259次閱讀
    瑞<b class='flag-5'>芯</b><b class='flag-5'>微</b><b class='flag-5'>開發板</b>/主板Android系統APK簽名文件使用方法,實用干貨

    SOLIDWORKS二次開發參數化設計工具? 慧德敏學

    SOLIDWORKS二次開發參數化設計工具?涵蓋選型、建模、裝配、出圖、編碼、報表、集成等眾多環節和任務的整合,我們除了提供專業培訓,還可針對實際產品提供項目導入,實現交鑰匙工程,消除企業的所有風險
    的頭像 發表于 12-20 16:21 ?139次閱讀

    SOLIDWORKS二次開發應用范圍與實例

    SOLIDWORKS二次開發為企業和設計師們提供了廣闊的定制化空間,能夠更好地滿足復雜多變的設計需求,幫助工程師和設計師提高工作效率,實現更復雜的自動化任務。如您有SOLIDWORKS二次開發需求,歡迎咨詢Solidkits
    的頭像 發表于 12-13 16:33 ?183次閱讀

    主板/開發板Linux系統播放音頻方法,觸覺智能RK3562開發板演示

    本文介紹瑞方案主板/開發板Linux系統播放音頻的方法,觸覺智能RK3562開發板演示,通用RK3566、RK3568、RK3588等
    的頭像 發表于 12-13 11:40 ?243次閱讀
    瑞<b class='flag-5'>芯</b><b class='flag-5'>微</b>主板/<b class='flag-5'>開發板</b>Linux系統播放音頻方法,觸覺智能RK3562<b class='flag-5'>開發板</b>演示

    可以改TSW1405內部程序或者是修改HSDC PRO的程序做二次開發嗎?

    可以改TSW1405內部程序或者是修改HSDC PRO 的程序做二次開發嗎?
    發表于 11-27 07:29

    追加名額丨米爾瑞RK3576開發板有獎試用

    米爾與瑞合作發布的新品基于瑞RK3576應用處理器的MYD-LR3576開發板免費試用
    的頭像 發表于 11-22 01:00 ?205次閱讀
    追加名額丨米爾瑞<b class='flag-5'>芯</b><b class='flag-5'>微</b>RK3576<b class='flag-5'>開發板</b>有獎<b class='flag-5'>試用</b>

    有獎丨米爾 瑞RK3576開發板免費試用

    米爾與瑞合作發布的新品基于瑞RK3576應用處理器的MYD-LR3576開發板免費試用
    的頭像 發表于 11-12 01:00 ?343次閱讀
    有獎丨米爾 瑞<b class='flag-5'>芯</b><b class='flag-5'>微</b>RK3576<b class='flag-5'>開發板</b>免費<b class='flag-5'>試用</b>

    有獎試用!!RA-Eco-RA4E2-64PIN-V1.0開發板試用活動開始報名

    有獎試用!!RA-Eco-RA4E2-64PIN-V1.0開發板試用活動開始報名
    的頭像 發表于 11-09 01:02 ?274次閱讀
    有獎<b class='flag-5'>試用</b>!!RA-Eco-RA4<b class='flag-5'>E</b>2-64PIN-V1.0<b class='flag-5'>開發板</b><b class='flag-5'>試用</b>活動開始報名

    什么~FPGA可以自行二次開發了?

    什么!FPGA可以自行二次開發了? 目前市場上的標準采集卡通常不支持用戶自行開發FPGA。但因為應用環境的需要,不僅僅只需要單一的數據采集流程,往往還需要在其中嵌入更復雜的運行和分析邏輯。為了解
    的頭像 發表于 10-14 15:47 ?241次閱讀
    什么~FPGA可以自行<b class='flag-5'>二次開發</b>了?

    【RA-Eco-RA0E1-32PIN-V1.0開發板試用】點燈

    RA0E1開發板試用報告 試用單位 : 個人開發板 : RA0E1 一、背景 很榮幸獲得由電子發
    發表于 09-24 11:54

    RK3588開發板Linux系統添加自啟動命令的方法,深圳觸覺智能Arm嵌入式鴻蒙硬件方案商

    本文適用所有Linux系統的開發板、主板添加自啟動命令的方法,本次使用了觸覺智能的EVB3588開發板演示,搭載了瑞RK3588旗艦芯片
    的頭像 發表于 09-19 09:32 ?713次閱讀
    瑞<b class='flag-5'>芯</b><b class='flag-5'>微</b>RK3588<b class='flag-5'>開發板</b>Linux系統添加自<b class='flag-5'>啟動</b>命令的方法,深圳觸覺智能Arm嵌入式鴻蒙硬件方案商

    ARMxy ARM工業邊緣計算網關帶Ubuntu OS支持二次開發

    ARMxy系列工業邊緣計算網關,搭載Ubuntu操作系統,不僅提供了強大的數據處理能力,而且通過支持二次開發,為企業提供了定制化解決方案的可能性。本文將深入探討ARMxy網關的技術特性、Ubuntu
    的頭像 發表于 08-19 15:32 ?424次閱讀
    ARMxy ARM工業邊緣計算網關帶Ubuntu OS支持<b class='flag-5'>二次開發</b>

    5G千兆雙核物聯網模塊 OpenWrt二次開發

    HLK-RM20是海凌科2024年推出的首款路由模塊,多端口5G千兆網關,雙核ARM處理器,1.3GHz主頻,支持Openwrt二次開發。高性能、高速率、低延遲,功能強大,應用廣泛。
    的頭像 發表于 06-03 14:23 ?1203次閱讀
    5G千兆雙核物聯網模塊 OpenWrt<b class='flag-5'>二次開發</b>

    個性化定制,提升運營效率:SAP二次開發引領企業數字化轉型

    SAP二次開發引領企業數字化轉型 隨著企業競爭的日益激烈,定制化管理方案成為企業實現差異化競爭的重要工具。SAP作為全球領先的企業管理軟件提供商,SAP二次開發服務應運而生,為企業提供個性定制
    的頭像 發表于 02-18 13:29 ?436次閱讀
    主站蜘蛛池模板: 99国产精品久久| 国精产品一区一区三区有限在线 | 征服艳妇后宫春色| 亚洲欧美精品一中文字幕| 黑人性xxx| 伦理片秋霞免费影院| 最新国产在线视频| 日本一卡二卡三卡四卡无卡免费播放 | 精品国产原创在线观看视频| 三级黄色小视频| 爱很烂qvod| 暖暖直播免费观看韩国| 中文在线免费看视频| 欧美三级在线完整版免费| 国产精品…在线观看| 色戒床震视频片段| 成人毛片一区二区三区| 内射白嫩少妇超碰| 97亚洲狠狠色综合久久位| 肉多的小说腐小说| 久久精品WWW人人爽人人| 一本道高清无码v| 国产亚洲精品久久久久久一区二区 | 中文字幕午夜乱理片| 日日干夜夜艹| 久久精品天天爽夜夜爽| 一级黄色香蕉视频| 日本女人下面毛茸茸| 久久99这里只有精品| 成人在线观看免费视频| 又亲又揉摸下面视频免费看| 三叶草成人| 免费人成视频X8X8国产更快乐 | 一区二区不卡在线视频| 久久电影精品| 动漫在线观看免费肉肉| 18禁止看的免费污网站| 亚洲国产五月综合网| 日韩人妻无码精品-专区| 麻豆免费观看高清完整视频在线| 99精品视频在线观看re|