CN116795481A - 嵌入式实时操作系统仿真方法、装置和存储介质 - Google Patents

嵌入式实时操作系统仿真方法、装置和存储介质 Download PDF

Info

Publication number
CN116795481A
CN116795481A CN202210272363.5A CN202210272363A CN116795481A CN 116795481 A CN116795481 A CN 116795481A CN 202210272363 A CN202210272363 A CN 202210272363A CN 116795481 A CN116795481 A CN 116795481A
Authority
CN
China
Prior art keywords
operating system
rtos
thread
task
linux operating
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202210272363.5A
Other languages
English (en)
Inventor
徐开军
赵登
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
China Mobile Communications Group Co Ltd
China Mobile IoT Co Ltd
Original Assignee
China Mobile Communications Group Co Ltd
China Mobile IoT Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by China Mobile Communications Group Co Ltd, China Mobile IoT Co Ltd filed Critical China Mobile Communications Group Co Ltd
Priority to CN202210272363.5A priority Critical patent/CN116795481A/zh
Publication of CN116795481A publication Critical patent/CN116795481A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45537Provision of facilities of other operating environments, e.g. WINE

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本公开涉及一种嵌入式实时操作系统仿真方法、装置和存储介质,方法应用于计算机设备,计算机设备安装有Linux操作系统,方法包括:在Linux操作系统下,创建结构体,其中,结构体包括:Linux操作系统的至少一个线程的信号量以及嵌入式实时操作系统RTOS的任务执行函数体以及任务退出函数体;利用所述信号量对应的至少一个线程,基于所述任务执行函数体执行所述RTOS的任务;利用所述信号量对应的至少一个线程,基于所述任务退出函数体退出所述RTOS的任务的执行。本公开实施例能够实现在Linux操作系统下仿真嵌入式实时操作系统RTOS。

Description

嵌入式实时操作系统仿真方法、装置和存储介质
技术领域
本公开涉及计算机技术领域,尤其涉及一种嵌入式实时操作系统仿真方法、装置和存储介质。
背景技术
嵌入式系统在开发过程一般都采用“宿主机/目标板”开发模式,即利用宿主机(PC机)上丰富的软硬件资源及良好的开发环境和调试工具来开发目标板上的软件,然后通过交叉编译环境生成目标代码和可执行文件,通过调试工具/串口/USB/以太网等方式下载到目标板上,利用交叉调试器在监控程序运行、实时分析,最后将程序下载固化到目标机上,完成整个开发过程。
在嵌入式系统的应用开发中,采用嵌入式实时操作系统(Embedded Real-timeOperation System,简称为RTOS)能够支持多任务,使得程序开发更加容易且便于维护,同时能够提高系统的稳定性和可靠性。为了保证软件和硬件开发能够同步开发,可以利用仿真嵌入式实时操作系统,屏蔽掉硬件的掣肘。
发明内容
本公开实施例提供一种嵌入式实时操作系统仿真方法、装置和存储介质。
根据本公开实施例的第一方面,提供一种嵌入式实时操作系统仿真方法,应用于计算机设备,所述计算机设备安装有Linux操作系统,所述方法包括:
在所述Linux操作系统下,创建结构体,其中,所述结构体包括:所述Linux操作系统的至少一个线程的信号量、嵌入式实时操作系统RTOS的任务执行函数体以及任务退出函数体;
利用所述信号量对应的至少一个线程,基于所述任务执行函数体执行所述RTOS的任务;
利用所述信号量对应的至少一个线程,基于所述任务退出函数体退出所述RTOS的任务的执行。
上述技术方案中,所述方法还包括:
获取所述RTOS的适配程序,其中,所述适配程序为:基于所述RTOS的源码中的与处理器架构相关的代码程序修改得到的程序;
所述在所述Linux操作系统下,创建结构体,包括:
在所述Linux操作系统下,基于所述适配程序创建所述结构体。
上述技术方案中,所述RTOS的不同任务对应的所述Linux操作系统的线程不同。
上述技术方案中,所述方法还包括:
创建所述Linux操作系统的线程的函数执行体,其中,所述线程的函数执行体,用于执行所述线程的阻塞和唤醒、以及执行所述任务执行函数体与所述任务退出函数体。
上述技术方案中,所述方法还包括:
在所述Linux操作系统的链接脚本未被修改的情况下,通过所述Linux操作系统的主函数调用所述RTOS的启动代码;
或者,在所述Linux操作系统的链接脚本被修改的情况下,通过所述Linux操作系统的预设编译工具指定的入口函数调用RTOS的启动代码。
上述技术方案中,所述RTOS的内核源码中包括:心跳增加函数,所述方法还包括:
基于所述Linux操作系统产生的报警信号,周期地调用所述RTOS的心跳增加函数。
上述技术方案中,所述基于所述Linux操作系统产生的报警信号,周期地调用所述RTOS的心跳增加函数,包括:
在所述Linux操作系统下,创建定时器;
当所述定时器的定时时间到达时,产生所述报警信号;
为所述报警信号注册处理函数,其中,所述处理函数,用于执行所述RTOS的心跳增加函数。
上述技术方案中,所述方法还包括:
将当前执行的所述RTOS的任务转换为对应的所述Linux操作系统中的第一线程;
将需要切换到执行的所述RTOS的任务转换为对应的所述Linux操作系统中的第二线程;
当所述第一线程与所述第二线程相同时,维持所述第一线程的唤醒状态;
当所述第一线程与所述第二线程不同时,阻塞所述第一线程,并唤醒所述第二线程。
上述技术方案中,所述方法还包括:
将通过所述Linux操作系统申请到的内存区域分配为所述RTOS的内存堆;其中,所述内存堆,用于存储所述RTOS运行中产生的信息。
上述技术方案中,所述方法还包括:
调用所述Linux操作系统的时钟中断函数执行关中断或开中断,其中,所述关中断,用于屏蔽所述报警信号;所述开中断,用于不屏蔽所述报警信号。
上述技术方案中,所述方法还包括:
在执行完所述关中断时,将所述RTOS的首个任务转换为对应的所述Linux操作系统中的线程;
唤醒所述线程,以启动所述RTOS的首个任务。
根据本公开实施例的第二方面,提供一种嵌入式实时操作系统仿真装置,应用于计算机设备,所述计算机设备安装有Linux操作系统,所述装置包括:
创建模块,用于在所述Linux操作系统下,创建结构体,其中,所述结构体包括:所述Linux操作系统的至少一个线程的信号量、嵌入式实时操作系统RTOS的任务执行函数体以及任务退出函数体;
处理模块,用于利用所述信号量对应的至少一个线程,基于所述任务执行函数体执行所述RTOS的任务;利用所述信号量对应的至少一个线程,基于所述任务退出函数体退出所述RTOS的任务的执行。
上述技术方案中,所述装置还包括:
获取模块,用于获取所述RTOS的适配程序,其中,所述适配程序为:基于所述RTOS的源码中的与处理器架构相关的代码程序修改得到的程序;
所述创建模块具体用于:
在所述Linux操作系统下,基于所述适配程序创建所述结构体。
上述技术方案中,所述RTOS的不同任务对应的所述Linux操作系统的线程不同。
上述技术方案中,所述创建模块还用于:
创建所述Linux操作系统的线程的函数执行体,其中,所述线程的函数执行体,用于执行所述线程的阻塞和唤醒、以及执行所述任务执行函数体与所述任务退出函数体。
上述技术方案中,所述装置还包括第一调用模块,所述第一调用模块用于:
在所述Linux操作系统的链接脚本未被修改的情况下,通过所述Linux操作系统的主函数调用所述RTOS的启动代码;
或者,在所述Linux操作系统的链接脚本被修改的情况下,通过所述Linux操作系统的预设编译工具指定的入口函数调用RTOS的启动代码。
上述技术方案中,所述RTOS的内核源码中包括:心跳增加函数,所述装置还包括:
第二调用模块,用于基于所述Linux操作系统产生的报警信号,周期地调用所述RTOS的心跳增加函数。
上述技术方案中,所述第二调用模块具体用于:
在所述Linux操作系统下,创建定时器;
当所述定时器的定时时间到达时,产生所述报警信号;
为所述报警信号注册处理函数,其中,所述处理函数,用于执行所述RTOS的心跳增加函数。
上述技术方案中,所述处理模块还用于:
将当前执行的所述RTOS的任务转换为对应的所述Linux操作系统中的第一线程;
将需要切换到执行的所述RTOS的任务转换为对应的所述Linux操作系统中的第二线程;
当所述第一线程与所述第二线程相同时,维持所述第一线程的唤醒状态;
当所述第一线程与所述第二线程不同时,阻塞所述第一线程,并唤醒所述第二线程。
上述技术方案中,所述装置还包括内存分配模块,所述内存分配模块用于:
将通过所述Linux操作系统申请到的内存区域分配为所述RTOS的内存堆;其中,所述内存堆,用于存储所述RTOS运行中产生的信息。
上述技术方案中,所述装置还包括第三调用模块,所述第三调用模块用于:
调用所述Linux操作系统的时钟中断函数执行关中断或开中断,其中,所述关中断,用于屏蔽所述报警信号;所述开中断,用于不屏蔽所述报警信号。
上述技术方案中,所述处理模块还用于:
在执行完所述关中断时,将所述RTOS的首个任务转换为对应的所述Linux操作系统中的线程;
唤醒所述线程,以启动所述RTOS的首个任务。
根据本公开实施例的第三方面,提供一种计算机设备,所述计算机设备安装有Linux操作系统,所述计算机设备包括:存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现第一方面任一所述的嵌入式实时操作系统仿真方法的步骤。
根据本公开实施例的第四方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现第一方面任一所述嵌入式实时操作系统仿真方法的步骤。
本公开实施例提供一种嵌入式实时操作系统仿真方法、装置和存储介质,所述方法应用于计算机设备,所述计算机设备安装有Linux操作系统,通过在Linux操作系统下,创建结构体,结构体中包括Linux操作系统的至少一个线程的信号量、嵌入式实时操作系统RTOS的任务执行函数体以及任务退出函数体,并基于任务执行函数体以及任务退出函数体,对RTOS的任务进行处理。如此,通过在Linux操作系统下创建的结构体,使得Linux操作系统的至少一个线程执行RTOS的任务的任务执行函数体或者任务退出函数体,这样Linux操作系统的线程能够处理RTOS的任务,从而能够实现在Linux操作系统下仿真RTOS,进而使得基于RTOS的应用开发不再依赖于硬件开发板,降低了基于RTOS的应用开发成本,并且可以缩短开发周期,提升开发效率。
另外,面对各种RTOS的仿真时,只需要利用在Linux操作系统下创建的结构体实现仿真RTOS,由此能够提高各种RTOS仿真的通用性;并且,无需修改Linux内核代码,极大地降低了开发难度。
附图说明
图1为本公开实施例提供的嵌入式实时操作系统仿真方法的一个流程图;
图2为本公开实施例提供的嵌入式实时操作系统仿真方法的另一流程图;
图3为本公开实施例提供的嵌入式实时操作系统仿真方法的又一流程图;
图4为本公开实施例提供的嵌入式实时操作系统仿真方法的再一流程图;
图5为本公开实施例提供的嵌入式实时操作系统仿真方法的再一流程图;
图6为本公开实施例提供的RTOS的任务栈空间分配的示意图;
图7为本公开实施例提供的嵌入式实时操作系统仿真装置的结构图;
图8为本公开实施例提供的计算机设备的结构示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开实施例的一些方面相一致的装置和方法的例子。
在本公开实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本公开实施例。在本公开实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本公开实施例可能采用术语“第一”、“第二”等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本公开实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
在嵌入式实时操作系统(简称:RTOS)环境下开发实时应用程序,使程序的设计和扩展变得容易,不需要大的改动就可以增加新的功能。通过将应用程序分割成若干独立的任务模块,使应用程序的设计过程大为简化;而且对实时性要求苛刻的事件都得到了快速、可靠的处理。通过有效的系统服务,RTOS使得系统资源得到更好的利用。因此,为了保证软件和硬件开发能够同步开发,可以在Linux操作系统下仿真RTOS,屏蔽掉硬件的掣肘。
例如,在Linux上实现RTOS的所有系统调用,但该方案需要重新实现RTOS的所有系统调用,开发工作量大,且面对各种RTOS的仿真时,需要熟悉嵌入式实时操作的内部机制,学习成本高。又例如,以Linux内核模块的代码形式,将嵌入式操作系统任务的函数接口转换到Linux内核提供的函数接口,但以Linux内核模块的代码形式,本身需要修改Linux内核代码,通用性不强,并且只对任务进行移植,其他操作系统内核结构并不涉及,如果要后续开发会带来额外大量的工作。
本公开实施例提供一种嵌入式实时操作系统仿真方法,该方法应用于计算机设备,计算机设备安装有Linux操作系统,参阅图1所示,该仿真方法可以包括以下步骤:
101,在Linux操作系统下,创建结构体,其中,结构体包括:Linux操作系统的至少一个线程的信号量以及嵌入式实时操作系统RTOS的任务执行函数体以及任务退出函数体。
本公开实施例中,计算机设备可以是:个人计算机(Personal Computer,PC),诸如台式机、一体机、笔记本电脑、平板电脑等,此处不作具体限定。
上述,结构体是一种数据结构,结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素可以称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。
这里,结构体可包括但不限于:Linux操作系统的至少一个线程的信号量、RTOS任务执行函数体、以及RTOS任务退出函数体。此外,结构体还可以包括:RTOS任务执行函数体参数、Linux的线程句柄等。其中,Linux的线程句柄是指向线程的指针。
上述,信号量的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。这里,线程的信号量能够用于阻塞和唤醒Linux线程。
嵌入式实时操作系统RTOS的一个任务是由一个或多个的操作组成,不同的任务对应的任务执行函数体、任务退出函数体均不同。
其中,RTOS可包括但不限于:FreeRTOS、embOS或者μC/OS-II等系统。
102,利用所述信号量对应的至少一个线程,基于所述任务执行函数体执行所述RTOS的任务。
具体地,可以在创建的结构体中确定需要执行RTOS的任务所对应的任务执行函数体,并利用所述信号量对应的至少一个线程,基于确定的任务退出函数体执行该任务。
103,利用所述信号量对应的至少一个线程,基于所述任务退出函数体退出所述RTOS的任务的执行。
具体地,可以在创建的结构体中确定需要退出执行RTOS的任务所对应的任务退出函数体,并利用所述信号量对应的至少一个线程。基于确定的任务退出函数体退出该任务的执行。
本公开实施例提供的嵌入式实时操作系统仿真方法中,通过在Linux操作系统下,创建结构体,结构体中包括Linux操作系统的至少一个线程的信号量、嵌入式实时操作系统RTOS的任务执行函数体以及任务退出函数体,并基于任务执行函数体以及任务退出函数体,对RTOS的任务进行处理。如此,通过在Linux操作系统下创建的结构体,使得Linux操作系统的至少一个线程执行RTOS的任务的任务执行函数体或者任务退出函数体,这样Linux操作系统的线程能够处理RTOS的任务,从而能够实现在Linux操作系统下仿真RTOS,进而使得基于RTOS的应用开发不再依赖于硬件开发板,降低了基于RTOS的应用开发成本,并且可以缩短开发周期,提升开发效率。
另外,面对各种RTOS的仿真时,只需要利用在Linux操作系统下创建的结构体实现仿真RTOS,由此能够提高各种RTOS仿真的通用性;并且,无需修改Linux内核代码,极大地降低了开发难度。
在一个实施例中,如图2所示,基于图1,方法还可以包括:
100,获取RTOS的适配程序,其中,适配程序为:基于RTOS的源码中的与处理器架构相关的代码程序修改得到的程序。
其中,RTOS源码可以包括:RTOS内核源码以及与处理器架构相关的代码程序。这里,RTOS内核源码可以包括:RTOS启动代码、功能源码。功能源码例如核心功能源码;其中,核心功能源码文件包括但不限于:list.c、queue.c以及tasks.c文件。其中,list.c用于链表管理,queue.c用于队列管理,支持中断环境和信号量控制;task.c用于任务管理,并支持完全的抢占式调度。
其中,与处理器架构相关的代码程序可以是指能够使RTOS运行在处理器上的代码。这里,可以基于Linux操作系统的系统调用接口,对与处理器架构相关的代码程序中的硬件接口代码进行修改,得到使RTOS移植到Linux操作系统的适配程序。
本实施例中,可以通过使用Linux操作系统的应用层开发接口,只修改RTOS的源码中的与处理器架构相关的代码程序,得到使RTOS移植到Linux操作系统的适配程序,由于不涉及到Linux内核开发,因此开发难度较低。
上述步骤101中,在Linux操作系统下,创建结构体,可以包括:
在Linux操作系统下,基于适配程序创建结构体。
具体地,可以通过适配程序调用Linux操作系统的API(Application ProgrammingInterface,应用程序接口)函数创建结构体。
本公开实施例中,通过获取RTOS的适配程序,由于该适配程序为基于RTOS的源码中的与处理器架构相关的代码程序修改得到的程序,这样可以在Linux操作系统下,基于适配程序创建结构体,由此通过利用移植体系架构的原理实现在Linux操作系统下仿真RTOS,只需修改处理器架构相关的代码程序,代码修改量少,有效降低了在Linux操作系统下仿真RTOSC的开发难度。
在一个实施例中,RTOS的不同任务对应的Linux操作系统的线程不同。
具体地,可以从创建的结构体中获取RTOS的任务所对应的Linux线程句柄,根据获取到的Linux线程句柄,确定该任务对应的Linux线程。这里,Linux线程句柄能够用于确定线程ID。
在一个实施例中,方法还可以包括:
创建Linux操作系统的线程的函数执行体,其中,线程的函数执行体,用于执行线程的阻塞和唤醒、以及执行任务执行函数体与任务退出函数体。
本实施例中,可以基于所述RTOS的适配程序,创建Linux操作系统的线程的函数执行体(task_wait_for_start)。函数执行体用于:阻塞Linux线程自身(这样在执行启动第一个任务前所有Linux线程处于阻塞状态)、等待唤醒、唤醒后执行打开中断、执行结构体os_thread_t中的任务执行函数,并在任务执行函数执行完后,执行任务退出函数。
在一个实施例中,方法还可以包括:
在Linux操作系统的链接脚本未被修改的情况下,通过Linux操作系统的主函数调用RTOS的启动代码;或者,在Linux操作系统的链接脚本被修改的情况下,通过Linux操作系统的预设编译工具指定的入口函数调用RTOS的启动代码。
其中,RTOS的启动代码包含在RTOS的内核源码中。
其中,Linux操作系统的链接脚本(linker script,一般以lds作为文件的后缀名)主要用于设定如何把输入文件内的扇区(section)放入输出文件内,并控制输出文件内各部分在程序地址空间内的布局。
本实施例中,在Linux操作系统的链接脚本未被修改的情况下,可以通过Linux操作系统的main函数作为入口函数调用RTOS的启动代码;在Linux操作系统的链接脚本被修改的情况下,可以通过Linux操作系统的GUN编译工具指定的入口函数调用RTOS的启动代码,实现在Linux操作系统下启动RTOS。
在一个实施例中,RTOS的内核源码中包括:心跳增加函数。
该方法还包括:
基于Linux操作系统产生的报警信号,周期地调用RTOS的心跳增加函数。
这里,报警信号可以是Linux操作系统在定时器终止时发送给进程的闹钟信号(SIGALRM)。
本实施例中,通过基于Linux操作系统产生的报警信号,周期地调用RTOS的心跳增加函数,这样能够保证RTOS的心跳正常,从而使RTOS可以正常工作,例如处理任务延时工作。
在一个实施例中,如图3所示,所述基于Linux操作系统产生的报警信号,周期地调用RTOS的心跳增加函数,可以包括:
301,在Linux操作系统下,创建定时器;
302,当定时器的定时时间到达时,产生报警信号;
303,为报警信号注册处理函数,其中,处理函数,用于执行RTOS的心跳增加函数。
本实施例中,在Linux操作系统下,可以创建一个定时器(例如,定时器ITIMER_REAL),该定时器采用“间隔”值(interval)来作为计时方式。当定时器启动后,随着定时器的定时,间隔值(interval)将不断减小。当间隔值减到0时,定时器的定时时间到期或者超期,会产生一个报警(ALRAM)信号。可以为该报警(ALRAM)信号注册一个处理函数,调用该处理函数执行RTOS的心跳增加函数。其中,上述步骤的整个过程可以由建立定时器中断(setup_timer_interrupt)函数实现。
在一个实施例中,如图4所示,方法还可以包括:
401,将当前执行的RTOS的任务转换为对应的Linux操作系统中的第一线程。
402,将需要切换到执行的RTOS的任务转换为对应的Linux操作系统中的第二线程。
具体地,需要切换到执行的RTOS的任务与当前执行的RTOS的任务可以不同,例如,需要切换到执行的RTOS的任务的优先级高于当前执行的RTOS的任务的优先级。另外,需要切换到执行的RTOS的任务与当前执行的RTOS的任务可以相同,例如,在多个任务中当前执行的RTOS的任务的优先级最高。
403,当第一线程与第二线程相同时,维持第一线程的唤醒状态。
具体地,可以对第一线程的线程ID与第二线程的线程ID进行比较,确定第一线程和第二线程是否相同。这里,线程ID用于唯一标识一个线程。
404,当第一线程与第二线程不同时,阻塞第一线程,并唤醒第二线程。
具体地,阻塞Linux的线程可以通过Linux线程等待一个信号量实现;唤醒Linux的线程可以通过释放Linux线程等待一个信号量实现。
本实施例中,通过阻塞当前执行的RTOS的任务所对应的Linux线程并唤醒需要切换到执行的RTOS的任务所对应的Linux线程,实现了嵌入式操作系统RTOS的任务切换。
可以理解的是,在RTOS的任务切换时,需要将切换前的任务阻塞,将需要运行的任务唤醒,这样RTOS中总是只有一个任务在运行,因此这种仿真的嵌入式实时操作系统RTOS实质是一个单核系统。
在一个实施例中,方法还可以包括:
将通过Linux操作系统申请到的内存区域分配为RTOS的内存堆;其中,内存堆,用于存储RTOS运行中产生的信息。
这里,RTOS运行中产生的信息可包括:与任务相关的信息,例如,任务优先级、队列等。
本实施例中,通过向Linux操作系统申请内存区域,并分配为RTOS的内存堆以用于存储RTOS运行中产生的信息,从而能够满足RTOS的内存需求。
在一个实施例中,方法还可以包括:
调用Linux操作系统的时钟中断函数执行关中断或开中断,其中,关中断,用于屏蔽报警信号;开中断,用于不屏蔽报警信号。
这里,屏蔽报警信号是为了使某些代码段不被中断打断,例如,访问临界资源(critical resource)的代码段,需要关中断以保证这些代码段必须完整地运行而不能被中断打断。其中,临界资源是指一次仅允许一个进程使用的共享资源;每个进程中访问临界资源的代码段被称为临界区(critical section),每次仅一个进程被允许进入临界区。
本实施例中,通过调用时钟中断函数执行关中断或开中断,能够实现并发情况下的临界资源的保护。
在一个实施例中,如图5所示,方法还可以包括:
501,在执行完关中断时,将RTOS的首个任务转换为对应的Linux操作系统中的线程;
502,唤醒执行RTOS的首个任务的线程,并启动RTOS的首个任务。
本实施例中,执行关中断是为了防止第一个任务启动前的滴答(tick)中断产生。RTOS在启动第一个任务前皆创建了多个任务,并指定了需要启动的第一个启动的任务(例如,可以根据任务优先级顺序指定第一个启动的任务),通过将第一个启动的任务转换为对应的Linux线程,唤醒Linux线程,这样就能保证RTOS运行着一个任务。其中,上述的滴答(tick)是系统的相对时间单位(也可称为系统的时基),可以是定时器的周期性中断(输出脉冲)。
下面,将结合相关具体示例说明本公开实施例提供的嵌入式实时操作系统仿真方法。
本公开实施例提供一种嵌入式实时操作系统仿真方法,可以包括如下步骤:
(1)在Linux操作系统下调用RTOS启动代码;
具体地,通过Linux操作系统的main函数直接调用RTOS启动代码;或者,修改Linux下的链接脚本,调用gun编译器标准的入口函数entry,由entry调用RTOS启动代码。
(2)在Linux操作系统下初始化RTOS内存堆;
具体地,使用Linux申请一片内存区域并指定给RTOS内存堆,实现初始化嵌入式实时操作系统内存堆。
(3)在Linux操作系统下初始化RTOS中的任务栈;
在Linux下进行仿真RTOS的核心思想是使用Linux的一个进程仿真一个RTOS,RTOS的任务对应Linux下的一个线程。
具体地,该步骤的实现过程可以包括:
a)创建结构体,该结构体包括:Linux的线程句柄、用于阻塞和唤醒Linux线程的信号量、RTOS任务执行函数体、RTOS任务执行函数体参数以及RTOS任务退出函数体;
b)将创建成功的结构体放在任务栈的起始位置;
由于Linux使用的栈是减栈,总是从任务栈的高地址开始使用,因此可以把创建成功的结构体(os_thread_t)实体放在栈的起始位置。这样在操作嵌入式实时操作的任务时,直接可以在任务栈的起始地址找到对应的Linux线程进行控制,具体的栈空间分配可以参见图6所示。
c)创建Linux的线程对应函数执行体(task_wait_for_start);
其中,该函数执行体用于:阻塞Linux线程自身(这样在执行启动第一个任务前所有Linux线程处于阻塞状态)、等待唤醒、唤醒后执行打开中断、执行结构体中的任务执行函数,并在任务执行函数执行完后,执行任务退出函数。
d)初始化RTOS的任务栈;
具体地,该步骤的实现过程可以包括:
结构体记录RTOS任务执行函数体、RTOS任务执行函数体参数以及RTOS任务退出函数体;
初始化Linux线程属性(thread_attributes);
初始化Linux线程属性的栈起始地址和栈大小为RTOS的任务的栈起始地址和栈大小;
创建用于阻塞和唤醒Linux线程的信号量及Linux线程。其中,Linux线程的参数包括但不限于:线程属性地址、函数执行体(task_wait_for_start)以及结构体实体指针。
(4)周期调用RTOS心跳增加函数;
具体地,创建定时器(例如,定时器ITIMER_REAL),当定时器定时到达时,产生闹钟信号(SIGALRAM),为该闹钟信号(SIGALRAM)注册处理函数,其中,处理函数用于执行RTOS的心跳增加函数。其中,该步骤的整个过程可以可以由建立定时器中断(setup_timer_interrupt)函数实现。
(5)在Linux操作系统下实现关中断和开中断;
移植系统时存在的并发情况就是产生SIGALRAM信号后,系统立刻执行RTOS的心跳增加函数。这里,关中断的行为用于屏蔽SIGALRAM信号,开中断的行为用于不屏蔽SIGALRAM信号。
(6)在Linux操作系统下实现RTOS启动第一个任务;
具体地,关闭中断,调用初始化setup_timer_interrupt,将RTOS的第一个启动的任务转换为对应的Linux线程,唤醒Linux线程。
上述的关闭中断是为防止第一个任务启动前的滴答(tick)中断产生。RTOS在启动第一个任务前皆创建了多个任务,并指定了需要启动的第一个启动的任务(例如可以根据任务优先级顺序指定第一个启动的任务),通过将第一个启动的任务转换为对应的Linux线程,唤醒Linux线程,这样系统就运行着一个任务。任务函数执行体会打开中断,这样在任务执行的情况下,ITIMER_REAL定时器也会周期地产生。
(7)在Linux操作系统下实现任务切换函数;
在运行第一个任务后,总会有其他高优先级任务想要得到运行,这时就需要实现任务切换。任务切换的主要流程包括:
a)获取当前运行的嵌入式实时操作系统的任务,转换为对应的Linux线程,记为暂停线程(thread_to_suspend);
b)获取需要切换到运行的嵌入式实时操作系统的任务,转换为对应的Linux线程,记为恢复线程(thread_to_resume);
c)如果thread_to_suspend与thread_to_resume相同,不做任何切换动作,不同则阻塞thread_to_suspend并唤醒thread_to_resume,记录当前运行任务为切换后的任务。
需要说明的是,在任务切换的时候需要将切换前的任务阻塞,将需要运行的任务唤醒,这样RTOS系统中总是只有一个任务在运行,因此这种仿真的嵌入式实时操作系统实质是一个单核系统。
通过执行上述步骤,实现在Linux下仿真RTOS,然后可以通过RTOS的系统调用进行应用程序的开发。
上述嵌入式实时操作系统仿真方法中,可以在Linux操作系统下,直接使用嵌入式实时操作系统源码,只修改架构适配相关程序,代码修改量少,移植简单;另外,仿真程序修改架构适配相关程序全部使用Linux应用层开发接口,不涉及Linux内核开发,开发难度较低;此外,通过使用Linux的一个进程仿真一个嵌入式实时操作系统,开发人员后续使用和Linux下开发应用程序一样,能够在没有实际的硬件情况下,在Linux下进行嵌入式实时操作系统的系统调用,实现快速软硬件同步开发,提高工程开发速度。
基于上述方法实施例,本公开实施例提供了一种嵌入式实时操作系统仿真装置,应用于计算机设备,计算机设备安装有Linux操作系统,参照图7,装置700包括:
创建模块710,用于在Linux操作系统下,创建结构体,其中,结构体包括:Linux操作系统的至少一个线程的信号量、嵌入式实时操作系统RTOS的任务执行函数体以及任务退出函数体;
处理模块720,用于利用所述信号量对应的至少一个线程,基于任务执行函数体执行RTOS的任务;利用所述信号量对应的至少一个线程,基于任务退出函数体退出RTOS的任务的执行。
在一个实施例中,装置还可以包括:
获取模块,用于获取RTOS的适配程序,其中,适配程序为:基于RTOS的源码中的与处理器架构相关的代码程序修改得到的程序;
创建模块710具体用于:
在Linux操作系统下,基于适配程序创建结构体。
在一个实施例中,RTOS的不同任务对应的Linux操作系统的线程不同。
在一个实施例中,创建模块710还用于:
创建Linux操作系统的线程的函数执行体,其中,线程的函数执行体,用于执行线程的阻塞和唤醒、以及执行任务执行函数体与任务退出函数体。
在一个实施例中,装置还包括第一调用模块,第一调用模块用于:
在Linux操作系统的链接脚本未被修改的情况下,通过Linux操作系统的主函数调用RTOS的启动代码;
或者,在Linux操作系统的链接脚本被修改的情况下,通过Linux操作系统的预设编译工具指定的入口函数调用RTOS的启动代码。
在一个实施例中,RTOS的内核源码中包括:心跳增加函数,装置还包括:
第二调用模块,用于基于Linux操作系统产生的报警信号,周期地调用RTOS的心跳增加函数。
在一个实施例中,第二调用模块具体用于:
在Linux操作系统下,创建定时器;
当定时器的定时时间到达时,产生报警信号;
为报警信号注册处理函数,其中,处理函数,用于执行RTOS的心跳增加函数。
在一个实施例中,处理模块还用于:
将当前执行的RTOS的任务转换为对应的Linux操作系统中的第一线程;
将需要切换到执行的RTOS的任务转换为对应的Linux操作系统中的第二线程;
当第一线程与第二线程相同时,维持第一线程的唤醒状态;
当第一线程与第二线程不同时,阻塞第一线程,并唤醒第二线程。
在一个实施例中,装置还包括内存分配模块,内存分配模块用于:
将通过Linux操作系统申请到的内存区域分配为RTOS的内存堆;其中,内存堆,用于存储RTOS运行中产生的信息。
在一个实施例中,装置还包括第三调用模块,第三调用模块用于:
调用Linux操作系统的时钟中断函数执行关中断或开中断,其中,关中断,用于屏蔽报警信号;开中断,用于不屏蔽报警信号。
在一个实施例中,处理模块720还用于:
在执行完关中断时,将RTOS的首个任务转换为对应的Linux操作系统中的线程;
唤醒线程,以启动RTOS的首个任务。
需要说明的是:上述实施例提供的嵌入式实时操作系统仿真装置在实现嵌入式实时操作系统仿真方法时,仅以上述各程序模块的划分进行举例说明,实际应用中,可以根据需要而将上述处理分配由不同的程序模块完成,即将嵌入式实时操作系统仿真装置的内部结构划分成不同的程序模块,以完成以上描述的全部或者部分处理。另外,上述实施例提供的装置与相应方法的实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
本公开实施例还提供一种计算机设备,所述计算机设备安装有Linux操作系统,包括:存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现本公开实施例任一所述的嵌入式实时操作系统仿真方法的步骤。
图8是本公开实施例提供的一种计算机设备的结构框图,图8所示的计算机设备800包括:至少一个处理器801、存储器802、至少一个网络接口803。控制设备800中的各个组件通过总线系统804耦合在一起。可理解,总线系统804用于实现这些组件之间的连接通信。总线系统804除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图8中将各种总线都标为总线系统804。
可以理解,存储器802可以是易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。
本公开实施例中的存储器802用于存储各种类型的数据以支持计算机设备800的操作。这些数据的示例包括:用于在计算机设备800上操作的任何计算机程序,如可执行程序8021,实现本公开实施例方法的程序可以包含在可执行程序8021中。
本公开实施例还提供一种计算机可读存储介质,存储介质上存储有计算机程序,计算机程序被处理器执行时,实现本公开实施例任一所述嵌入式实时操作系统仿真方法中的步骤。
需要说明的是,本公开实施例的存储介质可以由任何类型的易失性或非易失性存储设备、或者它们的组合来实现。其中,非易失性存储器可以是只读存储器(ROM,Read OnlyMemory)、可编程只读存储器(PROM,Programmable Read-Only Memory)、可擦除可编程只读存储器(EPROM,Erasable Programmable Read-Only Memory)、电可擦除可编程只读存储器(EEPROM,Electrically Erasable Programmable Read-Only Memory)、磁性随机存取存储器(FRAM,Ferromagnetic Random Access Memory)、快闪存储器(Flash Memory)、磁表面存储器、光盘、或只读光盘(CD-ROM,Compact Disc Read-Only Memory);磁表面存储器可以是磁盘存储器或磁带存储器。易失性存储器可以是随机存取存储器(RAM,Random AccessMemory),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的RAM可用,例如静态随机存取存储器(SRAM,Static Random Access Memory)、同步静态随机存取存储器(SSRAM,Synchronous Static Random Access Memory)、动态随机存取存储器(DRAM,Dynamic Random Access Memory)、同步动态随机存取存储器(SDRAM,SynchronousDynamic Random Access Memory)、双倍数据速率同步动态随机存取存储器(DDRSDRAM,Double Data Rate Synchronous Dynamic Random Access Memory)、增强型同步动态随机存取存储器(ESDRAM,Enhanced Synchronous Dynamic Random Access Memory)、同步连接动态随机存取存储器(SLDRAM,SyncLink Dynamic Random Access Memory)、直接内存总线随机存取存储器(DRRAM,Direct Rambus Random Access Memory)。本公开实施例描述的存储介质旨在包括但不限于这些和任意其它适合类型的存储器。
在本公开所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元,即可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
另外,在本公开各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
或者,本公开上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本公开实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本公开各个实施例方法的全部或部分。而前述的存储介质包括:移动存储设备、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
本公开所提供的几个方法实施例中所揭露的方法,在不冲突的情况下可以任意组合,得到新的方法实施例。
本公开所提供的几个产品实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的产品实施例。
本公开所提供的几个方法或设备实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的方法实施例或设备实施例。
以上,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应以权利要求的保护范围为准。

Claims (14)

1.一种嵌入式实时操作系统仿真方法,其特征在于,应用于计算机设备,所述计算机设备安装有Linux操作系统,所述方法包括:
在所述Linux操作系统下,创建结构体,其中,所述结构体包括:所述Linux操作系统的至少一个线程的信号量以及嵌入式实时操作系统RTOS的任务执行函数体以及任务退出函数体;
利用所述信号量对应的至少一个线程,基于所述任务执行函数体执行所述RTOS的任务;
利用所述信号量对应的至少一个线程,基于所述任务退出函数体退出所述RTOS的任务的执行。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
获取所述RTOS的适配程序,其中,所述适配程序为:基于所述RTOS的源码中的与处理器架构相关的代码程序修改得到的程序;
所述在所述Linux操作系统下,创建结构体,包括:
在所述Linux操作系统下,基于所述适配程序创建所述结构体。
3.根据权利要求1所述的方法,其特征在于,所述RTOS的不同任务对应的所述Linux操作系统的线程不同。
4.根据权利要求1所述的方法,其特征在于,所述方法还包括:
创建所述Linux操作系统的线程的函数执行体,其中,所述线程的函数执行体,用于执行所述线程的阻塞和唤醒、以及执行所述任务执行函数体与所述任务退出函数体。
5.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在所述Linux操作系统的链接脚本未被修改的情况下,通过所述Linux操作系统的主函数调用所述RTOS的启动代码;
或者,在所述Linux操作系统的链接脚本被修改的情况下,通过所述Linux操作系统的预设编译工具指定的入口函数调用RTOS的启动代码。
6.根据权利要求1所述的方法,其特征在于,所述RTOS的内核源码中包括:心跳增加函数,所述方法还包括:
基于所述Linux操作系统产生的报警信号,周期地调用所述RTOS的心跳增加函数。
7.根据权利要求6所述的方法,其特征在于,所述基于所述Linux操作系统产生的报警信号,周期地调用所述RTOS的心跳增加函数,包括:在所述Linux操作系统下,创建定时器;
当所述定时器的定时时间到达时,产生所述报警信号;
为所述报警信号注册处理函数,其中,所述处理函数,用于执行所述RTOS的心跳增加函数。
8.根据权利要求1所述的方法,其特征在于,所述方法还包括:
将当前执行的所述RTOS的任务转换为对应的所述Linux操作系统中的第一线程;
将需要切换到执行的所述RTOS的任务转换为对应的所述Linux操作系统中的第二线程;
当所述第一线程与所述第二线程相同时,维持所述第一线程的唤醒状态;
当所述第一线程与所述第二线程不同时,阻塞所述第一线程,并唤醒所述第二线程。
9.根据权利要求1所述的方法,其特征在于,所述方法还包括:
将通过所述Linux操作系统申请到的内存区域分配为所述RTOS的内存堆;其中,所述内存堆,用于存储所述RTOS运行中产生的信息。
10.根据权利要求6所述的方法,其特征在于,所述方法还包括:
调用所述Linux操作系统的时钟中断函数执行关中断或开中断,其中,所述关中断,用于屏蔽所述报警信号;所述开中断,用于不屏蔽所述报警信号。
11.根据权利要求10所述的方法,其特征在于,所述方法还包括:
在执行完所述关中断时,将所述RTOS的首个任务转换为对应的所述Linux操作系统中的线程;
唤醒所述线程,以启动所述RTOS的首个任务。
12.一种嵌入式实时操作系统仿真装置,其特征在于,应用于计算机设备,所述计算机设备安装有Linux操作系统,所述装置包括:
第一创建模块,用于在所述Linux操作系统下,创建结构体,其中,所述结构体包括:所述Linux操作系统的至少一个线程的信号量以及嵌入式实时操作系统RTOS的任务执行函数体以及任务退出函数体;
处理模块,用于利用所述信号量对应的至少一个线程,基于所述任务执行函数体执行所述RTOS的任务;利用所述信号量对应的至少一个线程,基于所述任务退出函数体退出所述RTOS的任务的执行。
13.一种计算机设备,所述计算机设备安装有Linux操作系统,所述计算机设备包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至11任一项所述方法的步骤。
14.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时,实现如权利要求1至11任一项所述方法的步骤。
CN202210272363.5A 2022-03-18 2022-03-18 嵌入式实时操作系统仿真方法、装置和存储介质 Pending CN116795481A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210272363.5A CN116795481A (zh) 2022-03-18 2022-03-18 嵌入式实时操作系统仿真方法、装置和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210272363.5A CN116795481A (zh) 2022-03-18 2022-03-18 嵌入式实时操作系统仿真方法、装置和存储介质

Publications (1)

Publication Number Publication Date
CN116795481A true CN116795481A (zh) 2023-09-22

Family

ID=88033303

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210272363.5A Pending CN116795481A (zh) 2022-03-18 2022-03-18 嵌入式实时操作系统仿真方法、装置和存储介质

Country Status (1)

Country Link
CN (1) CN116795481A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117806988A (zh) * 2024-02-29 2024-04-02 山东云海国创云计算装备产业创新中心有限公司 任务执行方法、任务配置方法、板卡、服务器

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117806988A (zh) * 2024-02-29 2024-04-02 山东云海国创云计算装备产业创新中心有限公司 任务执行方法、任务配置方法、板卡、服务器
CN117806988B (zh) * 2024-02-29 2024-05-24 山东云海国创云计算装备产业创新中心有限公司 任务执行方法、任务配置方法、板卡、服务器

Similar Documents

Publication Publication Date Title
CN109522087B (zh) 基于国产申威处理器的虚拟机构建方法和系统
US10289442B1 (en) Parallelization in virtual machine operation
US20070204271A1 (en) Method and system for simulating a multi-CPU/multi-core CPU/multi-threaded CPU hardware platform
De Oliveira et al. Timing analysis of the PREEMPT RT Linux kernel
EP1842132A1 (en) Method for optimising the logging and replay of multi-task applications in a mono-processor or multi-processor computer system
Chen et al. SafeMC: A system for the design and evaluation of mode-change protocols
CN116795481A (zh) 嵌入式实时操作系统仿真方法、装置和存储介质
Carnevali et al. A formal approach to design and verification of two-level hierarchical scheduling systems
Posadas et al. POSIX modeling in SystemC
Naderlinger Simulating preemptive scheduling with timing-aware blocks in Simulink
EP0270983A2 (en) Method for the parallel simulation of multiprocessor computer systems
Ruiz et al. CPU isolation on the Android OS for running real-time applications
Restuccia et al. ARTe: Providing real-time multitasking to Arduino
Chen et al. Use of sqlite on embedded system
Marwedel et al. System software
Jämbäck Evaluation of Real-Time Linux on RISC-V processor architecture
Gliwa et al. Operating Systems
Miller et al. Agile Development of Linux Schedulers with Ekiben
Gupta et al. Operating system
Starr et al. Model Execution Domain
Masmano et al. Running ada on real-time linux
Zhang et al. A Node Agent for Fast and Safe Execution of Computing Tasks under Kubernetes
Wang et al. A Simple Operating System Kernel
Kulkarni Real-time audio processing for an embedded Linux system using a dual-kernel approach
CN117762440A (zh) 应用程序的更新方法、装置、电子设备及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination