皮皮网

【c aes cbc源码】【xshops商城系统源码】【c语言公式源码】信号灯生产源码_信号灯生产源码是什么

2024-11-20 20:21:38 来源:多彩的青蛙源码

1.新科空调故障代码E3具体指哪些原因?
2.交通信号灯控制程序设计
3.红绿灯和摄象头的信号工作原理是什么?
4.什么是PSOS

信号灯生产源码_信号灯生产源码是什么

新科空调故障代码E3具体指哪些原因?

       新科空调故障代码解析:E3背后的深层原因

       当新空调在我们的生活中突然“罢工”,e3这个故障代码就像一个信号灯,灯生警示我们需要关注。产源新科空调的码信E3代码,其实反映的号灯是制冷系统可能出现的问题。让我们一起探究,生产c aes cbc源码这背后隐藏着哪些可能的源码原因。

       专业制造,信号故障代码背后的灯生企业实力

       新科空调作为江苏冯润集团的明星产品,凭借强大的产源研发实力和生产经验,为消费者提供高品质的码信空调。集团集配套、号灯研发、生产生产和销售于一身,源码主导产品涵盖家用、信号商用及移动空调,还有空气净化器等健康家电,多项专利技术在国内遥遥领先。

       然而,代码E3并不仅仅是一个符号,它是代码语言的产物,设计原则保证了信息的清晰表达和一致性。源代码作为代码的核心,它的作用是将人类可读的指令转化为机器能理解的指令,确保空调的顺畅运行。

       故障代码E3的具体含义

       针对新科空调的E3故障,它提示我们是制冷过载保护,可能的原因包括:感应线被老鼠咬断,滤网堵塞导致通风不畅,内部风扇电容减小影响转速,以及蒸发器表面污垢积累。每个原因都对应着需要专业的诊断和处理方法,以避免影响空调的正常使用。

       总的来说,理解新科空调E3故障代码背后的含义,是解决维修问题的关键。通过排查这些可能原因,xshops商城系统源码我们可以确保空调的正常运行,避免因故障带来的不便。

       结论

       无论你是新科空调的忠实用户,还是维修人员,了解E3故障代码的含义都是提升使用体验和工作效率的重要步骤。本文旨在提供一个全面的故障代码解读,希望能帮助你解决空调小问题,让舒适生活不受影响。

交通信号灯控制程序设计

       简单I/O实验(交通灯控制)

       一、实验要求

       使用LS作为输出口,控制4个双色LED灯(可发红、绿、黄光),模拟交通灯的管理。

       二、实验目的

       1. 学习在单片机系统中扩展简单I/O接口的方法。

       2. 学习数据输出程序的设计方法。

       3. 学习模拟交通灯控制的方法。

       4. 学习双色灯的使用。

       三、实验电路及连线

       四、实验说明

       1. 由于本实验是交通灯控制实验,因此需要先了解实际交通灯的变化规律。假设一个十字路口为东西南北走向。初始状态0为东西红灯,南北红灯。然后转状态1,南北绿灯通车,东西红灯。过一段时间转状态2,南北绿灯闪几次转亮黄灯,延时几秒,东西仍然保持红灯。再转状态3,东西绿灯通车,南北红灯。c语言公式源码过一段时间转状态4,东西绿灯闪几次转亮黄灯,延时几秒,南北仍然保持红灯。最后循环至状态1。

       2. 双色LED是由一个红色LED管芯和一个绿色LED管芯封装在一起,公用负端。当红色正端加高电平,绿色正端加低电平时,红灯亮;红色正端加低电平,绿色正端加高电平时,绿灯亮;两端都加高电平时,黄灯亮。

       五、实验程序框图

       (程序框图此处省略,建议根据描述重新绘制以提高清晰度)

       源代码:

       ORG H

       LJMP START

       ORG H

       START:

       MOV SP, #H

       LCALL STATUS0; 初始状态(都是红灯)

       CIRCLE:

       LCALL STATUS1; 南北绿灯,东西红灯

       LCALL STATUS2; 南北绿灯闪转黄灯,东西红灯

       LCALL STATUS3; 南北红灯,东西绿灯

       LCALL STATUS4; 南北红灯,东西绿灯闪转黄灯

       LJMP CIRCLE

       STATUS0: ; 南北红灯,东西红灯

       MOV DPTR, #H

       MOV A, #0FH

       MOVX @DPTR, A

       MOV R2, # ; 延时1秒

       LCALL DELAY

       RET

       STATUS1: ; 南北绿灯,东西红灯

       MOV DPTR, #H

       MOV A, #5AH ; 南北绿灯,东西红灯

       MOVX @DPTR, A

       MOV R2, # ; 延时5秒

       LCALL DELAY

       RET

       STATUS2: ; 南北绿灯闪转黄灯,东西红灯

       MOV DPTR, #H

       MOV R3, #H ; 绿灯闪3次

       FLASH:

       MOV A, #5FH

       MOVX @DPTR, A

       MOV R2, #H

       LCALL DELAY

       MOV A, #5AH

       MOVX @DPTR, A

       MOV R2, #H

       LCALL DELAY

       DJNZ R3, FLASH

       MOV A, #0AH ; 南北黄灯,东西红灯

       MOVX @DPTR, A

       MOV R2, # ; 延时1秒

       LCALL DELAY

       RET

       STATUS3: ; 南北红灯,东西绿灯

       MOV DPTR, #H

       MOV A, #0A5H

       MOVX @DPTR, A

       MOV R2, # ; 延时5秒

       LCALL DELAY

       RET

       STATUS4: ; 南北红灯,东西绿灯闪转黄灯

       MOV DPTR, #H

       MOV R3, #H ; 绿灯闪3次

       FLASH1:

       MOV A, #0AFH

       MOVX @DPTR, A

       MOV R2, #H

       LCALL DELAY

       MOV A, #0A5H

       MOVX @DPTR, A

       MOV R2, #H

       LCALL DELAY

       DJNZ R3, FLASH1

       MOV A, #H ; 南北红灯,东西黄灯

       MOVX @DPTR, A

       MOV R2, # ; 延时1秒

       LCALL DELAY

       RET

       DELAY: ; 延时子程序

       PUSH 2

       PUSH 1

       PUSH 0

       DELAY1:

       MOV 1, #H

       DELAY2:

       MOV 0, #0B2H

       DJNZ 0, $

       DJNZ 1, DELAY2

       ; 延时 mS

       DJNZ 2, DELAY1

       POP 0

       POP 1

       POP 2

       RET

       END

红绿灯和摄象头的工作原理是什么?

       1)开关键盘输入交通灯初始时间,通过单片机P1输入到系统

       (2) 由单片机的定时器每秒钟通过P0口向的数据口送信息,由的PA 口显示红、绿、黄灯的燃亮情况;由的PC口显示每个灯的燃亮时间。

       (3)通过 设置 各个信号等的燃亮时间、通过设置,绿、红时间分别为秒、app包修改源码秒循环由的 P0口向的数据口输出。

       (4) 通过单片机的P3.0位来控制系统是工作或设置初值,当.牌位0就对系统进行初始化,为1系统就开始工作。

       (5)红灯倒计时时间,当有车辆闯红灯时,启动蜂鸣器进行报警,3S后然后恢复正常。

       (6)增加每次绿灯时间车流量检测的功能,并且通过查询P2.0端口的电平是否为低,开关按下为低电平,双位数码管显示车流量,直到下一次绿灯时间重新记入。

       (7)绿灯时间倒计时完毕,重新循环。

       5.控制器的软件设计

       5.1每秒钟的设定

       延时方法可以有两种一中是利用MCS-内部定时器才生溢出中断来确定1秒的时间,另一种是采用软延时的方法。

       5.2计数器硬件延时

       5.2.1 计数器初值计算

       定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。他是以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值设定为C和计数初值设定为TC 可得到如下计算通式:

       TC=M-C

       式中,M为计数器摸值,该值和计数器工作方式有关。在方式0时M为 ;在方式1时M的值为;在方式2和3为

       5.2.2 计算公式

       T=(M-TC)T计数

       或TC=M-T/T计数

       T计数是单片机时钟周期TCLK的倍;TC为定时初值

       如单片机的主脉冲频率为TCLKMHZ ,经过分频

       方式0 TMAX= *1微秒=8.毫秒

       方式1 TMAX= *1微秒=.毫秒

       显然1秒钟已经超过了计数器的最大定时间,所以我们只有采用定时器和软件相结合的办法才能解决这个问题.

       5.2.3 1秒的方法

       我们采用在主程序中设定一个初值为的软件计数器和使T0定时毫秒.这样每当T0到毫秒时CPU就响应它的溢出中断请求,进入他的中断服务子程序。在中断服务子程序中,CPU先使软件计数器减1,然后判断它是否为零。为零表示1秒已到可以返回到输出时间显示程序。

       5.2.4相应程序代码

       (1)主程序

       定时器需定时毫秒,故T0工作于方式1。 初值:

       TC=M-T/ T计数 = -ms/1us==3CBOH

       ORG H

       START: MOV TMOD,功夫设计源码代码 #H ; 令TO为定时器方式1

       MOV TH0, #3CH ;装入定时器初值

       MOV TL0, #BOH ;

       MOV IE, #H ;开T0中断

       SEBT TRO ;启动T0计数器

       MOV RO, #H ;软件计数器赋初值

       LOOP: SJMP $ ;等待中断

       (2)中断服务子程序

       ORG BH

       AJMP BRT0

       ORG BH

       BRTO:DJNZ R0,NEXT

       AJMP TIME ; 跳转到时间及信号灯显示子程序

       DJNZ:MOV RO,#H ;恢复R0值

       MOV TH0, #3CH ;重装入定时器初值

       MOV TL0, #BOH ;

       MOV IE, #H

       RET1

       END

       5.3 软件延时

       MCS-的工作频率为2-MHZ,我们选用的单片机的工作频率为6MHZ。机器周期与主频有关,机器周期是主频的倍,所以一个机器周期的时间为*(1/6M)=2us。我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定1秒的时间。

       具体的延时程序分析:

       DELAY:MOV R4,#H 延时1秒子程序

       DE2:LCALL DELAY1

       DJNZ R4,DE2

       RET

       DELAY1:MOV R6,#0 延时ms 子程序

       MOV R5,#0

       DE1: DJNZ R5,$

       DJNZ R6,DE1

       RET

       MOV RN,#DATA 字节数数为2 机器周期数为1

       所以此指令的执行时间为2ms

       DELAY1 为一个双重循坏 循环次数为*= 所以延时时间=*2=us 约为us

       DELAY R4设置的初值为8 主延时程序循环8次,所以us*8= 1秒

       由于单片机的运行速度很快其他的指令执行时间可以忽略不计。

       5.4 时间及信号灯的显示

       5.4.1 并行口的扩展

       虽然有4个8位I/O端口,但真正能提供借用的只有P1口,因为P2和P0口通常用于传送外部传送地址和数据,P3口也有它的第二功能。因此, 通常需要扩展。由于我们用外部输入设定红绿灯倒计时初值、数码管的输出显示、红绿黄信号灯的显示都要用到一个I/O端口,显然的端口是不够,需要扩展。

       扩展的方法有两种:(1)借用外部RAM地址来扩展I/O端口;(2)采用I/O接口新片来扩充。我们用并行接口信片来扩展I/O端口。

       5.4.2显示原理:

       当定时器定时为1秒,时程序跳转到时间显示及信号灯显示子程序,它将依次显示信号灯时间 ,同时一直显示信号灯的颜色,这时在返回定时子程序定时一秒,在显示黄灯的下一个时间,这样依次把所有的灯色的时间显示完后在重新给时间计数器赋初值 ,重新进入循环。

       5.4.3 PA口输出信号接信号灯:

       由于发光二极管为共阳极接法,输出端口为低电平,对应的二极管发光,所以可以用置位方法点亮红,绿,黄发光二极管。

       5.4.4 输出信号与数码管的连接:

       LED 灯的显示原理:通过同名管脚上所加电平的高低来控制发光二极管是否点量而显示不同的字形如 SP,g,f,e,d,c,b,a 管角上加上7FH所以 SP上为0伏,不亮其余为TTL高电平,全亮则显示为8

       采用共阴级连接:

       其中 PC0\PB0-a,

       PC1\PB1-b,

       PC2\PB2-c,

       PC3\PB3-d,

       PC4\PB4-e,

       PC5\PB5-f,

       PC6\PB6-g

       PC7\PB7 -SP接地

       显示数值 dop g f e d c b a 驱动代码(进制)

       0 0 0 1 1 1 1 1 1 3FH

       1 0 0 0 0 0 1 1 0 H

       2 0 1 0 1 1 0 1 1 5BH

       3 0 1 0 0 1 1 1 1 4FH

       4 0 1 1 0 0 1 1 0 H

       5 0 1 1 0 1 1 0 0 6DH

       6 0 1 1 1 1 1 0 0 7DH

       7 0 0 0 0 0 1 1 1 H

       8 0 1 1 1 1 1 1 1 7FH

       表 3 驱动代码表

       5.4.5 与的连接:

       用的P0 口的 p0.7 连接的片选信号cs 我们用的地址采用全译码方式,当p0.7 =0 时片选有效, 其他无效, p0.1 p0.1 用于选择端口

       P0.7 p0.6 p0.5 p0.4 p0.3 p0.2 P0.1 P0.0

       A7 A6 A5 A4 A3 A2 A1 A0

       1 X X X X X 0 0 H为 的PA口

       1 X X X X X 0 1 H 为的PB口

       1 X X X X X 1 0 H 为的PC口

       1 X X X X X 1 1 H 为的控制口

       由于是分时对和储存器进行访问所以的P0口不会发生冲突

       5.5 程序设计

       5.5.1流程图如图所示

       图8

       图9 程序流程图

       5.5.2 程序源代码

       ORG H ;主程序的入口地址

       LJMP MAIN ;跳转到主程序的开始处

       ORG H ;外部中断0的中断程序入口地址

       ORG BH ;定时器0的中断程序入口地址

       LJMP T0_INT ;跳转到中断服务程序处

       ORG H ;外部中断1的中断程序入口地址

       MAIN : MOV SP,#H

       MOV IE,#8EH ;CPU开中断,允许T0中断,T1中断和外部中断1中断

       MOV TMOD,#H ;设置T1为计数方式,T0为定时方式,且都工作于模式1

       MOV TH1,#H ;T1计数器清零

       MOV TL1,#H

       SETB TR1 ;启动T1计时器

       SETB EX1 ;允许INT1中断

       SETB IT1 ;选择边沿触发方式

       MOV DPTR ,#H

       MOV A, #H ;给赋初值,工作于方式0

       MOVX @DPTR, A

       AGAIN: JB P3.1,N0 ;判断是否要设定东西方向红绿灯时间的初值,若P3.1为1 则跳转

       MOV A,P1

       JB P1.7,RED ;判断P1.7是否为1,若为1则设定红灯时间,否则设定绿灯时间

       MOV R0,#H ;R0清零

       MOV R0,A ;存入东西方向绿灯初始时间

       MOV R3,A

       LCALL DISP1

       LCALL DELAY

       AJMP AGAIN

       RED: MOV A,P1

       ANL A,#7FH ;P1.7置0

       MOV R7,#H ;R7清零

       MOV R7,A ;存入东西方向红灯初始时间

       MOV R3,A

       LCALL DISP1

       LCALL DELAY

       AJMP AGAIN

       ;-------------------------------------------

       N0: SETB TR0 ;启动T0计时器

       MOV H,R7 ;红灯时间存入H

       N: MOV A,H ;东西方向禁止,南北方向通行

       MOV R3,A

       MOV DPTR,#H ;置A口,东西方向红灯亮,南北方向绿灯亮

       MOV A,#0DDH

       MOVX @DPTR, A

       N: JB P2.0,B0

       N: SETB P3.0

       CJNE R3,#H,N ;比较R3中的值是否为0,不为0转到当前指令处执行

       ;------黄灯闪烁5秒程序------

       N1: SETB P3.0

       MOV R3,#H

       MOV DPTR,#H ;置A口,东西,南北方向黄灯亮

       MOV A,#0D4H

       MOVX @DPTR,A

       N: MOV R4,#H

       N: CJNE R4,#7DH,$ ;黄灯持续亮0.5秒

       N: MOV DPTR,#H ; 置A口,南北方向黄灯灭

       MOV A,#0DDH

       MOVX @DPTR,A

       N: MOV R4,#H

       CJNE R4,#7DH,$ ;黄灯持续灭0.5秒

       CJNE R3,#H,N1 ;闪烁时间达5秒则退出

       ;------------------------------------------------------------

       N2: MOV R7,#H

       MOV A,R0 ;东西通行,南北禁止

       MOV R3,A

       MOV DPTR,#H ; 置A口,东西方向绿灯亮,南北方向红灯亮

       MOV A,#0EBH

       MOVX @DPTR,A

       N: JB P2.0,T

       N: CJNE R3,#H,N

       ;------黄灯闪烁5秒程序------

       N3: MOV R3,#H

       MOV DPTR,#H ;置A口,东西,南北方向黄灯亮

       MOV A,#0E2H

       MOVX @DPTR,A

       N: MOV R4,#H

       CJNE R4,#7DH,$ ;黄灯持续亮0.5秒

       N: MOV DPTR,#H ; 置A口,南北方向黄灯灭

       MOV A,#0EBH

       MOVX @DPTR,A

       N: MOV R4,#H

       CJNE R4,#7DH,$ ;黄灯持续灭0.5秒

       CJNE R3,#H,N3 ;闪烁时间达5秒则退出

       SJMP N

       ;------闯红灯报警程序------

       B0: MOV R2,#H ;报警持续时间3秒

       B: MOV A,R3

       JZ N1 ;若倒计时完毕,不再报警

       CLR P3.0 ;报警

       CJNE R2,#H,B ;判断3秒是否结束

       SJMP N

       ;------1秒延时子程序-------

       N7: RETI

       T0_INT:MOV TL0,#9AH ;给定时器T0送定时ms的初值

       MOV TH0,#0F1H

       INC R4

       INC R5

       CJNE R5,#0FAH,T ;判断延时是否够一秒,不够则调用显示子程序

       MOV R5,#H ;R5清零

       DEC R3 ;倒计时初值减一

       DEC R2 ;报警初值减一

       T: ACALL DISP ;调用显示子程序

       RETI ;中断返回

       ;------显示子程序------

       DISP: JNB P2.4,T

       DISP1: MOV B,#0AH

       MOV A,R3 ;R3中值二转十显示转换

       DIV AB

       MOV H,A

       MOV 7AH,B

       DIS: MOV A,H ;显示十位

       MOV DPTR,#TAB

       MOVC A,@A+DPTR

       MOV DPTR,#H

       MOVX @DPTR,A

       MOV DPTR,#H

       MOV A,#0F7H

       MOVX @DPTR,A

       LCALL DELAY

       DS2: MOV A,7AH ;显示个位

       MOV DPTR,#TAB

       MOVC A,@A+DPTR

       MOV DPTR,#H

       MOVX @DPTR,A

       MOV DPTR,#H

       MOV A,#0FBH

       MOVX @DPTR,A

       RET

       ;------东西方向车流量检测程序------

       T: MOV A,R3

       SUBB A,#H ;若绿灯倒计时完毕,不再检测车流量

       JZ N3

       JB P2.0,T

       INC R7

       CJNE R7,#H,E1

       MOV R7,#H ;中断到次则清零

       E1: SJMP N

       ;------东西方向车流量显示程序------

       T: MOV B,#0AH

       MOV A,R7 ;R7中值二转十显示转换

       DIV AB

       MOV H,A

       MOV 7AH,B

       DIS3: MOV A,H ;显示十位

       MOV DPTR,#TAB

       MOVC A,@A+DPTR

       MOV DPTR,#H

       MOVX @DPTR,A

       MOV DPTR,#H

       MOV A,#0F7H

       MOVX @DPTR,A

       LCALL DELAY

       DS4: MOV A,7AH ;显示个位

       MOV DPTR,#TAB

       MOVC A,@A+DPTR

       MOV DPTR,#H

       MOVX @DPTR,A

       MOV DPTR,#H

       MOV A,#0FBH

       MOVX @DPTR,A

       LJMP N7

       ;------延时4MS子程序----------

       DELAY: MOV R1,#0AH

       LOOP: MOV R6,#H

       NOP

       LOOP1: DJNZ R6,LOOP1

       DJNZ R1,LOOP

       RET

       ;------字符表------

       TAB: DB 3FH,H,5BH,4FH,H,6DH,7DH,H,7FH,6FH

       END

什么是PSOS

       pSOS系统结构

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

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

       1. 内核层

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

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

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

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

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

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

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

       PHILE+等。

       2. 系统服务层

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

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

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

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

       编写应用程序。

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

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

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

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

       的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~级优先级,0级最低,级最高。0级

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

       可以通过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反过来赋予该对象一个唯一的位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为中断禁止时间

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