系统初始化

系统初始化

前提是你 提交于 2020-03-31 13:05:08
RTOS系统的启动 在系统上电时,第一个执行的启动文件是汇编语言编写的复位函数Reset_Handler,复位函数最后会调用C库函数_ _main,__main的主要工作是初始化系统的堆和栈,最后调用C中的main()函数,从而进入C的世界。 目录 1 系统初始化 1.1 空闲任务初始化 1.1.1 空闲任务的作用 1.2 时钟节拍任务 2 CPU初始化 2.1 时间戳 2.1.1 时间戳的实现 2.1.1.1 CPU初始化函数 2.1.1.2 时间戳初始化函数 2.1.1.3 时间戳定时器初始化函数 3 SysTick初始化 由此可见,任务中的延时使用的是软件延时,即还是让CPU空等来达到延时的效果。使用RTOS的优势就是充分发挥CPU的性能,永远不让它闲着。任务如果需要延时,也就不能再让CPU空等来实现延时的效果。 RTOS中的延时叫阻塞延时,即当任务需要延时时,会放弃CPU的使用权,CPU可以去做其他的事情,当任务延时时间到,将重新获得CPU的使用权继续运行,这样就可以充分利用CPU,而不是空等。 4 内存初始化 5 OSStart() 1 系统初始化 系统初始化是根据我们配置宏定义进行的,有一些则是系统必要的初始化,如空闲任务、时钟节拍任务等。 注意: 在系统初始化中,空闲任务的初始化和时钟节拍任务的初始化是必须存在的任务,否则系统无法正常运行。 1.1 空闲任务初始化

(二)系统移植之uboot

我只是一个虾纸丫 提交于 2020-02-27 09:26:21
BootLoader:嵌入式系统从开始上电到系统启动需要一个引导过程,这个引导程序就叫作启动加载程序,即BootLoader。它在操作系统运行之前运行,它负责初始化硬件设备,建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。最常用的一种就是uboot。 uboot的配置编译:uboot的编译是基于GNU Makefile组织编译的,顶层的Makefile完成对开发板整体配置,然后递归调用各级子目录下的Makefile,最后把所有编译过的程序链接成u-boot映像。 具体的配置流程: 解压uboot源码:"$ tar -xvf u-boot-2013.01.tar.bz2" 修改顶层的Makefile(改为自己交叉编译工具链):ifeq (arm, $(ARCH)) CROSS_COMPILE ?= /opt/arm-linux-gcc-4.8.3/bin/arm-none-linux-gnueabi- 进入源码目录,并配置:"$make exynos4412_config" 编译:make 编译好的uboot就可以烧写到开发板中。 串口调试命令:uboot烧写好后,还需要串口调试设置相关环境变量,主要有: 设置内核启动参数:setenv bootargs root=/dev/nfs nfsroot=192.168.9.120:/source

类加载机制与反射

☆樱花仙子☆ 提交于 2020-02-27 02:43:40
1、类的加载、连接和初始化 加载类的时机 第一次使用该类 采用预加载机制加载类 Java虚拟机进程(JVM进程) 同一个JVM里的所有线程、所有变量都处于同一个进程里,都使用该JVM进程的内存区 JVM进程终止时机 程序运行到最后正常结束。 程序运行到使用System.exit()或Runtime.getRuntime().exit()代码处结束程序。 程序执行过程中遇到未捕捉的异常或错误而结束。 程序所在平台强行结束了JVM进程。 两个JVM进程间并不会共享数据 类的加载 加载、连接、初始化(当程序使用某个类时,如果该类还未加载进内存中,执行这三个步骤来对类进行初始化。)(这三个步骤通常连续完成,故统称为类加载、类初始化) 类加载:将类的class文件读入内存,并为之创建一个java.lang.Class对象。 类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是java程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。 开发者可以通过继承ClassLoader基类来创建自己的类加载器。 通过使用不同的类加载器,可以从不同来源加载类的二进制数据 从本地文件系统加载class文件 从JAR包加载class文件 通过网络加载class文件 把一个java源文件动态编译,并执行加载 类加载器通常无需等到“首次使用”该类时才加载该类

深入JVM-Class装载系统

天涯浪子 提交于 2020-02-24 23:14:43
一、Class文件的装载过程 Class类型通常以文件的形式存在(当然,任何二进制流都可以是Class类型),只有被Java虚拟机装载的Class类型才能在程序中使用。系统状态Class类型可以分为加载、连接和初始化3个步骤。其中,连接又可分为验证、准备和解析3步。 1.1 类装载的条件 Class只有在必须要使用的时候才会被装载,Java虚拟机不会无条件的装载Class类型。Java虚拟机规定,一个类或接口在初次使用前,必须要进行初始化。这里指的“使用”,是指主动使用,主动使用只有下列几种情况: 创建一个类的实例,比如使用new关键字,或者通过反射、克隆、反序列化。 使用类的静态方法时,即当使用了字节码invokestatic指令。 使用类或接口的静态字段(final常量除外),比如,使用getstatic或者putstatic指令。 使用java.lang.reflect包中的方法反射类的方法时。 当初始化子类时,要求先初始化父类。 作为启动虚拟机,含义main()方法的那个类。 除了以上的情况属于主动使用,其他的情况均属于被动使用。被动使用不会引起类的初始化。 主动引用的例子: public class Parent { static{ System.out.println("Parent init"); } } public class Child extends

linux 启动过程原理哦

南笙酒味 提交于 2020-02-24 09:03:26
bios加电自检硬件设备 grub引导加载程序 当内核被加载到内存,内核阶段就开始了。 init进程是所有进程的发起者和控制者。因为在任何基于unix的系统中,它都是第一个运行的进程。 然后执行systemd初始化系统 初始化bios》〉执行启动加载器》〉载入内核》〉启动init服务》〉初始化系统systemd》》开始 来源: https://www.cnblogs.com/huhuxixi/p/11658381.html

SpringBoot 系统初始化器 - ApplicationContextInitializer 三种实现方式

与世无争的帅哥 提交于 2020-02-24 04:26:56
SpringBoot 系统初始化器 - ApplicationContextInitializer 类名: ApplicationContextInitializer。 介绍: Spring容器刷新(reflash)之前执行的一个回调函数。 作用: 主要是向SpringBoot容器中注册属性。 使用方式: 继承接口自定义实现。 总结:系统初始化器就是SpringBoot预留的一个扩展点,通过这个扩展点我们可以在SpringBoot容器刷新前注册自定义的相关属性。 自定义系统初始化器的实现方式 实现方式01 具体的代码实现如下所示: 步骤01 继承 ApplicationContextInitializer 接口 步骤02 在项目的resources 目录下建立一个目录 META-INF 下再建立一个文件 spring.factories /** * 描述: 第一个初始化器 * 实现方式1 继承 ApplicationContextInitializer 接口 * * @author mh * @create 2020-02-23 12:13 */ @Order ( 1 ) public class FirstInitializer implements ApplicationContextInitializer < ConfigurableApplicationContext >

.net系统自学笔记——数组

倖福魔咒の 提交于 2020-02-16 03:19:33
数组 1.简单数组 2.多维数组 3.锯齿数组 4.Array类 5.作为参数的数组 6.枚举 7.元组 8.结构比较 如果需 要 使 用同 一 类型的 多 个对 象,就可以 使 用集合和数组。C#用特殊的 记号声明 、 初始 化 和使用数组。 Array类 在后台 发挥作用,它为 数组中 元素的 排 序和过滤提供了几个方法。 使 用枚举器,可 以 迭 代数组中 的 所 有元素。.net4还引 入了 一个新类型 Tuple,它 用于合并不同 类型的 多 个对象。 一、简单数组 如果需要使用同一类型的多个对象,就可以使用数组。数组是一种数据结构,它可以包含同一类型的多个元素。 1.数组的声明:在声明数组时,应先定义数组中元素的类型,其后是一对方括号和一个变量名。 2.数组的初始化:声明了数组后,就必须为数组分配内存,以保存数组的所有元素。数组是引用类型,所以必须给它分配堆上的内存。为此,应使用new运算符,指定数组中元素的类型和数量来初始化数组的变量。还可以用数组初始化器为数组的每个元素赋值。数组初始化器只能在声明数组变量时使用,不能在声明数组之后使用。如果用花括号初始化数组,则还可以不指定数组的大小,因为编译器会自动统计元素的个数。 3.访问数组元素:可以使用索引器访问数组中的元素,一对方括号中间加整数如[0]。数组只支持有整型参数的索引器。通过索引器传递元素编号,就可以访问数组

C# C/S结构数据库系统框架详解(一)[vjsdn]

别来无恙 提交于 2020-01-31 09:25:01
自发布 《多文档界面(MDI)系统框架-C#完整版》 后又有了新想法,就是再写个C#版C/S结构系统框架。 因时间关系断断续续写了很久。借周日机会,我将源代码整理好再写些说明文档发布出来,希望给大家 带来学习机会。 特别声明的是: C/S结构系统框架是优化和改编自几个大型系统,是经历过考验和实际应用的。希望大家好好珍惜。这个框架有很多学习要点,提醒大家不仅仅是下载代码而应该去好好研究,甚至阅读每一行代码每一个模块每一个细节! 你学会了它也许将来作为一个优秀架构师需要设计同样一个系统时,这时你用上它,不是事半功倍么? 另外,请尊重作者版权,写一个框架的确需要大量时间和精力。程序员有个共性是写作永无止境,虽是深夜2点,但我们仍在思考,仍在写作! 眼睛睡觉了但思维和创作动力仍在冗奋中,作为一个程序员的你,我说的对吗?有同样的感受吗? 所以: 转载时请注明本文来自易学网 www.vjsdn.net ! 言归正传,接下来讲解系统框架实现过程。 首先看几个图对框架有个初步认识。 1.登陆窗体 准备登录窗体 如通过验证用户,则加载MDI主窗体,留意图片内的动态消息: 正在初始化用户界面,请稍候. 登录窗体是多数应用程序的入口,在进入系统前需要用户验证。请看实现过程: 2.MDI主窗体 登录成功后显示MDI主窗体. 图片为测试模块II的主界面. 登录成功后显示MDI主窗体.

ARM嵌入式开发——基础概念

自作多情 提交于 2020-01-11 01:19:54
文章目录 嵌入式Linux系统组成 嵌入式Linux系统的启动流程 uboot制作 uboot特点 uboot三大功能 硬件初始化功能 引导加载内核 为内核传递启动参数 uboot源码操作 嵌入式Linux系统组成 嵌入式Linux系统软件由三部分组成: BootLoader(uboot)裸板软件,初始化硬件+从闪存加载内核到内存并且启动内核+给内核传递启动参数,告诉内核根文件系统rootfs在什么地方。(上电运行,内核启动后结束) Linux内核(kernel):Linux系统7大功能,管理进程、管理内存、文件系统、设备控制、网络管理。掉电结束。 根文件系统(rootfs): bin:各种命令。 sbin:各种超级用户的命令。 lib:标准系统库。 etc:各种服务的配置(tftpd-hpa,nfs) dev:存放设备文件 sys:存放虚拟文件系统sysfs相关内容 proc:存放虚拟文件系统procfs相关内容 usr:存放其他命令 嵌入式Linux系统的启动流程 上电CPU运行uboot uboot根据bootcmd加载启动内核并且通过bootargs给系统传递参数。 内核启动,完成7大功能。 内核最后根据uboot传递的bootargs到某个地方找到根文件系统rootfs 一旦找到根文件系统rootfs,控制权交给根文件系统。 内核会运行第一号进程/sbin/init

STM32启动过程启动文件分析

邮差的信 提交于 2020-01-09 04:15:55
一、概述 1、说明   每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道。通过了解启动文件,我们可以体会到处理器的架构、指令集、中断向量安排等内容,是非常值得玩味的。   STM32作为一款高端Cortex-M3系列单片机,有必要了解它的启动文件。打好基础,为以后优化程序,写出高质量的代码最准备。   本文以一个实际测试代码--START_TEST为例进行阐述。 2、整体过程概括   STM整个启动过程是指从上电开始,一直到运行到main函数之间的这段过程,步骤为(以使用微库为例): ①上电后硬件设置SP、PC ②设置系统时钟 ③软件设置SP ④加载.data、.bss,并初始化栈区 ⑤跳转到C文件的main函数 3、整个启动过程涉及的代码   启动过程涉及的文件不仅包含startup_stm32f10x_hd.s,还涉及到了MDK自带的连接库文件entry.o、entry2.o、entry5.o、entry7.o等(从生成的map文件可以看出来)。 二、程序在Flash上的存储结构   在真正讲解启动过程之前,先要讲解程序下载到Flash上的结构和程序运行时(执行到main函数)时的SRAM数据结构。程序在用户Flash上的结构如下图所示。下图是通过阅读hex文件和在MDK下调试综合提炼出来的。 MSP初始值        编译器生成