Nucleus PLUS的启动、执行线程和中断处理
nucleus系统是实时嵌入式操作系统,具有实时、任务抢先、多任务内核,当中95%的代码由C语言写成,极易移植。开放的源代码使得配置和裁剪方便,再加上体积小(所有二进制映像可仅20K)、响应高速等特性,使得Nucleus PLUS得到广泛应用。另外,所谓的实时指的是对外部或者内部的事件在正确的时间内必须得到正确的响应,而不只指的是“马上可以响应”。
(一)Nucleus PLUS启动流程
INT.[S, ASM或SRC]是与详细的处理器架构相关程序,提供最低层次的初始化和訪问处理器中断向量表的服务。如ARM架构中将INT_Initialize置于INT_Reset中断向量中引导系统启动。
INT_Initialize 子程序在Nucleus PLUS 系统中是最先执行的,负责全部与目标硬件板相关的初始化。即使具有同样的处理器的硬件板之间的INT_Initialize 子程序依旧是不一样的,由于不同的硬件板具有不同的外围总线和时钟中断等。INT_Initialize 完毕后将控制权转移到高级Nucleus PLUS 初始化子程序INC_Initialize上并不再返回。INC_Initialize调用全部的Nucleus plus组件初始化函数、调用Application_Initialize创建用户任务等对象,最后将控制权交给调度函数TCT_schedule,系统启动完毕。
嵌入式实时操作系统内核Nucleus PLUS的启动过程如图1所看到的。当中
1,板级初始化INT_INITIALIZE()
在设置中,当系统reset后跳至运行地址0x0000 0000处開始运行,因此将函数INT_INITIALIZE()入口置于该地址(INT_Reset_Addr DCD INT_Initialize)引导系统的运行。该函数一般在INT.S或者是INT_PID.S中。
INT_Initialize须要依据详细的硬件环境做出改动,其主要运行功能:
1)将编译出来的已经初始化的数据从ROM中拷贝到RAM中,同一时候在RAM中建立ZI数据段,未初始化的数据;
2)初始化异常中断向量表。
3)设置处理器各执行模式的数据堆栈。计算出可用的存储器的首地址(first_available_memory);
4)时钟中断和一些硬件中断的设置;
5)将控制权转移到INC_INITIALIZE;
2,操作系统初始化(INC_Initialize(first_available_memory))
主要是完毕邮箱、队列、管道、信号量、事件集等Nucleus PLUS软件组件的初始化;
3,应用程序初始化(Application_Initialize (first_available_memory))
主要是完毕用户定义的应用程序初始化,如创建内存池,创建任务、创建信号量、创建中断、编写用户应用程序等。
用户任务可事先定义好存于一个表中,Application_Initialize 依据该表创建全部的任务。
4。任务调度TCT_schedule
会依照任务优先级顺序调度全部的任务去完毕各个任务主要的初始化,然后进入就绪或挂起状态。最后TCT_schedule会将控制权交给优先级最高的任务,系统任务開始执行。
图1 Nucleus PLUS 初始化流程
(二)Nucleus PLUS执行线程
一个Nucleus PLUS 系统组件或者应用程序总是八个可能执行线程中的一个。他们是:
1) 初始化(Initialization)线程
初始化线程是系统执行的第一个线程。
初始化线程的起始是为INT_Initialize,在Application_Initialize 函数返回后中止。控制权转移至调度循环(Scheduling Loop)线程。
2) 系统错误(Ssytem Error)线程
这个线程在函数ERC_System 被调用时执行。系统启动、执行过程中有可能发生系统错误,它们中大多数在初始化期间被跟踪,堆栈溢出则在任务和HISR 执行过程中产生。默认情况。系统错误是致命的,因此该线程会暂停系统执行,具体的系统错误代码见Nucleus PLUS Reference。
3) 调度循环(Scheduling Loop)线程
调度循环线程的入口是TCT_Schedule。这个线程将CPU控制权转移给最高优先级的HISR 或
就绪状态的任务。
当没有任务或HISRs 就绪时,就是TCT_Schedule 无限的循环。project中为了省电,通常会创建一个优先级最低的Idle任务。当没有其它不论什么任务或者HISR要运行时。idle任务就会被调度使得系统进入睡眠状态。
4) 任务(Task)线程
每一个任务有它自己的堆栈核控制结构。其入口在任务创建时指定。任务线程对訪问Nucleus PLUS 服务没有不论什么限制。
5) 信号处理(Signal Handler)线程
信号处理线程执行在相关任务线程的顶端。
信号处理器线程对Nucleus PLUS 服务訪问有限制,主要限制就是信号处理线程不同意自挂起。
6) 用户中断处理子程序(User ISR)线程
此线程负责保存和恢复全部使用的寄存器。用户中断服务子程序线程是典型的少量汇编语言子程序,入口可直接挂在中断向量上。对此类型线程,Nucleus PLUS 服务全然不受限。
7) LISR线程
低级中断服务子程序同意Nucleus PLUS 在中断处理中保存和恢复全部有须要的寄存器。
LISR 线程最重要的任务就是active_HISR 服务。其对Nulceus PLUS 服务訪问受限。比如,假设某中断的处理须要切换任务就仅仅能去激活HISR并在HISR中实现。下列服务从 LISRs 訪问有效:
NU_Activate_HISR
NU_Local_Control_Interrupts
NU_Current_HISR_Pointer
NU_Current_Task_Pointer
NU_License_Information
NU_Retrieve_Clock
8) HISR线程
高级中断服务子程序是Nucleus PLUS 中断处理的第二部分。HISR 线程像任务线程一样被调度,能够訪问大多数Nucleus PLUS 服务,不同意自挂起请求。
HISR 线程程序入口点在HISR 创建期间确定。
(三)Nucleus中断处理
Nucleus PLUS 既支持可控(managed)也支持不可控(unmanaged)ISRs。
可控的ISR 就是用户不须要存储和释放上下文信息,不可控ISRs 指的是用户要对保存和恢复全部使用寄存器负全责。可控ISRs 能够用C 或汇编编写,不可控ISRs 一般都用汇编。
对中断可以高速响应是RTOS系统的基础,Nucleus PLUS通过将ISR分成低级和高级两个部分来保证系统对中断的高速响应的同一时候保护系统服务的数据结构不受破坏。所以Nucleus PLUS的中断处理类似于Linux的两个半部中断处理机制。
低级中断处理执行在LISR线程,可由C语言编写或者被其它C函数调用。Nucleus PLUS调用/退出LISR之前会保存/恢复上下文。LISR支持中断嵌套。任务就是高速响应中断,然后激活HISR服务。
HISR完毕中断的大部分处理任务。必须预先创建,其优先级分为3级,支持抢占。每一个HISR都有独立的堆栈和控制块。
Nucleus PLUS的启动、执行线程和中断处理的更多相关文章
- C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。
添加三个线程同时启动执行某一方法,并依次调用某方法中的打印输:ABC ABC ABC ABC 实现代码如下: using System; using System.Collections.Generi ...
- 启动一个线程是用run()还是start()?
启动一个线程是用run()还是start()? 答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着线程就会立即运行.run ...
- c#笔记之启动新线程
可已通过下面方法来启动一个新线程并执行相应的方法 new Thread(new ThreadStart(new Action(() => { ...
- JVM进程启动会启动哪些线程?
首先要明白一点:JVM本身是一个多线程的程序,和我们编写的java应用程序一样,当JVM启动执行时就是在操作系统中启动了一个JVM进程.我们编写的java单线程或多线程应用进程都是在JVM这个程序中作 ...
- gunicorn结合django启动后台线程
preload 为True的情况下,会将辅助线程或者进程开在master里,加重master的负担(master最好只是用来负责监听worker进程) django应用的gunicorn示例:只在主线 ...
- Gunicorn+Flask中重复启动后台线程问题
假设程序如下: if __name__ == '__main__': t = Thread(target=test) t.start() app.run(host='0.0.0.0',port=808 ...
- 第8章2节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-解析处理命令行參数
MonkeyRunnerStarter是MonkeyRunner启动时的入口类,由于它里面包括了main方法.它的整个启动过程主要做了以下几件事情: 解析用户启动MonkeyRunner时从命令行传输 ...
- 第8章7节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-小结
最后我们对MonkeyRunner启动的过程做一个总结,当然,当中也包括启动Monkey,尽管它不属于启动过程的一部分: monkeyrunner这个shell脚本会先设置一些执行环境的系统属性保存到 ...
- spring启动异步线程
大纲: spring启动异步线程 spring配置线程池 一.spring启动异步线程 spring启动异步线程方法就是在方法上加上注解@Async,然后启动类或配置类上加上注解@EnableAsyn ...
随机推荐
- Java之JVM调优案例分析与实战(2) - 集群间同步导致的内存溢出
环境:一个基于B/S的MIS系统,硬件为两台2个CPU.8GB内存的HP小型机,服务器是WebLogic 9.2,每台机器启动了3个WebLogic实例,构成一个6个节点的亲合式集群. 说明:由于是亲 ...
- Android 常用的性能分析工具详解:GPU呈现模式, TraceView, Systrace, HirearchyViewer(转)
此篇将重点介绍几种常用的Android性能分析工具: 一.Logcat 日志 选取Tag=ActivityManager,可以粗略地知道界面Displaying的时间消耗.当我们打开一个Activit ...
- windows 磁盘加密
windows 磁盘加密 CreateTime--2018年4月25日18:37:45 Author:Marydon 以win10为例 选中磁盘-->你会发现上面的管理BitLocker是置 ...
- Android开发之语音识别
2013-07-03 语音识别 2008年Google语音搜索在iphone平台上线,Android 1.5 将语音识别应用到搜索功能上. 手动输入是目前主要与手机互动的方式,语音搜索宗旨是最大限度地 ...
- Web应用程序项目OxiteSite已配置为使用IIS.在本地计算机上找不到服务器
今天还是没事干(我的博客还想都是以这句话开始的),看看小组里边的文章Oxite初探.下载Oxite的41500版本,打开后遇到这样的问题.如下图所示 解决方法: 1.邮件点击OxiteSite项目,选 ...
- VS2010/MFC编程入门之四十四:定时器Timer
前面一节鸡啄米讲了CTime类和CTimeSpan类的使用,本节继续讲与时间有关的定时器.定时器并不是一个类,主要考虑到,提起时间的话就不能不说定时器,所以就把它放到CTime和CTimeSpan之后 ...
- mysqldump全量备份+mysqlbinlog二进制日志增量备份
日常的数据备份及恢复测试,是DBA工作重中之重的事情,所以要做好备份及测试,日常的备份常见有mysqldump+binlog备份.xtrabackup+binlog备份,无论那一种,几乎都少不了对bi ...
- 关于 AngularJS 的数据绑定
单向绑定(ng-bind) 和 双向绑定(ng-model) 的区别 ng-bind 单向数据绑定($scope -> view),用于数据显示,简写形式是 {{}}. 1 <span n ...
- 飘逸的python - ord和chr以及unichr
ord是unicode ordinal的缩写,即编号 chr是character的缩写,即字符 ord和chr是互相相应转换的. 可是因为chr局限于ascii,长度仅仅有256. 于是又多了个uni ...
- Atitit. Java script 多重多重catch语句的实现and Javascript js 异常机制
Atitit. Java script 多重多重catch语句的实现and Javascript js 异常机制 1. 语法错误(ERROR)和运行期错误(Exception) 1 2. 错误类型判断 ...