资源描述
一、实验目
1)运用实验平台,模仿车辆照明控制系统工作
2)学习嵌入式系统裁剪与定制
3)熟悉AD转换器,键盘等设备操作
4)熟悉基于消息循环事件解决机制
5)理解操作系统对于嵌入式系统意义
二、本课题选题背景及国内外研究动态
(一)选题背景
20世纪90年代中期后来,LED作为汽车尾灯已经被人们广泛接受。近年来,随着LED亮度逐渐增长,高亮度LuxeonTM市场投放,使LED开始在汽车前照灯领域崭露头角,它以体积小、寿命长、环保、聚焦距离短等优势受到人们普遍关注和青睐。然而,氙气和LED前照灯技术只能工作在一种模式下,即一种固定类型下。但是,实际道路使用状况、环境状况、气候状况等状况非常复杂。数据分析显示,在夜间发生车祸数量是白天车祸数量两倍,为了在夜间或者是恶劣天气下能达到更好视觉效果,规定前照灯光线随着不同驾驶环境而变化。这就需要设计一种灵活前照灯系统。
老式前照灯系统是由:近光灯、远光灯、行驶灯和前雾灯组合而成。在都市道路行驶并且限速状况下,重要采用近光;在乡间道路或者高速公路上高速行驶时候,重要采用远光;雾天行驶时候,应当打开雾灯;白天行驶,应当打开行驶灯(欧洲原则)。但是实际使用中,老式前照灯系统存在着诸多问题。例如,既有近光灯在近距离上照明效果很不好,特别是在交通状况比较复杂市区,经常会有诸多司机在晚上将近光灯、远光灯和前雾灯统统打开;车辆在转弯时候也存在照明暗区,严重影响了司机对弯道上障碍判断;车辆在雨天行驶时候,地面积水反射前灯光线,产生反射眩光等等。
欧洲汽车照明研究机构曾经就此作过做专项调查,成果显示,欧洲司机们最但愿改进是阴雨天气积水路面照明,排在第二位是乡村公路照明,接下来依次是弯道照明、高速公路照明和市区照明。
上述这些问题存在,就使得研制一种具备各种照明功能前照灯成为必要,并且这些功能切换,出于安全上考虑,必要是自动实现。因此欧洲和日本相继研制了这种自动适应车辆行驶状态前照灯系统——AFS(自适应前照灯系统)。
(二)国内外研究现状
当前,在汽车前照灯原则方面有欧洲原则和美国原则,两者重要在近光配光上有较大差别。
欧洲原则特别注重对眩光控制,因而在其配光上存在15°截止线,并且照度也比较低。在美国,道路大多比较宽阔,因而对眩光没什么特别规定,只要前照灯可以照得更远更亮就可以了。随着经济全球化进程加快,人们迫切规定消除这2种原则之间差别,建立一种统一国际原则。一种办法是将两种原则中合理某些综合起来形成一种双方都能接受原则;此外一种办法是建立一种涉及各种功能前照灯系统,它能依照不同路况、天气而采用不同照明方式,这就是AFS系统。
对于AFS前照灯系统研究在国外已经获得了很大进展,日趋成熟。日本、欧洲等国知名汽车制造商都纷纷推出自己AFS,在高档轿车中标配AFS同步,将其在中档甚至中低档轿车车型中作为选配列出。例如奥迪A8,宝马5系,梅塞德斯CLS、E系、M系,大众B6,雷克萨斯RX330,丰田皇冠等等。
在国外,AFS已经得到广泛应用,而国内在这方面研究还比较少。引进AFS大多考虑生产商本国道路状况,而国内道路状况与日本和欧洲有较大不同,因而AFS并不能发挥最大作用,对AFS在国内应用带来了阻力。国内上海小糸公司已经对天津丰田锐志AFS前照灯完毕了国产化开发工作,用于新款丰田佳美AFS前照灯系统业已完毕,但其重要是以技术引进为主。
(三)AFS系统综述
1、AFS系统构成
动态照明系统这一概念是20世纪90年代初提出,通过10近年发展,智能化自适应前照灯照明系统AFS正式亮相。该系统可以依照汽车行驶速度、偏离速率以及转向角等表达汽车运动状态参量来计算照明方式。随着静态转弯照明系统在欧洲汽车市场上投放,开始尝试引入动态转弯照明系统,并不久受到欢迎和推广。这种系统特别在城乡、乡村、高速公路等不同复杂路况条件下以及恶劣天气中应用,将有益于驾驶安全性提高。
AFS系统是由传感器组、传播通路、电控单元和执行机构构成。由于需要对各种车辆行驶状态做出综合判断,因而AFS系统是一种多输入多输出复杂系统。其重要某些涉及:
(1)前照灯——卤素车灯、HID灯或LED灯等。
(2)传感器——涉及角度传感器和速度传感等。随着速度和方向盘角度变化,车身高度和倾斜度也会随之变化,传感器将这些参数变化通过CAN(controller area network)总线传播给电控单元(ECU),电子控制单元收集所有传感器传来数据控制执行电机,在理论上给出最合理光分布,用来改进灯光照明。
(3)雾探测器——该探测器能应用在恶劣天气特别是浓雾条件下,给出真实实际可视距离。自动雾探测器可依照雾浓度大小给出对的判断,并调节照明方式,以适应恶劣天气,提高雾天驾驶安全性。
(4)夜间可视系统——作为一种独立可视增强系统,该系统重要分为远红外线和近红外线两种特性,这两种都能应用在支持夜间可视前照灯系统中。作为一种综合系统,可视光源和红外线综合应用可以辨认障碍物、步行者和其她物品。
2、AFS系统功能
(1)阴雨天气照明:
阴雨天气,地面积水会将行驶车辆打在地面上光线,反射至对面会车司机眼睛中,使其目眩,进而也许导致交通事故。AFS有效解决办法是:前灯发出特殊光型,削弱地面也许对会车产生眩光区域光强。
(2)转弯道路照明:
老式前灯光线由于和车辆行驶方向保持着一致,因此不可避免存在照明暗区。一旦在弯道上存在障碍物,极易由于司机对其准备局限性,引起交通事故。AFS解决办法是:车辆在进入弯道时,产生旋转光型,给弯道以足够照明。
(3)高速公路照明:
车辆在高速公路上行驶,由于具备极高车速,因此需要前照灯比乡村道路照得更远,照得更宽。而老式前灯却存在着高速公路上照明局限性问题,如图5所示。AFS采用了更为辽阔光型解决这一问题。
(4)都市道路照明:
都市中道路复杂、狭窄。老式前照灯近光如图7所示,由于光型比较狭长,因此不能满足都市道路照明规定。AFS在考虑到车辆市区行驶速度受到限制状况下,可以产生比较宽阔光型,有效地避免了与岔路中突然浮现行人、车辆也许发生交通事故。
3、举例:雷克萨斯自适应照明系统(AFS)
夜间行驶时,装备自适应照明系统LEXUS雷克萨斯使驾驶员在转弯时拥有良好视野。感应器将监控车速和前轮转向角度,以预计驾驶员三秒后位置,同步令前大灯照向此处。左、右前大灯可根据转弯角度进行不同限度旋转,一种可旋转5度,另一种可旋转15度。
当驶近弯道时,车灯将紧随前方道路走向,而绝非简朴照亮道路边沿。自适应照明系统有助于缓和夜间行车疲劳,特别在不熟悉持续弯路当中行驶时。
三、需求分析
一款AFS车辆前照灯系统需要提供如下服务:
1、三种车灯照明基本状态:近光宽照明,远光照明,转弯死角照明;
2、具备车速传感器和天气状况传感器;
3、将速度划分为三档,由低到高分别为都市速度,乡村速度和高速公路速度;
4、都市照明时,采用近光灯照明;
5、乡村速度时,采用限制左侧照明,即此时右侧同步使用远光灯和近光灯,而左侧使用近光灯;
6、高速路速度时,同步使用远光灯和近光灯照明;
7、通过传感器辨认雾天,自动打开雾灯功能,并且,雾灯不影响其她灯使用;
8、转向时,自动触发转向照明灯,将所转向区域中死角照亮,转向结束,关闭转向灯;
9、为应付紧急状况,所有灯均可通过键盘手动控制;
10、出于安全性考虑,车灯变化需要在尽量短时间内完毕,以尽量提高驾驶员客观可视范畴。
四、实验基本内容
(一)AFS系统模型抽象与资源模仿
1、系统中具备各种传感器,并且可以周期性采样各传感器数据,综合解决
2、车灯作为系统输出设备,通过其组合表达系统解决成果
3. 模块之间独立性较强,需要有软开关可以屏蔽模块。
针对实验室内条件,结合实验平台中资源,对车辆前照灯控制系统中设备作如下模仿:
1、用8个LED分别模仿各组车灯,对8个LED编号分别为1至8,1号和8号模仿侧光灯,2号和7号模仿雾灯,3号和6号模仿外侧远光灯,4号和5号模仿近光灯。示意图如下:
LED1
LED2
LED3
LED4
LED5
LED6
LED7
LED8
左侧灯
雾灯
左远光灯
左近光灯
右近光灯
右远光灯
雾灯
右侧灯
2、AD转换器0模仿方向盘,居中为正向行驶
3、AD转化器1模仿车速传感器
4、键盘模仿驾驶员车内控制按钮。1号键和3号键为左右侧近光灯,4号键和6号键为左右侧远光灯,7号键和9号键为左右侧光灯,5控制雾灯。NumLock键用于手动控制和自动控制切换。
5、AD转换器2模仿空气中雾气数据采样。
(二)环节实验准备
依照上述分析,实验准备阶段需要熟悉环节实验有:
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) //GPB5
#define ZLG7289_KEY (0x10) //GPG4
#define ZLG7289_ENABLE()
do{Zlg7289SIOBand=rSBRDR;Zlg7289SIOCtrl=rSIOCON;rSIOCON=0x31;rSBRDR=0xff;rPDATB&=(~ZLG7289_CS);}while(0)
#define ZLG7289_DISABLE()
do{rPDATB|=ZLG7289_CS;rSBRDR=Zlg7289SIOBand;rSIOCON=Zlg7289SIOCtrl;}while(0)
3)编写zlg7289驱动函数(zlg7289.c)
4)定义键盘映射表:(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、 消息循环实验
目是学习使用系统消息循环。掌握如何通过系统消息循环来响应键盘消息,同步学会使用图形模式下液晶屏文字显示函数。最后实现按不同键,在屏幕上显示不同文字;同步,把键盘按键号码输出到 PC机终端显示。消息循环实验某些是本系统一种核心某些,是各个模块之间一种通信纽带。
1、新建工程,将 Exp1中文献加入工程。
2、打开 Main.c文献,仔细阅读 Key_Scan_Task函数——系统键盘扫描函数。理解系统中 Main_Task任务消息队列创立和发送过程。
3、在 Main_Task任务中加入代码,实现消息循环。即:等待消息、解决(响应)消息、删除消息。
⑴ 使用 WaitMessage接受消息,普通等待时间设立为无限长。
⑵ 如图 4-1所示,系统消息循环是一种无限循环。
⑶ 系统消息构造定义如下:
typedef struct {
POS_Ctrl pOSCtrl;//消息所发到窗口(控件)
U32 Message;
U32 WParam;
U32 LParam;
}OSMSG,*POSMSG;
收到消息后来(即, WaitMessage函数返回),通过判断消息构造中 Message成员来判断消息类型。如果是键盘消息,则 Message值为 OSM_KEY,Wparam参数存储是按键号码,LParam参数存储是同步系统按下功能键(如果没有,则为 0)。
⑷ 开始等待下一条消息之前必要使用 DeleteMessage删除消息,释放系统内存空间。 4、编写键盘消息响应函数,解决键盘消息。当有键盘消息收届时候,把按键号码显示在液晶屏上,同步,发送给 PC机终端。
4、 操作系统移植实验
目是掌握和理解UC/OS-II内核重要构造及UC/OS-II内核移植到 ARM7解决器上基本办法。操作系统移植实验某些是系统中最核心某些,控制、调度着其她模块正常、协调地运营。
实验重要内容
(1)、该实验文献分为两类,
其一是 STARTUP目录下系统初始化、配备等文献,其二是µC/OS-Ⅱ所有源码,arch目录下 3个文献是和解决器架构有关。
(2).设立 os_cpu.h中与解决器和编译器有关代码
typedef 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;
extern 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 1
1)与编译器有关数据类型
由于不同微解决器有不同字长,因此 µC/OS-Ⅱ移植涉及了一系列类型定义以保证其可移植性。特别是µC/OS-Ⅱ代码从不使用 C short,int和 long等数据类型,由于它们是与编译器有关,不可移植。相反,咱们定义整形数据构造既是可移植又是直观。为了以便,虽然µC/OS-Ⅱ不使用浮点数据,但咱们还是定义了浮点数据类型。
例如,INT16U数据类型总是代表 16位无符号整数。当前, µC/OS-Ⅱ和顾客应用程序就可以预计出声明为该数据类型变量取值范畴是 0~65535。将µC/OS-Ⅱ移植到 32位解决器上也就意味着 INT16U实际被声明为无符号短整形数据构造而不是无符号整数数据构造。但是,µC/OS-Ⅱ所解决依然是 INT16U。
顾客必要将任务堆栈数据类型告诉给µC/OS-Ⅱ。这个过程是通过为 OS_STK声明对的 C数据类型来完毕。咱们解决器上堆栈成员是 16位,因此将 OS_TSK声明为无符号整形数据类型。所有任务堆栈都必要用 OS_TSK声明数据类型。
2)OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()
与所有实时内核同样,µC/OS-Ⅱ需要先禁止中断再访问代码临界区,并且在访问完毕后重新容许中断。这就使得 µC/OS-Ⅱ可以保护临界区代码免受多任务或中断服务例程(ISR)破坏。在 S3C44B0X上是通过两个函数( OS_CPU_A.S)实现开关中断。
INTS_OFF
mrs r0,cpsr ;当前 CSR
mov r1,r0 ;复制屏蔽
orr r1,r1,#0xC0 ;屏蔽中断位
msr CPSR,r1 ;关中断(IRQ and FIQ)
and r0,r0,#0x80 ;从初始 CSR返回 FIQ位
mov pc,lr ;返回
INTS_ON
mrs r0,cpsr ;当前 CSR
bic r0,r0,#0xC0 ;屏蔽中断
msr CPSR,r0 ;开中断 (IRQ and FIQ)
mov pc,lr ;返回
3)OS_STK_GROWTH
绝大多数微解决器和微控制器堆栈是从上往下长。但是某些解决器是用此外一种方式工作。µC/OS-Ⅱ被设计成两种状况都可以解决,只要在构造常量 OS_STK_GROWTH中指定堆栈生长方式就可以了。
置 OS_STK_GROWTH为 0表达堆栈从下往上长。
置 OS_STK_GROWTH为 1表达堆栈从上往下长。
(3).用 C语言编写 6个操作系统有关函数(OS_CPU_C.C)
1)OSTaskStkInit
OSTaskCreate()和 OSTaskCreateExt()通过调用 OSTaskStkInit()来初始化任务堆栈构造。因而,堆栈看起来就像刚发生过中断并将所有寄存器保存到堆栈中情形同样。图 12-2显示了 OSTaskStkInt()放到正被建立任务堆栈中东西。这里咱们定义了堆栈是从上往下长。
在顾客建立任务时候,顾客传递任务地址, pdata指针,任务堆栈栈顶和任务优先级给 OSTaskCreate()和 OSTaskCreateExt()。一旦顾客初始化了堆栈,OSTaskStkInit()就需要返回堆栈指针所指地址。 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 = (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) pdata;/* r0 */
*--stk = (SUPMODE);/* cpsr */
*--stk = (SUPMODE);/* spsr */
return ((OS_STK *)stk);}
2)OSTaskCreateHook
当用 OSTaskCreate()和 OSTaskCreateExt()建立任务时候就会调用 OSTaskCreateHook()。该函数容许顾客或使用移植实例顾客扩展 µC/OS-Ⅱ功能。当 µC/OS-Ⅱ设立完了自己内部构造后,会在调用任务调度程序之前调用 OSTaskCreateHook()。该函数被调用时候中断是禁止。因而顾客应尽量减少该函数中代码以缩短中断响应时间。
当 OSTaskCreateHook()被调用时候,它会收到指向已建立任务 OS_TCB指针,这样它就可以访问所有构导致员了。函数原型:
void OSTaskCreateHook (OS_TCB *ptcb)
3)OSTaskDelHook
当任务被删除时候就会调用 OSTaskDelHook()。该函数在把任务从 µC/OS-Ⅱ内部任务链表中解开之前被调用。当 OSTaskDelHook()被调用时候,它会收到指向正被删除任务 OS_TCB指针,这样它就可以访问所有构导致员了。 OSTaskDelHook()可以来检查 TCB扩展与否被建立(一种非空指针)并进行某些清除操作。
函数原型:
void OSTaskDelHook (OS_TCB *ptcb)
4.)OSTaskSwHook
当发生任务切换时候就会调用 OSTaskSwHook()。OSTaskSwHook()可以直接访问 OSTCBCur和 OSTCBHighRdy,由于它们是全局变量。OSTCBCur指向被切换出去任务 OS_TCB,而 OSTCBHighRdy指向新任务 OS_TCB。注旨在调用 OSTaskSwHook()期间中断始终是被禁止。因而顾客应尽量减少该函数中代码以缩短中断响应时间。
函数原型:
void OSTaskSwHook (void)
5)OSTaskStatHook
OSTaskStatHook()每秒钟都会被 OSTaskStat()调用一次。顾客可以用 OSTaskStatHook()来扩展记录功能。例如,顾客可以保持并显示每个任务执行时间,每个任务所用 CPU份额,以及每个任务执行频率等。
函数原型:
void OSTaskStatHook (void)
6)OSTimeTickHook OSTimeTickHook()在每个时钟节拍都会被 OSTaskTick()调用。事实上,OSTimeTickHook()是在节拍被µC/OS-Ⅱ真正解决,并告知顾客移植实例或应用程序之前被调用。函数原型:
void OSTimeTickHook (void)
后 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 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_SW
STMFD sp!,{lr} ;保存 pc
STMFD sp!,{lr} ;保存 lr
STMFD sp!,{r0-r12} ;保存寄存器和返回地址
MRS r4,CPSR STMFD 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!,{r4}
MSR SPSR,r4
LDMFD sp!,{r4}
MSR CPSR,r4
;返回到新任务上下文
LDMFD sp!,{r0-r12,lr,pc}
3)OSIntCtxSw() ;中断级任务切换函数
OSIntCtxSw
add r7,sp,#16 ;保存寄存器指针
LDR sp,=IRQStack ;FIQ_STACK
mrs r1,SPSR ;得到暂停 PSR
orr r1,r1,#0xC0 ;关闭 IRQ,FIQ.
msr CPSR_cxsf,r1 ;转换模式 (应当是 SVC_MODE)
ldr r0,[r7,#52] ;从 IRQ堆栈中得到 IRQ's LR (任务 PC)
sub r0,r0,#4 ;当前 PC地址是(saved_LR - 4)
STMFD sp!,{r0} ;保存任务 PC
STMFD sp!,{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 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!,{r4}
MSR SPSR,r4
LDMFD sp!,{r4}
BIC r4,r4,#0xC0 ;必要退出新任务通过容许中断
MSR CPSR,r4
LDMFD sp!,{r0-r12,lr,pc}
完毕了上述工作后来,µC/OS-Ⅱ就可以运营在 ARM解决器上了。
(三)实验设备
硬件:PC机 一台
UP-NETARM3000教学实验开发平台 一套
ARM7TDMI仿真器 一部
软件:
PC机Windows操作系统
ARM ADS1.2集成开发环境
仿真器驱动程序、超级终端通讯程序
(四)实验内容
1、系统功能与流程
(1)循环采样AD转换器和键盘码
(2)当AD转换器1采样值处在慢速区域时,仅点亮4号和5号LED(所
有数码管全亮,显示为“8”)
(3) 当AD转换器1采样值处在中速区域时,点亮4号,5号,6号LED
(4)当AD转换器1采样值处在高速区域时,点亮3号,4号,5号,6号LED
(5) 当AD转换器0采样值左偏时,点亮1号LED,当AD转换器值回答后关闭。 当AD转换器值右偏时,点亮9号LED,当AD转换值恢复后关闭
(6) 当AD转换器2采样值超过预设阈值时,点亮2号和7号LED,不大于时关 闭。
(7) 通过NumLock键实现自动与手动控制切换。当自动模式下,手动按 钮仍可进行干预,但是随着系统状态变化时,手动干预状态不予保存。
(8) 手动状态下,AD转换器值不影响。
2、系统定制与剪裁
硬件层:
CPU: S3C44B0X01(ARM7TDMI核心)
Boot Flash: 2M Nor Flash(AM29LV160DB)
RAM: 8M
输入设备: AD转换器0,AD转换器1,AD转换器2,键盘
输出设备: LED数码管
软件层:
由于本应用设计功能简朴,响应事件类型较少,可以考虑剪裁掉操作系统,让程序循环直接运营于硬件环境之上。但是,简朴循环机制会使得时间响应延时延长。
3、构建最小系统
本系统中,硬件最小系统是由CPU、RAM、Nor Flash、A/D转换器、键盘构成。在此基本上,加载BootLoader,编写并加载Nor Flash驱动、LED驱动、键盘驱动、AD转换器驱动等。
4、模块分析与讨论
本系统中,可以将软件构造模块简朴地划分为三个某些:事件触发模块、事件分发模块、事件解决模块。其中事件触发模块负责从输入设备端获取信息,确认与否有事件发生,在本实验系统中,即AD转换器采样模块和键盘事件采样模块;事件解决模块是程序执行模块,负责驱动输出设备,表达程序解决成果,在本实验中即为LED驱动模块;消息分发模块是程序中枢,通过轮询或中断等方式获取中断信息,并发送到事件解决模块中,即本实验中主循环实现功能。
5、可测型设计
本实验中,对系统消息循环效率、事件响应时间等指标进行测试与评估。通过在响应模块某些加入时间代码,以得到响应数据进行分析。
展开阅读全文