嵌入式计算机系统与通用型计算机相比,具有以下特点:专用性强、可裁剪性好、实时性与可靠性好、功耗低。
嵌入式计算机系统一开始是建立在与通用型计算机系统相似的硬件环境中的,由于通用性计算机系统的可裁剪性、实时性等较弱,由此另辟蹊径,出现了软硬件方面都与通用型计算机系统有很大差异的专用嵌入式系统,比如硬件方面使用如EPROM、Flash等而非硬盘之类的大型存储介质,软件方面实时性强,可对多任务进行管理,同时应用程序专用性高。(通用型计算机系统更适用于数值计算。)
嵌入式操作系统:运行在嵌入式硬件平台上,对整个系统及其所操作的部件、装置等资源进行统一协调、指挥和控制的系统软件就叫做嵌入式操作系统。
小结:嵌入式系统包含了软硬件组成成分,嵌入式系统的组成可以没有操作系统而只有硬件和操作硬件的特定的应用程序;嵌入式操作系统是对嵌入式系统的软硬件资源进行调度,具有很强的实时性和可靠性,同时程序执行时间相对确定,可以计算,移植性和可裁剪性也高。没有带操作系统的嵌入式系统,经常会在延时等情况下闲置CPU,而带有操作系统的嵌入式系统则可以在延时等情况下切换任务,最大限度地利用CPU,并显示其优越性。
实时操作系统:如果操作系统能使计算机系统(软硬件组成)及时响应外部事件的请求,并能及时控制所有实时设备与实时任务协调运行,且能在一个规定的时间内完成对事件的处理,则称其为实时操作系统。(三要素:1、对外及时响应;2、及时控制硬件与任务协调配合;3、执行时间可确定。)
实时操作系统的要求:1、逻辑或功能正确:计算结果必须正确;2、时间正确:必须在预定时间内完成。
嵌入式系统的任务:嵌入式系统功能相对固定,一般用一个无限循环结构作为系统的任务,如while、for( ; ;)等结构,系统初始化后一直在这一结构中运行,外部事件通过中断请求系统响应,系统响应请求进入中断处理函数后跳出回到原结构继续执行。
嵌入式操作系统主要提供”微内核“服务,包括:A)动态内存管理:操作系统提供内存给应用程序使用,应用程序结束任务后释放内存,将内存还给操作系统,从而实现内存的重复利用;B)多任务管理:提供用于控制任务的启动、运行、暂停和结束等状态的函数;C)外围资源管理:合理管理显示器、通讯端口等外围资源。而操作系统所需的串口系统界面、文件管理模块、通信协议等,需要开发人员设计。
操作系统常用的数据结构:
操作系统使一种管理软件,就是说,在了解被管理对象的基本信息后,在需要时,按照某种规则对遮羞额被管理对象进行分配、调度等操作,掌握被管理对象的基本信息需要用各种数据结构来登记、造册。
一、程序控制块:结构体。
最简单的程序控制块应当包含以下内容:代码名称、代码重要性级别、版本号、指向被管理代码的指针。
创建程序控制块数组,然后初始化程序控制块,并关联程序控制块与被管理代码。
//程序控制块实例
//步骤:1、创建程序控制块(结构体:程序块名称、
// 重要性级别、版本号和指向被管理代码的指针)
// 2、创建程序块代码(也就是函数)
// 3、在主函数中创建程序控制块数组
// 4、初始化程序控制块数组并关联被管理代码
// 5、判断调用的函数,执行相应的被管理代码
#include
char *code_name;
int p;
int v_number;
void (* fun)(void);
}TCB;
void function_1(void)
{
printf("function_1 finshed./n");
}
void function_2(void)
{
printf("function_2 finshed./n");
}void function_3(void)
{
printf("function_3 finshed./n");
}
TCB Creat_TCB(char *name,int p,int v_number,void (*fun)())
{
TCB tcb_1;
tcb_1.code_name = name;
tcb_1.p = p;
tcb_1.v_number = v_number;
tcb_1.fun = fun;
return tcb_1;
}
void main(void)
{
char code_name[10];
int i=0,t=0;
TCB tcb_pg[3];
tcb_pg[0]=Creat_TCB("fun1",0,0,function_1);
tcb_pg[1]=Creat_TCB("fun2",1,1,function_2);
tcb_pg[2]=Creat_TCB("fun3",2,2,function_3);
printf("please input fun_name you want to pick:");
scanf("%s",code_name);
for(;i<3;i++)
{
if(strcmp(tcb_pg[i].code_name,code_name)==0)
{
tcb_pg[i].fun();
t=1;
}
if((t==0)&&i==2)
printf("No %s\n",code_name);
}
}
使用gcc 文件路径+文件名 -o 可执行文件路径及名称,可以成功编译上述代码。
注:由于原书提及的borrland C3.1精简版不适用于win10操作系统,我选择之前由稍微接触过的gcc编译器,具体操作为:下载并安装mingw,由于我们暂时只需要编译器及makefile执行器,安装时选择gcc包及make的所有相关文件即可,如下示例。
显然,当被管理代码数目较大且其控制块较大时,使用结构体数组将占用较大的连续内存空间,因此转而使用链表(在程序执行完后可以释放空间)。由于链表的查询速度比较慢,因此给每一个链表配备了一个数组,数组元素为每一个链表元素的指针。(这里的链表一般使双向链表。)
位图:用二进制位标记被占用的内存块和未被占用的内存块。