版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于S3C2440的uc/OS-II和uc-GUI移植和应用实验目的:1. 熟悉ARM体系结构2. 深入学习操作系统原理3. 增强动手实践能力实验平台:ARM9体系结构处理器S3C2440飞凌嵌入式开发板FL2440(由于本实验大部分在宿舍完成,故采用了自己的嵌入式开发板作为平台,硬件与实验箱基本相似)功能实现主要功能是利用uc/OS-II的多任务调度功能和uc-GUI提供的图形函数接口,编写一个Uart传输测试程序。通过Uart协议,传输PC机键盘输入的数据,在开发板的LCD上显示出来。同时实现了字符串移动和现实系统信息的附加功能。注:本实验中,移植代码部分参考了网络上的一些相关文章,应用程
2、序部分全部由自己编写完成。实验原理:1 背景介绍(1)ARM9(S3C2440)ARM9系列处理器是英国ARM公司设计的主流嵌入式处理器。S3C2440是三星公司生产的基于ARM9体系结构的处理器,能够运行linux、wince等大型操作系统,构成非常典型的cpu+os嵌入式系统。1(2)uc/OS-IIuc/OS是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。uc/OS-II是一个实时操作系统内核,它包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。是一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队
3、列,内存管理,中断管理等。(3)uc-GUI uC/GUI是Micrium公司开发的通用的嵌入式用户图形界面软件。它给任何使用图形LCD的应用程序提供独立于处理器和LCD控制器之外的有效的图形用户接口。可以应用于单一任务环境,也可以应用于多任务环境中。uC/GUI能够应用于任何LCD控制器和CPU的任何尺寸的物理显示或者模拟显示中。2移植原理(1)uc/OS-II移植为了方便移植,大部分的uC/OS II代码是用c语言写的,但仍需要用c和汇编语言写一些与处理器相关的代码,这是因为uC/OS II在读写处理器寄存器时只能通过汇编语言来实现。由于uC/OS II在设计时就已经充分考虑了可移植性,所
4、以uC/OS II的移植相对来说是比较容易的。移植主要涉及的文件。(具体移植代码见后文附录)(a) 设置与处理器及编译器相关的代码OS_CPU.H这部分代码主要实现一些数据类型的定义。不同的编译器会使用不同的字节长度来表示同一数据类型,所以要定义一系列数据类型以确保移植的正确性。下面是uC/OS II定义的一部分数据类型。typedef unsigned char BOOLEAN; /*布尔型数据类型*/typedef unsigned char INT8U;/*无符号8位*/ typedef signed char INT16S;/*带符号8位*/ typedef unsigned int
5、INT16U;/*无符号16位*/uC/OS II需要先关中断再访问临界区的代码,并且在访问完后重新允许中断。uC/OS II定义了两个宏来禁止和允许中断:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),本移植实现这两个宏的汇编代码。 #defineOS_ENTER_CRITICAL()_asmbl ARMDisableInt/ARMDisableInt()#defineOS_EXIT_CRITICAL()_asmbl ARMEnableInt/ARMEnableInt()其中ARMDisableInt和ARMEnableInt两个函数在2440slib.s里面实
6、现(b) 用C语言实现与处理器任务相关的函数OS_CPU_C.C这部分代码最主要的功能是实现一个系统的堆栈初始化函数OS_STK * OSTaskStkInit (void (*task)(void *pd), void *pdata,OS_STK *ptos,INT16U opt)其他的一些操作系统的钩子函数也在这里定义,如:void OSTaskCreateHook (OS_TCB *ptcb);等等,用来实现操作系统的扩展功能。由于本实验没有使用到这些钩子函数,故在这里只定义成空函数即可。(c) 处理器相关部分汇编实现这部分代码是移植的核心内容,主要实现操作系统的任务调度等核心功能。a)
7、OSStartHighRdy() 该函数在OSStart()多任务启动之后,负责从最高优先级任务的TCB控制块中获得该任务 的堆栈指针sp,通过sp依次将CPU现场恢复,此时系统就将控制权交给用户创建的该任务的进程,直到该任务被阻塞或者被其他更高优先级的任务抢占了 CPU。该函数仅仅在多任务启动时被执行一次,用来启动第一个,也就是最高优先级的任务执行。 b)OSCtxSw() 该函数是任务级的上下文切换函数,在任务因为被阻塞而主动请求与CPU调度时执行,主要工作是 先将当前任务的CPU现场保存到该任务堆栈中,然后获得最高优先级任务的堆栈指针,从该堆栈中恢复此任务的CPU现场,使之继续执行,从而
8、完成一次任务切 换。 c)OSIntExit() 该函数是中断级的任务切换函数,在时钟中断ISR中发现有高优先级任务在等待时,需要在中断退 出后不返回被中断的任务,而是直接调度就绪的高优先级任务执行。其目的在于能够尽快让高优先级的任务得到响应,保证系统的实时性能。 d)OSTickISR() 该函数是时钟中断处理函数,主要任务是负责处理时钟中断,调用系统实现的OSTimeTick 函数,如果有等待时钟信号的高优先级任务,则需要在中断级别上调度其执行。另外两个相关函数是OSIntEnter()和OSIntExit(),都需要 在ISR中执行。2(2) uc-GUI移植移植uC/GUI主要集中在修
9、改三个头文件和两个C文件。三个头文件都在Config下,分别是GUICon.h ,GUITouchConf.h,LCDConf.h ;两个C文件一个是GUI_X.C(SampleGUI_X.C) ,.另外一个在GUILCDDriver目录下(LCDWin.c)(a)修改头文件LCConf.h主要修改的地方:#define LCD_XSIZE (320) #define LCD_YSIZE (240) #define LC
10、D_BITSPERPIXEL (16) /16Bpp #define LCD_CONTROLLER 1375 LCD_XSIZE ,LCD_YSIZE 是对应LCD的尺寸大小LCD_BISPERPIXEL 指定每象素的位的数量LCD_CONTROLLER是LCD控制器(b)修改头文件GUI_Conf.h #ifndef GUICONF_H#define GUICONF_H #define GUI_OS
11、 (1)/* 是否支持OS*/#define GUI_SUPPORT_TOUCH (0) /*是否支持触摸屏*/#define GUI_SUPPORT_UNICODE (1) /*是否支持ASCII/UNICODE*/ #define GUI_DEFAULT_FONT
12、160; &GUI_Font6x8 /*选择一个默认的字体*/#define GUI_ALLOC_SIZE 1024*1024 /*动态内存的大小*/ #define GUI_WINSUPPORT (1) /*是否支持 WM(
13、视窗管理器)*/#define GUI_SUPPORT_MEMDEV (1) /*是否支持存储设备*/#define GUI_SUPPORT_AA (0) /*是否支持反锯齿*/ #endif 在LCD的最基本操作就是在某一个坐标上画点,其他的操作都是画点操作延伸出来的。uC/GUI的所有对LCD的操作也是基于这个动作。在FL2440_LCD
14、_for_GUI.c文件中实现开发板LCD的基本操作函数,与uc-GUI中定义的函数对接。如:void FL2440_LCD_SetPixel(U32 x,U32 y,U16 c)PutPixel(x,y,c);/*基本的LCD画点函数*/U16 FL2440_LCD_GetPixel(U32 x,U32 y)return (GUI_Point(x,y);/*基本的LCD读点函数*/void FL2440_LCD_Off(void)Lcd_EnvidOnOff(0); /*LCD开关*/void FL2440_LCD_On(void)Lcd_EnvidOnOff(1); /*LCD开关*/3实
15、验过程:前面介绍了基本的移植原理,要想让开发板能够正常工作,还需要一些额外的工作。1 启动代码采用三星公司针对2440的启动代码,基本无需修改。2 应用程序前面介绍的uc/OS-II只是一个操作系统的最基本内核,要实现具体功能,要求开发人员自己编写相关的应用程序。本实验中,应用程序在主函数文件finalmain.c中实现。主要功能是利用uc/OS-II的多任务调度功能和uc-GUI提供的图形函数接口,编写一个Uart传输测试程序。通过Uart协议,传输PC机键盘输入的数据,在开发板的LCD上显示出来。同时实现了字符串移动和现实系统信息的附加功能。主函数如下:void Main()/系统时钟,L
16、CD,Uart,GUI以及uc/OS-II的初始化cpu_init();FL_Lcd_Init();Uart_Init(0,115200);Uart_Printf("begin!n");GUI_Init();GUITASK_Init();OSInit(); OSTimeSet(0); /创建起始任务 OSTaskCreate(TaskStart, 0, &TaskStartSTKTaskStkLeath-1, NormalTaskPrio+13); /创建信号量,用于在文本框输入满后清除文本框内容使用Cls=OSSemCreate(1); OSStart();voi
17、d TaskStart (void *pdata) /起始任务 / 设置系统时钟节拍 Init_Timer4(); / 初始化统计任务 OSStatInit(); / 创建任务/*Task_Text为创建文本框任务,在LCD上画出一个文本框,同时实现在文本框输入满的时候清楚文本框内容*/ OSTaskCreate(Task_Text,0, &Task_Text_StkTaskStkLeath - 1, NormalTaskPrio); /*Task_SideText任务,在LCD侧边处现实操作系统名称及版本,并向上移动*/OSTaskCreate(Task_SideText,0,&am
18、p;Task_SideText_StkTaskStkLeath-1,NormalTaskPrio+3); /*Task_Info任务,在文本框下方显示系统信息,包括CPU使用率,系统任务切换频率,系统开机时间*/ OSTaskCreate(Task_Info, 0, &Task_Info_StkTaskStkLeath - 1, NormalTaskPrio+5); /*Task_Title任务在文本框上方滚动现实提示信息*/ OSTaskCreate(Task_Title, 0, &Task_Title_StkTaskStkLeath - 1, NormalTaskPrio+
19、6); /*Task_Uart任务,从Uart串口读取数据显示在文本框中*/OSTaskCreate(Task_Uart, 0, &Task_Uart_StkTaskStkLeath - 1, NormalTaskPrio+8);/*在文本框中现实位图,(可选)*/ /OSTaskCreate(Task_Bmp, 0, &Task_Bmp_StkTaskStkLeath - 1, NormalTaskPrio+7); OSTaskDel(OS_PRIO_SELF); Uart_Printf("Exit TaskStart.n");实验结果:经过多次实验和调试
20、,最终实现了上述功能,以下是实验结果截图:ADS工程源文件组织结构附录:1 uc/OS-II移植代码(汇编函数部分):OSStartHighRdy BL OSTaskSwHook ; Call user-defined hook function LDR r4, =OSRunning ; Indicate that multitasking has started MOV r5, #1 STRB r5, r4 ; OSRunning = true LDR r4, =OSTCBHighRdy ; Get highest priority task TCB address LDR r4, r4 ;
21、 get stack pointer LDR sp, r4 ; switch to the new stack LDMFD sp!, r4 ; pop new task s spsr MSR spsr_c, r4 LDMFD sp!, r4 ; pop new task s psr MSR cpsr_c, r4 LDMFD sp!, r0-r12,lr,pc ; pop new task s r0-r12,lr & pc OSCtxSw STMFD sp!, lr STMFD sp!, r0-r12,lr ; push lr & register file MRS r4, cp
22、sr ; copy CPSR to R4 STMFD sp!, r4 ; push current psr MRS r4, spsr ; copy SPSR to R4 STMFD sp!, r4 ; push current spsr_OSCtxSw LDR r4, =OSPrioCur ; OSPrioCur = OSPrioHighRdy LDR r5, =OSPrioHighRdy LDRB r6, r5 STRB r6, r4 LDR r4, =OSTCBCur ; Get current task TCB address LDR r5, r4 STR sp, r5 ; store
23、sp in preempted tasks's TCB BL OSTaskSwHook ; call Task Switch Hook LDR r6, =OSTCBHighRdy ; Get highest priority task TCB address LDR r6, r6 LDR sp, r6 ; get new task s stack pointer STR r6, r4 ; set new current task TCB address LDMFD sp!, r4 ; pop new task spsr MSR spsr_c, r4 LDMFD sp!, r4 ; po
24、p new task cpsr MSR cpsr_c, r4 LDMFD sp!, r0-r12,lr,pc ; pop new task r0-r12,lr & pcOSIntCtxSw LDR r0, =OSIntCtxSwFlag ; OSIntCtxSwFlag = true MOV r1, #1 STR r1, r0 MOV pc, lr ;This is only change flag,return to OSIntExit/OSTickISRSUBlr, lr, #4 STMFDsp!, r0-r12, lr ; push r0-r12 register file an
25、d lr( pc return address ) MRS r4, spsr STMFD sp!, r4 ; push current spsr_irq ( =cpsr_svc )mov r0,#0x4000mov r1,#0x4a000000str r0,r1,#0mov r0,#0x4000mov r1,#0x4a000000str r0,r1,#0x10BLOSIntEnterBL OSTimeTickBL TmrSignalTmrBLOSIntExitLDRr0, =OSIntCtxSwFlag ; check if OSIntCtxFlag is marked as trueLDR
26、r1, r0CMPr1, #1BEQ_IntCtxSw ; if OSIntCtxFlag = true, then jump to _IntCtxSwLDMFD sp!, r4 ; get cpsr_svc from stackMSR spsr_c, r4 ; prepare spsr to return svc modeLDMFDsp!, r0-r12, pc ; recover r0-r12 and pc from stack, cpsr also _IntCtxSw MOV r1, #0 ; clear OSIntCtxSwFlag = flase STR r1, r0 LDMFD s
27、p!, r4 ; restore spsr_irq MSR spsr_c, r4 LDMFDsp!, r0-r12, lr ; recover the irq stack pointer LDR r5, =SAVED_LR_IRQ LDR r6, =SAVED_LR_SVCSTRlr, r5 ; save lr_irq to SAVED_LR_IRQ MOVlr, #0x00000093 ; change forcely cpsr to svc modeMSRcpsr_c, lrSTR lr, r6 ; save lr_svc to SAVED_LR_SVCLDRlr, r5 ; get lr
28、_irq value saved in SAVED_LR_IRQ STMFD sp!, lr LDRlr, r6 STMFD sp!, r0-r12,lr ; push lr & r0-r12 register file MRS r4, spsr STMFD sp!, r4 ; push current psr MRS r4, spsr STMFD sp!, r4 ; push spsr B_OSCtxSw ; jump to _OSCtxSwARMDisableIntMRSr0, cpsrSTMFDsp!, r0 ; push current PSRORRr0, r0, #0x80MSRcpsr_c, r0 ; disable IRQ Int sMOVpc, lrARMEnableIntLDMFDsp!, r0 ; pop current PSRMSRcpsr_c, r0 ; restore original cpsrMOVpc, lr2 uc/OS-II移植代码(C语言函数部分):OS_STK * OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024常年物资采购协议范本
- 2024年舞台搭建项目专用协议协议
- 2024家庭水电安装项目协议范本
- 2024年化建筑砂浆采购协议范本
- 2024年活鸡买卖双方权益保障协议
- 2024建设项目用电合作协议
- 2024年学生违纪行为处理协议
- 2024水电项目专用材料采购协议范本
- 2024年设备采购协议模板2
- 2024年度视频制作项目协议格式
- 人教精通版英语五上Unit5《Isthisyourschoolbag》教案
- 2023年口腔医学期末复习-牙周病学(口腔医学)考试历年真题精华集选附答案
- 互联网医院整体方案介绍-PPT
- 《化学与生活》课程标准
- 能源管理知识培训讲义
- 老旧小区现状调查调查表
- 生命科学导论(中国农业大学)知到章节答案智慧树2023年
- 企业采购管理现状、问题及完善策略-以正泰电器集团为例(论文)
- 晋升管理制度完整版
- 优质护理服务评价细则-
- 加强供电企业青年员工培养模式优化措施
评论
0/150
提交评论