Microchip MPU上跑实时操作系统
灵活的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
-
修改at91bootstrap的Makefile:
-
make sam9x75eb_bkptone_defconfig进行配置 ,然后编译:
-
拷贝 at91bootstrap二进制文件 :
配置Eclipse - 以LinuxRT-Thread为例
使用Eclipse for Embedded C/C++
具体操作流程和仿真配置如下:
视频教程合集
视频教程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进行裸跑代码的调试