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

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

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

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

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

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

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

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

簡(jiǎn)介

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

啟動(dòng)過程分析

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

XoLRjU.md.png

  1. 分析這段啟動(dòng)代碼
/* 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. 運(yùn)行全局初始化函數(shù) Run global initialization functions */
  li a0, 1                      /* set app mode */
  call  set_program_type
  
  call  boot_noop
  call  boot_strap /* 關(guān)閉全局中斷 配置時(shí)鐘和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ù)去了,這個(gè)entry就是rt-thread的入口函數(shù),接下來,我們看在這個(gè)函數(shù)里做了哪些事情

XoLXuD.md.png

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

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

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

    /* 系統(tǒng)定時(shí)器初始化,后續(xù)的任務(wù)切換調(diào)度都會(huì)用到這個(gè)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線程并啟動(dòng) create init_thread */
    rt_application_init();

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

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

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

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

    /* never reach here */
    return 0;
}
  1. 通過對(duì)以上的分析,我們大概知道rt-thread創(chuàng)建了幾個(gè)必要的線程并啟動(dòng)了調(diào)度器,這個(gè)時(shí)候就會(huì)啟動(dòng)剛才創(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();  // 運(yùn)行main函數(shù)
#endif
}
  1. 其實(shí)這個(gè)線程最終是為了調(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的整個(gè)運(yùn)行流程了。

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

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

    關(guān)注

    4

    文章

    57

    瀏覽量

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

    關(guān)注

    3

    文章

    301

    瀏覽量

    2132
  • UCM108E
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    153
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

    開發(fā)板/主板Android系統(tǒng)APK簽名文件使用方法,實(shí)用干貨

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

    SOLIDWORKS二次開發(fā)參數(shù)化設(shè)計(jì)工具? 慧德敏學(xué)

    SOLIDWORKS二次開發(fā)參數(shù)化設(shè)計(jì)工具?涵蓋選型、建模、裝配、出圖、編碼、報(bào)表、集成等眾多環(huán)節(jié)和任務(wù)的整合,我們除了提供專業(yè)培訓(xùn),還可針對(duì)實(shí)際產(chǎn)品提供項(xiàng)目導(dǎo)入,實(shí)現(xiàn)交鑰匙工程,消除企業(yè)的所有風(fēng)險(xiǎn)
    的頭像 發(fā)表于 12-20 16:21 ?174次閱讀

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

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

    主板/開發(fā)板Linux系統(tǒng)播放音頻方法,觸覺智能RK3562開發(fā)板演示

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

    可以改TSW1405內(nèi)部程序或者是修改HSDC PRO的程序做二次開發(fā)嗎?

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

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

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

    有獎(jiǎng)丨米爾 瑞RK3576開發(fā)板免費(fèi)試用

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

    有獎(jiǎng)試用?。A-Eco-RA4E2-64PIN-V1.0開發(fā)板試用活動(dòng)開始報(bào)名

    有獎(jiǎng)試用!!RA-Eco-RA4E2-64PIN-V1.0開發(fā)板試用活動(dòng)開始報(bào)名
    的頭像 發(fā)表于 11-09 01:02 ?321次閱讀
    有獎(jiǎng)<b class='flag-5'>試用</b>?。A-Eco-RA4<b class='flag-5'>E</b>2-64PIN-V1.0<b class='flag-5'>開發(fā)板</b><b class='flag-5'>試用</b>活動(dòng)開始報(bào)名

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

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

    RK3588開發(fā)板Linux系統(tǒng)添加自啟動(dòng)命令的方法,深圳觸覺智能Arm嵌入式鴻蒙硬件方案商

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

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

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

    5G千兆雙核物聯(lián)網(wǎng)模塊 OpenWrt二次開發(fā)

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

    個(gè)性化定制,提升運(yùn)營(yíng)效率:SAP二次開發(fā)引領(lǐng)企業(yè)數(shù)字化轉(zhuǎn)型

    SAP二次開發(fā)引領(lǐng)企業(yè)數(shù)字化轉(zhuǎn)型 隨著企業(yè)競(jìng)爭(zhēng)的日益激烈,定制化管理方案成為企業(yè)實(shí)現(xiàn)差異化競(jìng)爭(zhēng)的重要工具。SAP作為全球領(lǐng)先的企業(yè)管理軟件提供商,SAP二次開發(fā)服務(wù)應(yīng)運(yùn)而生,為企業(yè)提供個(gè)性定制
    的頭像 發(fā)表于 02-18 13:29 ?451次閱讀
    主站蜘蛛池模板: 亚洲精品久久99蜜芽尤物TV | 韩日午夜在线资源一区二区 | 高清国产mv视频在线观看 | 渔夫床满艳史bd高清在线直播 | 精品国产国偷自产在线观看 | 99久久精品国产交换 | 为什么丈夫插我我却喜欢被打着插 | FERRCHINA内入内射 | 中文字幕在线观看网站 | 欧美日韩精品久久久免费观看 | 中文在线中文资源 | 国产精品久久久精品a级小说 | 翁公咬着小娇乳H边走边欢A | 男女后进式猛烈xx00动态图片 | 干性感美女 | 999久久免费高清热精品 | 99九九精品国产高清自在线 | 处 女 开 破小说 | 777午夜精品久久AV蜜臀 | 日本一在线中文字幕 | 午夜亚洲精品不卡在线 | 白洁在线观看 | 国产精品成人免费 | 精品国产午夜肉伦伦影院 | 亚洲爆乳少妇精品无码专区 | 99久久国产综合精品网成人影院 | 亚洲中文字幕永久在线全国 | 久久亚洲AV无码精品午色夜麻豆 | 久久9精品区-无套内射无码 | 中国大陆一级毛片免费 | 人妻夜夜爽天天爽三区麻豆AV网站 | 人妻兽虐曲 | 国产AV一区二区三区日韩 | 一二三四在线视频社区8 | 欧美性动漫3d在线观看完整版 | 成年人免费观看的视频 | 精品一区二区三区高清免费观看 | 越南女 黑人 痛苦 大叫 | 看美女大腿中间的部分 | 久久99热狠狠色AV蜜臀 | 国产白丝精品爽爽久久久久久蜜臀 |