车辆前照灯控制系统实验_第1页
车辆前照灯控制系统实验_第2页
车辆前照灯控制系统实验_第3页
车辆前照灯控制系统实验_第4页
车辆前照灯控制系统实验_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.一、实验目的1)利用实验平台,模拟车辆照明控制系统工作2)学习嵌入式系统的裁剪与定制3)熟悉AD转换器,键盘等设备的操作4)熟悉基于消息循环的事件处理机制5)理解操作系统对于嵌入式系统的意义二、本课题选题背景及国内外研究动态(一)选题背景20世纪90年代中期以后,LED作为汽车尾灯已经被人们广泛接受。近年来,随着LED亮度的逐渐增加,2003年高亮度LuxeonTM的市场投放,使LED开始在汽车前照灯领域崭露头角,它以体积小、寿命长、环保、聚焦距离短等优势受到人们普遍的关注和青睐。然而,氙气和LED前照灯技术只能工作在一种模式下,即一种固定的类型下。但是,实际道路使用状况、环境状况、气候状况

2、等情况非常复杂。数据分析显示,在夜间发生车祸的数量是白天车祸数量的两倍,为了在夜间或者是恶劣天气下能达到更好的视觉效果,要求前照灯光线随着不同的驾驶环境而改变。这就需要设计一种灵活的前照灯系统。传统的前照灯系统是由:近光灯、远光灯、行驶灯和前雾灯组合而成。在城市道路行驶并且限速的情况下,主要采用近光;在乡间道路或者高速公路上高速行驶的时候,主要采用远光;雾天行驶的时候,应该打开雾灯;白天行驶,应该打开行驶灯(欧洲标准)。但是实际的使用中,传统的前照灯系统存在着诸多问题。例如,现有近光灯在近距离上的照明效果很不好,特别是在交通状况比较复杂的市区,经常会有很多司机在晚上将近光灯、远光灯和前雾灯统统

3、打开;车辆在转弯的时候也存在照明的暗区,严重影响了司机对弯道上障碍的判断;车辆在雨天行驶的时候,地面积水反射前灯的光线,产生反射眩光等等。欧洲汽车照明研究机构曾经就此作过做专项调查,结果显示,欧洲司机们最希望改善的是阴雨天气积水路面的照明,排在第二位的是乡村公路的照明,接下来依次是弯道照明、高速公路照明和市区照明。上述这些问题的存在,就使得研制一种具有多种照明功能的前照灯成为必要,并且这些功能的切换,出于安全上的考虑,必须是自动实现的。所以欧洲和日本相继研制了这种自动适应车辆行驶状态的前照灯系统AFS(自适应前照灯系统)。(二)国内外研究现状目前,在汽车前照灯的标准方面有欧洲标准和美国标准,两

4、者主要在近光配光上有较大的差别。欧洲标准特别注重对眩光的控制,因此在其配光上存在15的截止线,并且照度也比较低。在美国,道路大多比较宽阔,因此对眩光没什么特别的要求,只要前照灯能够照得更远更亮就可以了。随着经济全球化进程的加快,人们迫切要求消除这2种标准之间的差别,建立一个统一的国际标准。一种方法是将两种标准中合理的部分综合起来形成一个双方都能接受的标准;另外一种方法是建立一个包括多种功能的前照灯系统,它能根据不同的路况、天气而采用不同的照明方式,这就是AFS系统。对于AFS前照灯系统的研究在国外已经取得了很大进展,日趋成熟。日本、欧洲等国的知名汽车制造商都纷纷推出自己的AFS,在高档轿车中标

5、配AFS的同时,将其在中档甚至中低档轿车车型中作为选配列出。比如奥迪A8,宝马5系,梅塞德斯CLS、E系、M系,大众B6,雷克萨斯RX330,丰田皇冠等等。在国外,AFS已经得到广泛应用,而国内在这方面的研究还比较少。引进的AFS大多考虑生产商本国道路状况,而国内的道路状况与日本和欧洲有较大不同,因此AFS并不能发挥最大的作用,对AFS在国内的应用带来了阻力。国内上海小糸公司已经对天津丰田锐志AFS前照灯完成了国产化开发工作,用于新款丰田佳美AFS前照灯系统业已完成,但其主要是以技术引进为主。(三)AFS系统综述1、AFS系统组成动态照明系统这一概念是20世纪90年代初提出的,经过10多年的发

6、展,智能化自适应前照灯照明系统AFS正式亮相。该系统可以根据汽车行驶的速度、偏离速率以及转向角等表示汽车运动状态的参量来计算照明的方式。随着2003年静态转弯照明系统在欧洲汽车市场上的投放,2004开始尝试引入动态转弯照明系统,并很快受到欢迎和推广。这种系统尤其在城镇、乡村、高速公路等不同复杂路况条件下以及恶劣天气中的应用,将有益于驾驶安全性的提高。AFS系统是由传感器组、传输通路、电控单元和执行机构组成。由于需要对多种车辆行驶状态做出综合判断,因此AFS系统是一个多输入多输出的复杂的系统。其主要部分包括:(1)前照灯卤素车灯、HID灯或LED灯等。(2)传感器包括角度传感器和速度传感等。随着

7、速度和方向盘角度的改变,车身高度和倾斜度也会随之改变,传感器将这些参数的变化通过CAN(controller area network)总线传输给电控单元(ECU),电子控制单元收集所有传感器传来的数据控制执行电机,在理论上给出最合理的光分布,用来改善灯光照明。(3)雾探测器该探测器能应用在恶劣天气尤其是浓雾条件下,给出真实的实际可视距离。自动雾探测器可根据雾浓度大小给出正确的判断,并调整照明方式,以适应恶劣天气,提高雾天驾驶的安全性。(4)夜间可视系统作为一个独立的可视增强系统,该系统主要分为远红外线和近红外线两种特性,这两种都能应用在支持夜间可视的前照灯系统中。作为一个综合系统,可视光源和

8、红外线的综合应用能够识别障碍物、步行者和其他物品。2、AFS系统功能(1)阴雨天气的照明:阴雨天气,地面的积水会将行驶车辆打在地面上的光线,反射至对面会车司机的眼睛中,使其目眩,进而可能造成交通事故。AFS有效的解决方法是:前灯发出特殊光型,减弱地面可能对会车产生眩光的区域的光强。(2)转弯道路的照明:传统前灯的光线因为和车辆行驶方向保持着一致,所以不可避免的存在照明的暗区。一旦在弯道上存在障碍物,极易因为司机对其准备不足,引发交通事故。AFS解决的方法是:车辆在进入弯道时,产生旋转的光型,给弯道以足够的照明。(3)高速公路的照明:车辆在高速公路上行驶,因为具有极高的车速,所以需要前照灯比乡村

9、道路照得更远,照得更宽。而传统的前灯却存在着高速公路上照明不足的问题,如图5所示。AFS采用了更为宽广的光型解决这一问题。(4)城市道路的照明:城市中道路复杂、狭窄。传统前照灯近光如图7所示,因为光型比较狭长,所以不能满足城市道路照明的要求。AFS在考虑到车辆市区行驶速度受到限制的情况下,可以产生比较宽阔的光型,有效地避免了与岔路中突然出现的行人、车辆可能发生的交通事故。3、举例:雷克萨斯自适应照明系统(AFS)夜间行驶时,装备自适应照明系统的LEXUS雷克萨斯使驾驶员在转弯时拥有良好视野。感应器将监控车速和前轮转向角度,以估计驾驶员三秒后的位置,同时令前大灯照向此处。左、右前大灯可依据转弯角

10、度进行不同程度的旋转,一个可旋转5度,另一个可旋转15度。当驶近弯道时,车灯将紧随前方道路走向,而绝非简单照亮道路边缘。自适应照明系统有助于缓解夜间行车疲劳,尤其在不熟悉的连续弯路当中行驶时。三、需求分析一款AFS车辆前照灯系统需要提供以下服务:1、三种车灯照明基本状态:近光宽照明,远光照明,转弯死角照明;2、具备车速传感器和天气状况传感器;3、将速度划分为三档,由低到高分别为城市速度,乡村速度和高速公路速度;4、城市照明时,采用近光灯照明;5、乡村速度时,采用限制左侧照明,即此时右侧同时使用远光灯和近光灯,而左侧使用近光灯;6、高速路速度时,同时使用远光灯和近光灯照明;7、通过传感器识别雾天

11、,自动打开雾灯功能,并且,雾灯不影响其他灯的使用;8、转向时,自动触发转向照明灯,将所转向的区域中的死角照亮,转向结束,关闭转向灯;9、为应付紧急情况,所有的灯均可通过键盘手动控制;10、出于安全性的考虑,车灯的变化需要在尽量短的时间内完成,以尽可能的提高驾驶员的客观的可视范围。四、实验的基本内容(一)AFS系统模型抽象与资源模拟1、系统中具备多种传感器,并且可以周期性采样各传感器数据,综合处理 2、 车灯作为系统的输出设备,通过其组合表达系统的处理结果 3 模块之间独立性较强,需要有软开关可以屏蔽模块。 针对实验室内的条件,结合实验平台中的资源,对车辆前照灯控制系统中的设备作如下模拟: 1、

12、用8个LED分别模拟各组车灯,对8个LED编号分别为1至8,1号和8号模拟侧光灯,2号和7号模拟雾灯,3号和6号模拟外侧远光灯,4号和5号模拟近光灯。示意图如下:LED1LED2LED3LED4LED5LED6LED7LED8左侧灯雾灯左远光灯左近光灯右近光灯右远光灯雾灯右侧灯 2、AD转换器0模拟方向盘,居中为正向行驶 3、AD转化器1模拟车速传感器 4、键盘模拟驾驶员车内控制按钮。1号键和3号键为左右侧的近光灯,4号键和6号键为左右侧的远光灯,7号键和9号键为左右侧光灯,5控制雾灯。NumLock键用于手动控制和自动控制的切换。 5、AD转换器2模拟空气中雾气数据采样。(二)环节实验准备

13、根据上述分析,实验准备阶段需要熟悉的环节实验有:1、 AD转换器实验主要目的是知道编程实现 A/D功能的主要方法。 AD转换器实验是系统中有关AD转换器的基础模块实现的基础。 1) 新建工程,将Exp5中的文件添加到工程。2)编写获取转换结果函数( main.c) 3) 主函数(main.c)2、 键盘和LED实验 目的是学习键盘及LED驱动原理,掌握键盘及LED驱动芯片的使用方法。键盘和LED实验是系统中键盘和LED两个基础模块实现的基础。1) 新建工程,将Exp3中的文件添加到工程。2) 2)定义zlg7289寄存器(zlg7289.h) #define ZLG7289_CS (0x20)

14、 /GPB5 #define ZLG7289_KEY (0x10) /GPG4 #define ZLG7289_ENABLE() doZlg7289SIOBand=rSBRDR; Zlg7289SIOCtrl=rSIOCON; rSIOCON=0x31; rSBRDR=0xff; rPDATB&=(ZLG7289_CS);while(0) #define ZLG7289_DISABLE() dorPDATB|=ZLG7289_CS;rSBRDR=Zlg7289SIOBand;rSIOCON=Zlg7289SIOCtrl;while(0)3)编写zlg7289驱动函数(zlg7289.c) 4)

15、定义键盘映射表:(Keyboard16.c)unsigned char KeyBoard_Map=4,8,11,0,0,0,0,0,5,9,12,15,1,0,0,0,6,10,13,16,2,3,0,0,7,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; /64,键值映射表。通过查找键盘映射表来确定键盘扫描码对应的按键值。 5)定义键盘读取函数:(Keyboard16.c)6) 编写主函数,将按键值在数码管上显示。3、 消息循环实验目的是学习使用系统的消息循环。掌握如何通过系统的消

16、息循环来响应键盘的消息,同时学会使用图形模式下的液晶屏文字显示函数。最终实现按不同的键,在屏幕上显示不同的文字;同时,把键盘的按键号码输出到 PC机的终端显示。消息循环实验部分是本系统的一个核心部分,是各个模块之间的一个通信纽带。 1、新建工程,将 Exp1中的文件加入工程。 2、打开 Main.c文件,仔细阅读 Key_Scan_Task函数系统的键盘扫描函数。理解系统中 Main_Task任务消息队列的创建和发送的过程。3、在 Main_Task任务中加入代码,实现消息循环。即:等待消息、处理(响应)消息、删除消息。 使用 WaitMessage接收消息,通常等待时间设置为无限长。 如图

17、4-1所示,系统的消息循环是一个无限循环。 系统的消息结构定义如下:typedef struct POS_Ctrl pOSCtrl; /消息所发到的窗口(控件) U32 Message; U32 WParam; U32 LParam;OSMSG, *POSMSG;收到消息以后(即, WaitMessage函数返回),通过判断消息结构中 Message的成员来判断消息类型。如果是键盘消息,则 Message的值为 OSM_KEY,Wparam参数存储的是按键的号码,LParam参数存储的是同时系统按下的功能键(如果没有,则为 0)。 开始等待下一条消息之前必须使用 DeleteMessage删除

18、消息,释放系统的内存空间。 4、编写键盘消息响应函数,处理键盘的消息。当有键盘消息收到的时候,把按键号码显示在液晶屏上,同时,发送给 PC机的终端。4、 操作系统移植实验目的是掌握和理解UC/OS-II内核的主要结构及UC/OS-II内核移植到 ARM7处理器上的基本方法。操作系统移植实验部分是系统中最核心的部分,控制、调度着其他模块正常、协调地运行。实验主要的内容(1)、该实验的文件分为两类,其一是 STARTUP目录下的系统初始化、配置等文件,其二是C/OS-的全部源码,arch目录下的 3个文件是和处理器架构相关的。(2)设置 os_cpu.h中与处理器和编译器相关的代码 typedef

19、 unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; typedef unsigned int INT16U; typedef signed int INT16S; typedef unsigned long INT32U; typedef signed long INT32S; typedef float FP32; typedef double FP64; typedef unsigned int OS_STK; typedef unsigned int OS_CPU_SR; exte

20、rn int INTS_OFF(void); extern void INTS_ON(void); #define OS_ENTER_CRITICAL() cpu_sr = INTS_OFF(); #define OS_EXIT_CRITICAL() if(cpu_sr = 0) INTS_ON(); #define OS_STK_GROWTH 11)与编译器相关的数据类型因为不同的微处理器有不同的字长,所以 C/OS-的移植包括了一系列的类型定义以确保其可移植性。尤其是C/OS-代码从不使用 C的 short,int和 long等数据类型,因为它们是与编译器相关的,不可移植。相反的,我们定义

21、的整形数据结构既是可移植的又是直观的。为了方便,虽然C/OS-不使用浮点数据,但我们还是定义了浮点数据类型。例如,INT16U数据类型总是代表 16位的无符号整数。现在, C/OS-和用户的应用程序就可以估计出声明为该数据类型的变量的取值范围是 065535。将C/OS-移植到 32位的处理器上也就意味着 INT16U实际被声明为无符号短整形数据结构而不是无符号整数数据结构。但是,C/OS-所处理的仍然是 INT16U。用户必须将任务堆栈的数据类型告诉给C/OS-。这个过程是通过为 OS_STK声明正确的 C数据类型来完成的。我们的处理器上的堆栈成员是 16位的,所以将 OS_TSK声明为无符

22、号整形数据类型。所有的任务堆栈都必须用 OS_TSK声明数据类型。2)OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()与所有的实时内核一样,C/OS-需要先禁止中断再访问代码的临界区,并且在访问完毕后重新允许中断。这就使得 C/OS-能够保护临界区代码免受多任务或中断服务例程(ISR)的破坏。在 S3C44B0X上是通过两个函数( OS_CPU_A.S)实现开关中断的。INTS_OFFmrsr0, cpsr; 当前 CSRmovr1, r0; 复制屏蔽orrr1, r1, #0xC0; 屏蔽中断位msrCPSR, r1; 关中断(IRQ and FIQ)andr0

23、, r0, #0x80; 从初始 CSR返回 FIQ位movpc,lr; 返回INTS_ON mrs r0, cpsr; 当前 CSRbicr0, r0, #0xC0; 屏蔽中断msrCPSR, r0; 开中断 (IRQ and FIQ)movpc,lr; 返回3)OS_STK_GROWTH绝大多数的微处理器和微控制器的堆栈是从上往下长的。但是某些处理器是用另外一种方式工作的。C/OS-被设计成两种情况都可以处理,只要在结构常量 OS_STK_GROWTH中指定堆栈的生长方式就可以了。置 OS_STK_GROWTH为 0表示堆栈从下往上长。置 OS_STK_GROWTH为 1表示堆栈从上往下长

24、。(3)用 C语言编写 6个操作系统相关的函数(OS_CPU_C.C)1)OSTaskStkInitOSTaskCreate()和 OSTaskCreateExt()通过调用 OSTaskStkInit()来初始化任务的堆栈结构。因此,堆栈看起来就像刚发生过中断并将所有的寄存器保存到堆栈中的情形一样。图 12-2显示了 OSTaskStkInt()放到正被建立的任务堆栈中的东西。这里我们定义了堆栈是从上往下长的。在用户建立任务的时候,用户传递任务的地址, pdata指针,任务的堆栈栈顶和任务的优先级给 OSTaskCreate()和 OSTaskCreateExt()。一旦用户初始化了堆栈,O

25、STaskStkInit()就需要返回堆栈指针所指的地址。 OSTaskCreate()和 OSTaskCreateExt()会获得该地址并将它保存到任务控制块(OS_TCB)中。OS_STK * OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) unsigned int * stk; stk = (unsigned int *)ptos; /* 装载堆栈指针 */ opt+;/*为新任务建立堆栈 */ *-stk = (unsigned int) task; /* pc */ *-stk

26、 = (unsigned int) task; /* lr */ *-stk = 12; /* r12 */ *-stk = 11; /* r11 */ *-stk = 10; /* r10 */ *-stk = 9; /* r9 */ *-stk = 8; /* r8 */ *-stk = 7; /* r7 */ *-stk = 6; /* r6 */ *-stk = 5; /* r5 */ *-stk = 4; /* r4 */ *-stk = 3; /* r3 */ *-stk = 2; /* r2 */ *-stk = 1; /* r1 */ *-stk = (unsigned int

27、) pdata; /* r0 */ *-stk = (SUPMODE); /* cpsr */ *-stk = (SUPMODE); /* spsr */return (OS_STK *)stk); 2)OSTaskCreateHook当用 OSTaskCreate()和 OSTaskCreateExt()建立任务的时候就会调用 OSTaskCreateHook()。该函数允许用户或使用移植实例的用户扩展 C/OS-功能。当 C/OS-设置完了自己的内部结构后,会在调用任务调度程序之前调用 OSTaskCreateHook()。该函数被调用的时候中断是禁止的。因此用户应尽量减少该函数中的代码以

28、缩短中断的响应时间。当 OSTaskCreateHook()被调用的时候,它会收到指向已建立任务的 OS_TCB的指针,这样它就可以访问所有的结构成员了。函数原型:void OSTaskCreateHook (OS_TCB *ptcb)3)OSTaskDelHook当任务被删除的时候就会调用 OSTaskDelHook()。该函数在把任务从 C/OS-的内部任务链表中解开之前被调用。当 OSTaskDelHook()被调用的时候,它会收到指向正被删除任务的 OS_TCB的指针,这样它就可以访问所有的结构成员了。 OSTaskDelHook()可以来检验 TCB扩展是否被建立(一个非空指针)并进

29、行一些清除操作。函数原型:void OSTaskDelHook (OS_TCB *ptcb)4.)OSTaskSwHook当发生任务切换的时候就会调用 OSTaskSwHook()。OSTaskSwHook()可以直接访问 OSTCBCur和 OSTCBHighRdy,因为它们是全局变量。OSTCBCur指向被切换出去的任务 OS_TCB,而 OSTCBHighRdy指向新任务 OS_TCB。注意在调用 OSTaskSwHook()期间中断一直是被禁止的。因此用户应尽量减少该函数中的代码以缩短中断的响应时间。函数原型:void OSTaskSwHook (void)5)OSTaskStatHo

30、okOSTaskStatHook()每秒钟都会被 OSTaskStat()调用一次。用户可以用 OSTaskStatHook()来扩展统计功能。例如,用户可以保持并显示每个任务的执行时间,每个任务所用的 CPU份额,以及每个任务执行的频率等。函数原型:void OSTaskStatHook (void)6)OSTimeTickHook OSTimeTickHook()在每个时钟节拍都会被 OSTaskTick()调用。实际上,OSTimeTickHook()是在节拍被C/OS-真正处理,并通知用户的移植实例或应用程序之前被调用的。函数原型:void OSTimeTickHook (void)后

31、 5个函数为钩子函数,可以不加代码。只有当 OS_CFG.H中的 OS_CPU_HOOKS_EN被置为 1时才会产生这些函数的代码。(4)用汇编语言编写 4个与处理器相关的函数(OS_CPU.ASM)1)OSStartHighRdy ();运行优先级最高的就绪任务OSStartHighRdy LDR r4, addr_OSTCBCur ; 得到当前任务 TCB地址 LDR r5, addr_OSTCBHighRdy ; 得到昀高优先级任务 TCB地址LDR r5, r5 ; 获得堆栈指针 LDR sp, r5 ; 转移到新的堆栈中STR r5, r4 ; 设置新的当前任务 TCB地址LDMFD

32、 sp!, r4 ; MSR SPSR, r4 ;LDMFD sp!, r4 ; 从栈顶获得新的状态MSR CPSR, r4 ; CPSR 处于 SVC32Mode模式 LDMFD sp!, r0-r12, lr, pc ; 运行新的任务2)OS_TASK_SW ();任务级的任务切换函数OS_TASK_SWSTMFDsp!, lr; 保存 pcSTMFDsp!, lr; 保存 lrSTMFDsp!, r0-r12; 保存寄存器和返回地址 MRS r4, CPSR STMFD sp!, r4 ; 保存当前的 PSRMRS r4, SPSR STMFD sp!, r4 ; 保存 SPSR; OS

33、PrioCur = OSPrioHighRdy LDR r4, addr_OSPrioCur LDR r5, addr_OSPrioHighRdy LDRB r6, r5 STRB r6, r4; 得到当前任务 TCB地址 LDR r4, addr_OSTCBCur LDR r5, r4 STR sp, r5 ; 保存 sp在被占先的任务的 TCB; 得到最高优先级任务 TCB地址 LDR r6, addr_OSTCBHighRdy LDR r6, r6 LDR sp, r6 ; 得到新任务堆栈指针; OSTCBCur = OSTCBHighRdy STR r6, r4 ; 设置新的当前任务的

34、 TCB地址;保存任务方式寄存器 LDMFD sp!, r4 MSR SPSR, r4 LDMFD sp!, r4 MSR CPSR, r4;返回到新任务的上下文 LDMFD sp!, r0-r12, lr, pc3)OSIntCtxSw() ;中断级的任务切换函数 OSIntCtxSw add r7, sp, #16 ; 保存寄存器指针 LDR sp, =IRQStack ;FIQ_STACK mrsr1, SPSR; 得到暂停的 PSR orrr1, r1, #0xC0; 关闭 IRQ, FIQ. msrCPSR_cxsf, r1; 转换模式 (应该是 SVC_MODE) ldrr0, r

35、7, #52 ; 从 IRQ堆栈中得到 IRQs LR (任务 PC) subr0, r0, #4; 当前 PC地址是(saved_LR - 4) STMFDsp!, r0; 保存任务 PC STMFDsp!, lr; 保存 LR mov lr, r7 ; 保存 FIQ 堆栈 ptr in LR (转到 nuke r7) ldmfd lr!, r0-r12 ; 从 FIQ堆栈中得到保存的寄存器 STMFD sp!, r0-r12 ;在任务堆栈中保存寄存器;在任务堆栈上保存 PSR 和任务 PSR MRS r4, CPSR bic r4, r4, #0xC0 ; 使中断位处于使能态 STMFD

36、sp!, r4 ; 保存任务当前 PSR MRS r4, SPSR STMFD sp!, r4 ; SPSR ; OSPrioCur = OSPrioHighRdy / 改变当前程序 LDR r4, addr_OSPrioCur LDR r5, addr_OSPrioHighRdy LDRB r6, r5 STRB r6, r4 ; 得到被占先的任务 TCB LDR r4, addr_OSTCBCur LDR r5, r4 STR sp, r5 ; 保存 sp 在被占先的任务的 TCB ; 得到新任务 TCB 地址 LDR r6, addr_OSTCBHighRdy LDR r6, r6 LDR sp, r6 ; 得到新任务堆栈指针 ; OSTCBCur = OSTCBHighRdy STR r6, r4 ; 设置新的当前任务的 TCB地址 LDMFD sp!

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论