文档章节

Zephyr OS 汇编阶段

Jr小王子
 Jr小王子
发布于 2017/04/06 16:47
字数 658
阅读 45
收藏 0

参考

Zephyr OS 内核篇:系统启动 - 汇编阶段

汇编阶段

/*
 * Copyright (c) 2013-2014 Wind River Systems, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Reset handler
 *
 * Reset handler that prepares the system for running C code.
 */

#include <board.h>
#include <toolchain.h>
#include <sections.h>
#include <arch/cpu.h>
#include <offsets_short.h>
#include "vector_table.h"

_ASM_FILE_PROLOGUE

GTEXT(__reset)
GTEXT(memset)
GDATA(_interrupt_stack)

/**
 *
 * @brief Reset vector
 *
 * Ran when the system comes out of reset. The processor is in thread mode with
 * privileged level. At this point, the main stack pointer (MSP) is already
 * pointing to a valid area in SRAM.
 *
 * Locking interrupts prevents anything but NMIs and hard faults from
 * interrupting the CPU. A default NMI handler is already in place in the
 * vector table, and the boot code should not generate hard fault, or we're in
 * deep trouble.
 *
 * We want to use the process stack pointer (PSP) instead of the MSP, since the
 * MSP is to be set up to point to the one-and-only interrupt stack during later
 * boot. That would not be possible if in use for running C code.
 *
 * When these steps are completed, jump to _PrepC(), which will finish setting
 * up the system for running C code.
 *
 * @return N/A
 */

SECTION_SUBSEC_FUNC(TEXT,_reset_section,__reset)

/*
 * The entry point is located at the __reset symbol, which
 * is fetched by a XIP image playing the role of a bootloader, which jumps to
 * it, not through the reset vector mechanism. Such bootloaders might want to
 * search for a __start symbol instead, so create that alias here.
 */
SECTION_SUBSEC_FUNC(TEXT,_reset_section,__start)

    /* lock interrupts: will get unlocked when switch to main task */
#if defined(CONFIG_ARMV6_M)
    cpsid i
#elif defined(CONFIG_ARMV7_M)
    /**
     直接将中断优先级 _EXC_IRQ_DEFAULT_PRIO 写入中断屏蔽寄存器 BASEPRI
     所有优先级高于 _EXC_IRQ_DEFAULT_PRIO 的中断都会被屏蔽
    */
    movs.n r0, #_EXC_IRQ_DEFAULT_PRIO
    msr BASEPRI, r0
#else
#error Unknown ARM architecture
#endif /* CONFIG_ARMV6_M */

#ifdef CONFIG_WDOG_INIT
    /* board-specific watchdog initialization is necessary */
    bl _WdogInit
#endif

#ifdef CONFIG_INIT_STACKS
    /** 
     初始化中断栈空间,在汇编里面使用寄存器传递参数,
     r0 对应于 memset 的第一个参数
     r1 对应于 memset 的第二个参数
     r2 对应于 memset 的第三个参数
     注意到,栈空间的初始化值是 0xaa,而不是 0x0。用于堆栈溢出检测
    */
    ldr r0, =_interrupt_stack
    ldr r1, =0xaa
    ldr r2, =CONFIG_ISR_STACK_SIZE
    bl memset
#endif

    /*
     * Set PSP and use it to boot without using MSP, so that it
     * gets set to _interrupt_stack during nanoInit().
     */
    ldr r0, =_interrupt_stack
    ldr r1, =CONFIG_ISR_STACK_SIZE
    adds r0, r0, r1
    msr PSP, r0
    movs.n r0, #2	/* switch to using PSP (bit1 of CONTROL reg) */
    msr CONTROL, r0

    b _PrepC

#if defined(CONFIG_SOC_TI_LM3S6965_QEMU)

GTEXT(_do_software_reboot)
SECTION_FUNC(TEXT,_do_software_reboot)

	eors r0, r0

	/* move exception table back to 0 */
	ldr r1, =0xe000e000
	str r0, [r1, #0xd08] /* VTOR */

	ldr r0, [r0, #4]
	bx r0


GTEXT(_force_exit_one_nested_irq)
SECTION_FUNC(TEXT,_force_exit_one_nested_irq)

	ldr r0, =_SCS_ICSR_RETTOBASE
	ldr r1, =_SCS_ICSR
	ldr r1, [r1]
	ands.w r0, r1

	/*
	 *  If Z flag is set, we are nested, so un-nest one level and get back to
	 *  this function to unwind the next level; else, exit the last interrupt
	 *  by jumping to reboot code.
	 */
	ittee eq
		ldreq lr, =0xfffffff1
		ldreq r2, =_force_exit_one_nested_irq
		ldrne lr, =0xfffffffd
		ldrne r2, =_do_software_reboot

	ldr ip, =_interrupt_stack
	add.w ip, #(___esf_t_SIZEOF * 2) /* enough for a stack frame */
	ldr r1, =0xfffffffe
	and.w r2, r1
	str r2, [ip, #(6 * 4)]
	ldr r2, =0x01000000
	str r2, [ip, #(7 * 4)]

	ite eq
		moveq sp, ip
		msrne PSP, ip

	bx lr

#endif

© 著作权归作者所有

共有 人打赏支持
上一篇: 堆栈溢出检测
下一篇: CSD
Jr小王子
粉丝 11
博文 119
码字总数 18368
作品 0
深圳
程序员
私信 提问
zephyr笔记 5.3.1 Zephyr 版本 MCUboot 的编译和使用

1 前言 这一节是翻译自 MCUboot 网站上 MCUboot with Zephyr 。 MCUboot 最初是 Mynewt 的引导程序。此后,它也成为了 Zephyr 的引导程序。Zephyr 的应用程序在编译方式存在较大大的差异,这...

iotisan
05/02
0
0
Zephyr Kernel v1.0.0 发布,实时操作系统

来自 Linux 基金会的实时操作系统 Zephyr 发布了 1.0 内核。Zephyr 内核提供的功能包括: Single address-space OS. Combinesapplication-specific code with a custom kernel to create a ......

oschina
2016/02/19
6K
3
zephyr笔记 5.3 设备固件升级DFU

1 前言 设备固件升级子系统提供必要的框架以在运行时升级基于Zephyr的应用程序的映像。 它目前由两个不同的模块组成: boot /:引导加载程序的接口代码 img_util /:镜像管理代码 DFU子系统处...

iotisan
05/02
0
0
面向物联网的几大开源操作系统

在过去的十年间,大多数新型开源操作系统已从移动市场转向物联网市场。本文介绍了面向物联网的许多新型开源操作系统。我们之前的文章介绍了开源物联网框架,以及面向物联网和消费者智能家居设...

红薯
2016/11/15
5.8K
6
破解Zephyr for JIRA on Atlassian Jira

[Download] Crack + Keygen Zephyr for JIRA on Atlassian Jira all versions BY CHUNGKOL PHAM - IN DOWNLOAD - ON 3/24/2014 - 9 COMMENTS Atlassian Zephyr for JIRA isn't free applicat......

Michaelyn
2014/09/15
0
12

没有更多内容

加载失败,请刷新页面

加载更多

0008-如何卸载CDH(附一键卸载github源码)

1.前置条件 本文档将介绍Cloudera Manager与CDH的卸载,并基于CDH使用parcels安装且未配置安全(AD/LDAP, Kerberos, Data Encryption)的集群,以下是本次测试环境,但不是本操作手册的硬限制...

Hadoop实操
16分钟前
1
0
MySQL Windows下免安装配置

安装MySQL软件 下载MySQL 依据ipems_dvp产品选型需求,选择mysql-5.7.17-winx64。可自行从网上下载,也可从公司拷贝,以下为下载目录和公司归档目录。 下载地址:https://downloads.mysql.c...

PeakFang-BOK
24分钟前
2
0
遍历java项目后台线程

遍历java项目后台线程,加深对项目后台运行线程理解 直接贴代码 import org.springframework.stereotype.Service;import java.lang.management.ManagementFactory;import java.lang.man...

王俊博客
38分钟前
2
0
iOS切面编程

aop编程(面向切面编程),其原理也就是在不更改正常的业务处理流程的前提下,通过生成一个动态代理类,从而实现对目标对象嵌入附加的操作。在iOS中,要想实现相似的效果也很简单,利用OC的动态性,...

RainOrz
46分钟前
2
0
PAT(Basic Level) 乙级练习题 ------ 1047 编程团体赛 java

1047.编程团体赛 题目: 编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。 现给定所有队员的比赛成绩,请你编写程序找...

Carol998
58分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部