什么是PSOS

什么是PSOS,第1张

pSOS系统结构

pSOS是一个由标准软组件组成的,可剪裁的实时 *** 作系统。其系统结构如图2.1所示

,它分为内核层、系统服务层、用户层。

1. 内核层

pSOS内核负责任务的管理与调度、任务间通信、内存管理、实时时钟管理、中断服

务;可以动态生成或删除任务、内存区、消息队列、信号灯等系统对象;实现了基于优

先级的、选择可抢占的任务调度算法,并提供了可选的时间片轮转调度。pSOS Kernel还

提供了任务建间通信机制及同步、互斥手段,如消息、信号灯、事件、异步信号等。

pSOS *** 作系统在Kernel层中将与具体硬件有关的 *** 作放在一个模块中,对系统服务层

以上屏蔽了具体的硬件特性,从而使得pSOS很方便地从支持Intel 80x86系列转到支持MC

68XXX系列,并且在系统服务层上对不同应用系统不同用户提供标准的软组件如PNA+、

PHILE+等。

2. 系统服务层

pSOS系统服务层包括PNA+、PRPC+、PHILE+等组件。PNA+实现了完整的基于流的TCP

/IP协议集,并具有良好的实时性能,网络组件内中断屏蔽时间不大于内核模块中断屏蔽时

间。PRPC+提供了远程调用库,支持用户建立一个分布式应用系统。PHILE+提供了文件系

统管理和对块存储设备的管理。PREPC+提供了标准的C、C++库,支持用户使用C、C++语言

编写应用程序。

由于pSOS内核屏蔽了具体的硬件特性,因此,pSOS系统服务层的软组件是标准的、与

硬件无关的。这意味着pSOS各种版本,无论是对80X86系列还是MC68XXX系列,其系统服务

层各组件是标准的、同一的,这减少了软件维护工作,增强了软件可移植性。

每个软组件都包含一系列的系统调用。对用户而言,这些系统调用就象一个个可重入

的C函数,然而它们却是用户进入pSOS内核的唯一手段。

3. 用户层

用户指的是用户编写的应用程序,它们是以任务的形式出现的。任务通过帆首发系统调

用而进入pSOS内核,并为pSOS内核所管理和调度。

pSOS为用户还提供了一个集成式的开发环境(IDE)。pSOS_IDE可驻留于UNIX或DOS

环境下,它包括C和C++优化编译器、CPU和pSOS模拟仿真和DEBUG功能。

pSOS内核机制

§3.1 几个基本概念

3.1.1 任务

在实时 *** 作系统中,任务是参与资源竞争(如CPU、Memory、I/O devices等)

的基本单位。pSOS为每个任务构造了一个虚拟的、隔离的环境,从而在概念上,一个任务

与另一个任务之间可以相互并行、独立地执行。任务与任务之间的切换、任务之间的通

信都是通过发系统调用(在有些情况下是通过ISR)进入pSOS Kernel,由pSOS Kernel完

成的。

pSOS系统中任务包括系统任务和用户任务两类。关于用户任务的划分并没有一个固

定的法则,但很明显,划分太多将导致任务间的切换过于频繁,系统开销太大,划分太少又

会闭轿慎导致实时性和并行性下降,从而影响系统的效率。一般说来,功能模块A与功能模块B是

分开为两个任务还是合为一个任务可以从是否具有时间相关性、优先性、逻辑特性和功

能耦合等几个方面考虑。

3.1.2 优先级

每个任务都有一个优先级。pSOS系统支持0~255级优先级,0级最低,255级最高。0级

专为IDLE任务所有,240~255级为系统所用。在运行时,任务(包括系统任务)的优先级

可以通过t_setpri系统调用改变。

3.1.3 任务状态

pSOS下任务具有三种可能状态并处于这三个状态之一。只有通过任务本身或其他任

务、ISR对pSOS内核所作的轿敬系统调用才能改变任务状态。从宏观角度看,一个多任务应用

通过一系列到pSOS的系统调用迫使pSOS内核改变受影响任务而从运行一个任务到运行另

一任务向前发展的。

对于pSOS kernel,任务在创建前或被删除后是不存在的。被创建的任务在能够运行

前必须被启动。一旦启动后,一个任务通常处于下面三个状态之一:

①Executing (Ready)就绪

②Running运行

③Blocked阻塞

就绪任务是未被阻塞可运行的,只等待高优先级任务释放CPU的任务。由于一个任务

只能由正运行的任务通过调用来被启动,而且任何时刻只能有一个正在运行的任务,所

以新任务总是从就绪态开始。

运行态任务是正在使用CPU的就绪任务, 系统只能有一个running任务。一般runni

ng任务是所有就绪任务中优先级最高的,但也有例外。

任务是由自身特定活动而变为阻塞的,通常是系统调用引起调用任务进入等待状态

的。所以任务不可能从ready态到blocked态,因为只有运行任务才能执行系统调用。

3.1.4 任务控制块

任务控制块TCB是pSOS内核建立并维护的一个系统数据结构,它包含了pSOS Kernel调

度与管理任务所需的一切信息,如任务名、优先级、剩余时间片数、当前寄存器状态等。

在有的RTOS中,任务的状态与任务TCB所处的队列是等同的。pSOS *** 作系统将二者分

为两个概念,例如任务处于阻塞状态,但它的TCB却处于消息等待队列、信号灯等待队列、

内存等待队列、超时队列之一。

pSOS启动时,将根据Configuration Table中的参数kc_ntask建立一个包含kc_ntask

个TCB块的TCB池,它表示最大并行任务数。在创建一个任务时,分配一个TCB给该任务,在

撤销一个任务时,该TCB将被收回。

3.1.5 对象、对象名及ID号

pSOS Kernel是一个面向对象的 *** 作系统内核,pSOS系统中对象包括任务、memory

regions、memory partitions、消息队列和信号灯。

对象名由用户定义(4位ASCII字符),并且在该对象创建时作为系统调用obj_CREAT

E

的一个人口参数传给pSOS Kernel。pSOS Kernel反过来赋予该对象一个唯一的32位ID号

。除obj_CREATE和obj_IDENT外,所有涉及对象的系统调用都要用到对象ID号。

创建对象的任务通过obj_CREATE就已经知道了该对象的ID号,其余任务可通过obj_

IDENT或通过全局变量(如果已经为该任务的ID号建立了一个全局变量的话)获取该对象

的ID号。对象ID号隐含了该对象控制块(如TCB、QCB)的位置信息,这一位置信息被pSO

S

Kernel用于对该对象的管理和 *** 作,如挂起/解挂一个任务、删除一个消息队列等。

3.1.6 任务模式字Mode word.

每个任务带有一个mode word,用来改变调度决策或执行环境。主要有以下四个参

Preemption Enabled/Disabled.

Roundrobin Enabled/Disabled

Interupts Enabled/Disabled.

ASR Enabled/Disabled: 每个任务有一个通过as-catoh建立起来的异步信号服务例

程ASR。异步信号类似于软件中断。当ASR位为1时as-catch所指向的任务将会被改变执行

路径,先执行ASR,再返回原执行点。

§3.2 任务调度

3.2.1 影响动态调度效果的两个因素

pSOS采用优先级+时间片的调度方式。有两个因素将影响动态调度的效果:一是优先

级可变(通过t_setpri系统调用改变任务的优先级);二是任务模式字中的preemption

bit位和roundrobin bit位。preemption bit位决定不同优先级的任务是否可抢占,并和

roundrobin bit位一起决定任务的时间片轮转是否有效。

3.2.2 引起任务调度的原因及结果

pSOS系统中引起调度的原因有两条:

1. 在轮转方式下时间片到

2. pSOS系统调用引发任务调度。该系统调用可能是ISR发出的,也可能是某个任务发出的

pSOS任务调度的结果有两种:

1. 引起运行任务切换,这指的是

2. 不引起运行任务切换,这指的是

不论任务调度是否引发运行任务切换,都有可能引起一个或多个任务状态变迁。

3.2.3 运行任务的切换

一、何时切换

下面三种情况将引发运行任务切换:

1. 在时间片轮转方式下(此时任务模式字的roundrobin bit与preemption bit均为

enable),运行任务Task A的时间片用完,且Ready队列中有相同优先级的其它任务,则

Task A退出运行。

2. 在运行任务Task A的Mode word的preemption bit位为enable的前提下,若Task A发出

的某条相同调用引发一个优先级高于Task A的任务Task B从Block状态进入Reary状态,则

将Task B投入运行。

3. ISR使用I_RETURN系统调用,则ISR退出运行,pSOS Kernel选择Ready队列中优先级最高

的任务投入运行(这一任务并不一定是被ISR打断的前运行任务)。

二、如何切换

上述三类运行任务的切换,其具体的pSOS Kernel运作过程并非完全一样,但彼此之间

差别不大。为了简单起见,我们以

为例对切换过程作一简单叙述。这一过程可细分为4个步骤:

1. 任务A运行信息保存(_t_save proc far)

这一过程主要完成修改系统工作标志,保存切换点地址及运行信息、任务A栈调

指针保存、栈切换、参数及返址入栈等一系列工作。

2.任务A入就绪队列(void t_in_chain)

这一过程将任务A的TCB块按优先级顺序插入就绪队列。

3.选择一个高优先级任务B(void t_choice( ))

按一定算法从就绪队列中选出最高优先级任务B的TCB块,并使运行指针指向它。

4.将任务B投入运行(_t_run proc far)

从系统栈切换到任务B栈,用任务B的TCB块中保存的信息恢复上次运行被打断的

,恢

复任务运行环境,于是任务B开始继续运行。

图3.1反映了典型任务切换过程中CPU控制权的转移、各堆栈活动生命期、任务活动

生命期等信息。图中

t1,t4为切换点 t2,t3为开/关中断

Tsch=t4-t1 // Tsch为任务切换时间

Tforbid=t3-t2 // Tforbid为中断禁止时间

它们是实时 *** 作系统最重要的两个性能指标。

%不知道你具体的问题是什么,下面是一个最基本的pso算法解决函数极值问题,如雀基果是一些大型的问题,需要对速度、惯性顷毕谨常数、和自适应变数游异做进一步优化,希望对你有帮助

function y = fun(x)

y=-20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+2.71289

%下面是主程序

%% 清空环境

clc

clear

%% 参数初始化

%粒子群算法中的两个参数

c1 = 1.49445

c2 = 1.49445

maxgen=200 % 进化次数

sizepop=20 %种群规模

Vmax=1%速度限制

Vmin=-1

popmax=5%种群限制

popmin=-5

%% 产生初始粒子和速度

for i=1:sizepop

%随机产生一个种群

pop(i,:)=5*rands(1,2) %初始种群

V(i,:)=rands(1,2) %初始化速度

%计算适应度

fitness(i)=fun(pop(i,:)) %染色体的适应度

end

%找最好的染色体

[bestfitness bestindex]=min(fitness)

zbest=pop(bestindex,:) %全局最佳

gbest=pop %个体最佳

fitnessgbest=fitness %个体最佳适应度值

fitnesszbest=bestfitness %全局最佳适应度值

%% 迭代寻优

for i=1:maxgen

for j=1:sizepop

%速度更新

V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:))

V(j,find(V(j,:)>Vmax))=Vmax

V(j,find(V(j,:)<Vmin))=Vmin

%种群更新

pop(j,:)=pop(j,:)+0.5*V(j,:)

pop(j,find(pop(j,:)>popmax))=popmax

pop(j,find(pop(j,:)<popmin))=popmin

%自适应变异(避免粒子群算法陷入局部最优)

if rand>0.8

k=ceil(2*rand)%ceil朝正无穷大方向取整

pop(j,k)=rand

end

%适应度值

fitness(j)=fun(pop(j,:))

%个体最优更新

if fitness(j) <fitnessgbest(j)

gbest(j,:) = pop(j,:)

fitnessgbest(j) = fitness(j)

end

%群体最优更新

if fitness(j) <fitnesszbest

zbest = pop(j,:)

fitnesszbest = fitness(j)

end

end

yy(i)=fitnesszbest

end

%% 结果分析

plot(yy)

title(['适应度曲线 ' '终止代数=' num2str(maxgen)])

xlabel('进化代数')ylabel('适应度')

%标准PSO算法源代码(matlab)

%标准粒群优化算法程氏漏序

% 2007.1.9 By jxy

%测试函数:f(x,y)=100(x^2-y)^2+(1-x)^2, -2.048<x,y<2.048

%求解函数最小值

global popsize%种群规模

%global popnum %种群数量

global pop%种群

%global c0 %速度惯性系数,为0—1的随机数

global c1 %个体最优导向系数

global c2 %全局最优导向系数

global gbest_x %全局最优解x轴坐标

global gbest_y %全局最优解y轴坐标

global best_fitness %最优解

global best_in_history%最优解变化轨迹

global x_min %x的下限

global x_max %x的上限

global y_min %y的下限

global y_max %y的上限

global gen%迭代次数

global exetime%当前迭代次数

global max_velocity %最大速度

initial %初始化

for exetime=1:gen

outputdata%实时输出结果

adapting %计算适应值

errorcompute()%计算当前种群适值标准差

updatepop %更新粒子位置

pause(0.01)

end

clear i

clear exetime

clear x_max

clear x_min

clear y_min

clear y_max

%程序初始化

gen=100%设置进化代数

popsize=30%设置种群规模大小

best_in_history(gen)=inf %初始化全局历史最优解

best_in_history(gen)=inf %初始化全局历史最优解帆世

max_velocity=0.3 %最大速度限制

best_fitness=inf

%popnum=1 %设置种群数量

pop(popsize,8)=0 %初始化种群,创建popsize行5列的0矩阵

%种群数组第1列为x轴坐标,第2列为y轴坐标,第3列为x轴歼轿烂速度分量,第4列为y轴速度分量

%第5列为个体最优位置的x轴坐标,第6列为个体最优位置的y轴坐标

%第7列为个体最优适值,第8列为当前个体适应值

for i=1:popsize

pop(i,1)=4*rand()-2%初始化种群中的粒子位置,值为-2—2,步长为其速度

pop(i,2)=4*rand()-2%初始化种群中的粒子位置,值为-2—2,步长为其速度

pop(i,5)=pop(i,1) %初始状态下个体最优值等于初始位置

pop(i,6)=pop(i,2) %初始状态下个体最优值等于初始位置

pop(i,3)=rand()*0.02-0.01 %初始化种群微粒速度,值为-0.01—0.01,间隔为0.0001

pop(i,4)=rand()*0.02-0.01 %初始化种群微粒速度,值为-0.01—0.01,间隔为0.0001

pop(i,7)=inf

pop(i,8)=inf

end

c1=2

c2=2

x_min=-2

y_min=-2

x_max=2

y_max=2

gbest_x=pop(1,1) %全局最优初始值为种群第一个粒子的位置

gbest_y=pop(1,2)

%适值计算

% 测试函数为f(x,y)=100(x^2-y)^2+(1-x)^2, -2.048<x,y<2.048

%计算适应值并赋值

for i=1:popsize

pop(i,8)=100*(pop(i,1)^2-pop(i,2))^2+(1-pop(i,1))^2

if pop(i,7)>pop(i,8)%若当前适应值优于个体最优值,则进行个体最优信息的更新

pop(i,7)=pop(i,8) %适值更新

pop(i,5:6)=pop(i,1:2) %位置坐标更新

end

end

%计算完适应值后寻找当前全局最优位置并记录其坐标

if best_fitness>min(pop(:,7))

best_fitness=min(pop(:,7))%全局最优值

gbest_x=pop(find(pop(:,7)==min(pop(:,7))),1) %全局最优粒子的位置

gbest_y=pop(find(pop(:,7)==min(pop(:,7))),2)

end

best_in_history(exetime)=best_fitness %记录当前全局最优

%实时输出结果

%输出当前种群中粒子位置

subplot(1,2,1)

for i=1:popsize

plot(pop(i,1),pop(i,2),'b*')

hold on

end

plot(gbest_x,gbest_y,'r.','markersize',20)axis([-2,2,-2,2])

hold off

subplot(1,2,2)

axis([0,gen,-0.00005,0.00005])

if exetime-1>0

line([exetime-1,exetime],[best_in_history(exetime-1),best_fitness])hold on

end

%粒子群速度与位置更新

%更新粒子速度

for i=1:popsize

pop(i,3)=rand()*pop(i,3)+c1*rand()*(pop(i,5)-pop(i,1))+c2*rand()*(gbest_x-pop(i,1)) %更新速度

pop(i,4)=rand()*pop(i,4)+c1*rand()*(pop(i,6)-pop(i,2))+c2*rand()*(gbest_x-pop(i,2))

if abs(pop(i,3))>max_velocity

if pop(i,3)>0

pop(i,3)=max_velocity

else

pop(i,3)=-max_velocity

end

end

if abs(pop(i,4))>max_velocity

if pop(i,4)>0

pop(i,4)=max_velocity

else

pop(i,4)=-max_velocity

end

end

end

%更新粒子位置

for i=1:popsize

pop(i,1)=pop(i,1)+pop(i,3)

pop(i,2)=pop(i,2)+pop(i,4)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12215699.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存