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

    文章

    60

    浏览量

    3851
  • 开发板试用
    +关注

    关注

    3

    文章

    303

    浏览量

    2787
  • UCM108E
    +关注

    关注

    0

    文章

    13

    浏览量

    244
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【请教】FPGA烧录软件工具二次开发问题

    请教各位大佬: Vivado 2018.3和Pango Design Suite 2025.1 这两款FPGA烧录软件工具能够二次开发吗?实现上位机控制软件调用它们,实现自动化的FPGA测试程序烧录和烧录成功的反馈信号。
    发表于 03-17 16:34

    宇树人形机器人的配置,核心代码,调试方法,二次开发接口

    宇树人形机器人的配置,核心代码,调试方法,二次开发接口
    的头像 发表于 12-10 09:05 5783次阅读

    将蜂鸟E203的内核移植到fpga之后该怎么进行二次开发呢?

    你们好!请问一下我将蜂鸟E203的内核移植到fpga之后该怎么进行二次开发呢?比如我想点亮板子上的led?驱动摄像头进行图像识别?这些该如何进行呢?蜂鸟有类似freedom studio这样的嵌入式开发平台吗?
    发表于 11-10 07:09

    直播回顾 | 掌握车载通信核心技术,虹科CAN总线实战:PCAN二次开发技术直播助您轻松拿捏总线开发“创新引擎

    •1CAN总线二次开发:构建智能汽车“神经网络”的核心能力在“软件定义汽车”的时代,整车电子电气架构正从分布走向集中,车载网络的数据量和复杂度呈指数级增长。基于PCAN等专业工具的二次开发能力
    的头像 发表于 10-09 17:33 789次阅读
    直播回顾 | 掌握车载通信核心技术,虹科CAN总线实战:PCAN<b class='flag-5'>二次开发</b>技术直播助您轻松拿捏总线<b class='flag-5'>开发</b>“创新引擎

    【作品合集】中科昊Core_DSC280025C开发板测评

    的应用 【中科昊Core_DSC280025C开发板试用体验】---外部中断问题 第一期合集: 五科技CF5010RBT60开发板测评作
    发表于 09-18 10:52

    安信可VC-01/02二次开发篇: PWM输出

    系列教程 【二次开发篇】虚拟开发环境搭建和分享 安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】事件和GPI
    的头像 发表于 08-27 16:06 1164次阅读
    安信可VC-01/02<b class='flag-5'>二次开发</b>篇: PWM输出

    安信可VC-01/02二次开发篇: 事件和GPIO控制

    系列教程 【二次开发篇】虚拟开发环境搭建和分享 安信可离线语音模组 VC-01、VC-02 系列教程 【二次开发篇】事件和GPIO控
    的头像 发表于 08-19 14:02 1418次阅读
    安信可VC-01/02<b class='flag-5'>二次开发</b>篇: 事件和GPIO控制

    有奖丨米尔 瑞RK3506开发板免费试用来啦!

    米尔与瑞合作发布的新品基于瑞RK3506应用处理器的MYD-YR3506开发板免费试用
    的头像 发表于 07-10 08:03 1232次阅读
    有奖丨米尔 瑞<b class='flag-5'>芯</b><b class='flag-5'>微</b>RK3506<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>来啦!

    有奖丨米尔 瑞RK3506开发板免费试用

    米尔与瑞合作发布的新品基于瑞RK3506应用处理器的MYD-YR3506开发板免费试用
    的头像 发表于 06-19 08:04 1274次阅读
    有奖丨米尔 瑞<b class='flag-5'>芯</b><b class='flag-5'>微</b>RK3506<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>

    有奖丨米尔 瑞RK3562开发板免费试用新增名额!

    米尔与瑞合作发布的新品基于瑞RK3562应用处理器的MYD-YR3562开发板免费试用
    的头像 发表于 06-13 08:04 2032次阅读
    有奖丨米尔 瑞<b class='flag-5'>芯</b><b class='flag-5'>微</b>RK3562<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>新增名额!

    【新品】远距离图传数传模块开发板、蓝牙模块开发板、无线模块开发板

    ,搭配亿佰特自研的远距离图传+数传为一体的远距离无线模块E611-900NW20S进行使用。该款开发板具备完整的功能,拥有16Mbps的传输速率,可实现传输4路108
    的头像 发表于 06-12 19:33 1444次阅读
    【新品】远距离图传数传模块<b class='flag-5'>开发板</b>、蓝牙模块<b class='flag-5'>开发板</b>、无线模块<b class='flag-5'>开发板</b>

    性能强悍!合众HZ-RK3568开发板试用体验

    月19日   评测数量: 10块   更多热点文章阅读 基于平头哥TH1520芯片,润开鸿HH-SCDAYU800A开发板免费试用 RISC-V开发板深度评测!顶级开发板免费
    的头像 发表于 06-05 16:30 1719次阅读
    性能强悍!合众HZ-RK3568<b class='flag-5'>开发板</b><b class='flag-5'>试用</b>体验

    【免费试用开发板评测大赛开启!OH 、RISC-V、Rockchip顶级开发板等你试用~

    技术人的狂欢,开发者的盛宴!2025年最值得期待的硬核赛事——电子发烧友开发板评测大赛正式启动!无论你是开源生态的探索者、芯片架构的极客,还是物联网领域的创新达人,本次大赛三大赛
    的头像 发表于 06-05 08:05 1187次阅读
    【免费<b class='flag-5'>试用</b>】<b class='flag-5'>开发板</b>评测大赛开启!OH 、RISC-V、Rockchip顶级<b class='flag-5'>开发板</b>等你<b class='flag-5'>试用</b>~

    【评测试用】合众HZ-T536开发板免费试用体验

    【评测试用】合众HZ-T536开发板免费试用体验
    的头像 发表于 05-27 08:05 1245次阅读
    【评测<b class='flag-5'>试用</b>】合众HZ-T536<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>体验

    云MES系统源码,支持 SaaS 多租户,支持二次开发

    万界星空科技MES生产制造执行系统源码,有演示,多个项目应用案例,成熟稳定。支持二次开发,商业授权后可商用。
    的头像 发表于 05-07 11:14 945次阅读
    云MES系统源码,支持 SaaS 多租户,支持<b class='flag-5'>二次开发</b>