Microchip MPU上实时操作系统移植和调试 - 以RT-Thread为例

本文介绍了如何在MicrochipMPU上使用at91bootstrap进行灵活启动,包括系统初始化、RTOS(如RT-Thread)的加载与调试过程,以及如何在Eclipse中配置并进行实例演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

灵活的MPU启动方式

Microchip MPU产品线是通过收购Atmel获取的,原来Atmel MPU内部都有ROM Code,上电的时候首先执行ROM Code里面的程序,该程序会负责寻找外部存储里面是否保存有效程序(at91bootstrap),然后将该程序(at91bootstrap)加载到MPU内部的SRAM运行。在这个阶段,MPU运行用户可订制的at91bootstrap不需要依赖任何外部的DDR内存。
通过使用Microchip提供的 at91bootstrap 这个bootloader,来完成板级硬件的初始化,比如系统时钟的初始化,DDR控制器的初始化,调试接口的初始化等。
在调试的时候通过JLink命令将 at91bootstrap 这个bootloader下载到MPU内部SRAM进行运行,然后再通过JLink命令将第三方的实时操作系统下载到外部DDR里面进行调试,这样就非常高效地进行RTOS的开发。同样在量产运行第三方RTOS的时候,也可以通过at91bootstrap 这个bootloader直接加载RTOS到外部DDR运行。

at91bootstrap的使用

需要先下载at91bootstrap源码
源码下载地址:https://github.com/linux4sam/at91bootstrap

  1. 修改at91bootstrap的Makefile
    修改Makefile

  2. make sam9x75eb_bkptone_defconfig进行配置 ,然后编译:编译at91bootstrap

  3. 拷贝 at91bootstrap二进制文件 :
    拷贝二进制文件

配置Eclipse - 以LinuxRT-Thread为例

使用Eclipse for Embedded C/C++
具体操作流程和仿真配置如下:
新创建工程
选择需要调试的工程
新建Debug配置
创建J-Link调试配置
配置芯片型号和GDB等
配置JLink加载at91bootstrap
设置断点

视频教程合集

视频教程1: SAM9X75移植RT-Thread及CAN通信演示
视频教程2: RT-Thread on SAMA7G54正式版
视频教程3: Linux环境使用Eclipse在SAM9X60 MPU调试RT-Thread RTOS
视频教程4: Linux环境使用Eclipse在SAMA5D2 MPU调试RT-Thread RTOS

Microchip MPU启动代码 - RT-Thread

/*
 ***************************************
 * Public Symbols
 ***************************************
 */

@    .globl    _vector_start
@    .globl    _vector_end

 /*
 ***************************************
 * Interrupt vector table
 ***************************************
 */
    .align      4
    .arm

    .section .vectors, "a", %progbits
    .globl    _vector_start

_vector_start:
/* Reset */
    ldr     pc, _vector_reset
/* Undefined Instruction */
    ldr     pc, _vector_undef
/* Software Interrupt */
    ldr     pc, _vector_swi
/* Prefetch Abort */
    ldr     pc, _vector_pabt
/* Data Abort */
    ldr     pc, _vector_dabt
/* Reserved for future use */
    ldr     pc, _vector_resv
/* Interrupt */
    ldr     pc, _vector_irq
/* Fast interrupt */
    ldr     pc, _vector_fiq

    .globl    __start

_vector_reset:
    .word __start
_vector_undef:
    .word vector_undef
_vector_swi:
    .word vector_swi
_vector_pabt:
    .word vector_pabt
_vector_dabt:
    .word vector_dabt
_vector_resv:
    .word vector_resv
_vector_irq:
    .word vector_irq
_vector_fiq:
    .word vector_fiq

.balignl    16,0xdeadbeef
    .globl _vector_end
_vector_end:
    .size  _vector_start, . - _vector_start
/*
 ***************************************
 * Startup Code
 ***************************************
 */
    .section .textEntry
    .global   __entry

__entry:
    /* Dummy vector table for ROM-code for cases when the real vector table
     * is relocated (QSPI-XIP) */
    ldr     pc, =__start
    ldr     pc, =__start
    ldr     pc, =__start
    ldr     pc, =__start
    ldr     pc, =__start
    .long   0
    ldr     pc, =__start
    ldr     pc, =__start

__start:
/* Set up the fast interrupt stack pointer */

    mrs     r0, CPSR
    bic     r0, r0, #MODE_MASK
    orr     r0, r0, #MODE_FIQ
    msr     CPSR_c, r0
    ldr     sp, =fiq_stack_start
    bic     sp, sp, #0x7
    /* Call low level init function */
    ldr     sp, =svc_stack_start
    ldr     r0, =rt_low_level_init
    blx     r0

    /* Relocate */
    ldr     r0, =_etext
    ldr     r1, =_srelocate
    ldr     r2, =_erelocate

relocate_reset_map:
    cmp     r1, r2
    ldrcc   r3, [r0], #4
    strcc   r3, [r1], #4
    bcc     relocate_reset_map

    /* clear .bss */
    mov     r0,#0                   /* get a zero                       */
    ldr     r1,=__bss_start         /* bss start                        */
    ldr     r2,=__bss_end           /* bss end                          */
/* Interrupt */
vector_fiq:
    stmfd   sp!,{r0-r7,lr}
    bl      rt_hw_trap_fiq
    ldmfd   sp!,{r0-r7,lr}
    subs    pc, lr, #4

vector_irq:
    stmfd   sp!, {r0-r12,lr}

    bl      rt_interrupt_enter
    bl      rt_hw_trap_irq
    bl      rt_interrupt_leave

    @ if rt_thread_switch_interrupt_flag set, jump to
    @ rt_hw_context_switch_interrupt_do and don't return
    ldr     r0, =rt_thread_switch_interrupt_flag
    ldr     r1, [r0]
    cmp     r1, #1
    beq     rt_hw_context_switch_interrupt_do

说明

该教程适用于Linux主机环境下,使用Segger官方提供的JLink工具对Microchip的MPU进行裸跑代码的调试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值