99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

開發(fā)板試用精選 ? 來源:開發(fā)板試用 ? 作者:電子發(fā)燒友論壇 ? 2022-11-24 17:05 ? 次閱讀
加入交流群
微信小助手二維碼

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

UCM108E二次開發(fā)代碼啟動分析

簡介

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

啟動過程分析

  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. 運行全局初始化函數(shù) Run global initialization functions */
  li a0, 1                      /* set app mode */
  call  set_program_type
  
  call  boot_noop
  call  boot_strap /* 關(guān)閉全局中斷 配置時鐘和XIP */
  call  __libc_init_array
  j main_entry   /* 跳轉(zhuǎn)到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   /* 跳轉(zhuǎn)到entry函數(shù) */

  jal  uart_wait_tx_done;

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

XoLXuD.md.png

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

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

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

    /* 系統(tǒng)定時器初始化,后續(xù)的任務(wù)切換調(diào)度都會用到這個timer,timer system initialization */
    rt_system_timer_init();

    /* 初始化系統(tǒng)調(diào)度器 scheduler system initialization */
    rt_system_scheduler_init();

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

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

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

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

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

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

    /* never reach here */
    return 0;
}
  1. 通過對以上的分析,我們大概知道rt-thread創(chuàng)建了幾個必要的線程并啟動了調(diào)度器,這個時候就會啟動剛才創(chuàng)建的線程,其中用戶關(guān)心的則是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函數(shù)
#endif
}
  1. 其實這個線程最終是為了調(diào)用main函數(shù),也就是我們用戶編程的入口函數(shù)
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. 分析到這里我們應(yīng)該清楚的知道UCM108E從上電到main的整個運行流程了。

如果大家對rt-thread感興趣,可以訪問官網(wǎng)獲取更多學(xué)習(xí)資料。后續(xù)還會分享RISC-V任務(wù)切換相關(guān)知識。

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

    關(guān)注

    4

    文章

    58

    瀏覽量

    3554
  • 開發(fā)板試用
    +關(guān)注

    關(guān)注

    3

    文章

    302

    瀏覽量

    2400
  • UCM108E
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    有獎丨米爾 瑞RK3506開發(fā)板免費試用來啦!

    米爾與瑞合作發(fā)布的新品基于瑞RK3506應(yīng)用處理器的MYD-YR3506開發(fā)板免費試用
    的頭像 發(fā)表于 07-10 08:03 ?110次閱讀
    有獎丨米爾 瑞<b class='flag-5'>芯</b><b class='flag-5'>微</b>RK3506<b class='flag-5'>開發(fā)板</b>免費<b class='flag-5'>試用</b>來啦!

    有獎丨米爾 瑞RK3506開發(fā)板免費試用

    米爾與瑞合作發(fā)布的新品基于瑞RK3506應(yīng)用處理器的MYD-YR3506開發(fā)板免費試用
    的頭像 發(fā)表于 06-19 08:04 ?347次閱讀
    有獎丨米爾 瑞<b class='flag-5'>芯</b><b class='flag-5'>微</b>RK3506<b class='flag-5'>開發(fā)板</b>免費<b class='flag-5'>試用</b>

    有獎丨米爾 瑞RK3562開發(fā)板免費試用新增名額!

    米爾與瑞合作發(fā)布的新品基于瑞RK3562應(yīng)用處理器的MYD-YR3562開發(fā)板免費試用
    的頭像 發(fā)表于 06-13 08:04 ?377次閱讀
    有獎丨米爾 瑞<b class='flag-5'>芯</b><b class='flag-5'>微</b>RK3562<b class='flag-5'>開發(fā)板</b>免費<b class='flag-5'>試用</b>新增名額!

    云MES系統(tǒng)源碼,支持 SaaS 多租戶,支持二次開發(fā)

    萬界星空科技MES生產(chǎn)制造執(zhí)行系統(tǒng)源碼,有演示,多個項目應(yīng)用案例,成熟穩(wěn)定。支持二次開發(fā),商業(yè)授權(quán)后可商用。
    的頭像 發(fā)表于 05-07 11:14 ?230次閱讀
    云MES系統(tǒng)源碼,支持 SaaS 多租戶,支持<b class='flag-5'>二次開發(fā)</b>

    有獎丨米爾 瑞YR3562開發(fā)板免費試用

    米爾與瑞合作發(fā)布的新品基于瑞RK3562應(yīng)用處理器的MYD-YR3562開發(fā)板免費試用
    的頭像 發(fā)表于 03-20 08:05 ?515次閱讀
    有獎丨米爾 瑞<b class='flag-5'>芯</b><b class='flag-5'>微</b>YR3562<b class='flag-5'>開發(fā)板</b>免費<b class='flag-5'>試用</b>

    DLP6500想調(diào)用API進行自主二次開發(fā),怎么構(gòu)建開發(fā)環(huán)境?

    請問一下,我購置了DLP6500型號產(chǎn)品,想利用該產(chǎn)品進行開發(fā),實現(xiàn)高速投影的功能。 但是我現(xiàn)在只找到了GUI界面,請問一下,如果我想調(diào)用API進行自主二次開發(fā),怎么構(gòu)建開發(fā)環(huán)境? 最好有相關(guān)的技術(shù)指導(dǎo)文件,謝謝。
    發(fā)表于 03-03 07:03

    怎么配置dlp6500二次開發(fā)的環(huán)境,可以使用VS2013嗎?

    我想請問一下,怎么配置dlp6500二次開發(fā)的環(huán)境,可以使用VS2013嗎?有沒有什么可以參考的文件,感謝!
    發(fā)表于 02-28 06:39

    Banana Pi開源社區(qū)基于瑞RK3588開發(fā)板,DeepSeek開發(fā)利器

    Banana Pi開源社區(qū)基于瑞RK3588開發(fā)板,DeepSeek開發(fā)利器
    的頭像 發(fā)表于 02-19 18:25 ?1765次閱讀
    Banana Pi開源社區(qū)基于瑞<b class='flag-5'>芯</b><b class='flag-5'>微</b>RK3588<b class='flag-5'>開發(fā)板</b>,DeepSeek<b class='flag-5'>開發(fā)</b>利器

    DLP4500-C350REF如何在linux下借助SDK二次開發(fā)

    請問在哪里有二次開發(fā)環(huán)境配置文檔
    發(fā)表于 02-18 08:24

    深居淺出AutoCAD二次開發(fā)

    深居淺出AutoCAD二次開發(fā),net版
    發(fā)表于 01-06 14:12 ?9次下載

    SOLIDWORKS二次開發(fā)應(yīng)用范圍與實例

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

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

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

    有獎丨米爾 瑞RK3576開發(fā)板免費試用

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

    什么~FPGA可以自行二次開發(fā)了?

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

    ARMxy ARM工業(yè)邊緣計算網(wǎng)關(guān)帶Ubuntu OS支持二次開發(fā)

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