北航ARM9实验报告:实验3uCOS-II实验
ARM & μCOS-II嵌入式系统实验教程
上海市浦东新区浦东软件园郭守敬路498号1206室邮件: supports@电话: 86-21-50271068 1目录实验一 µC/OS-II移植 (3)1 实验目的 (3)2实验基础 (3)3准备事项 (3)4实验原理 (3)5程序编译与下载 (13)6实验思考 (15)实验二任务管理实验 (16)1实验目的 (16)2实验基础 (16)3准备事项 (16)4实验原理 (16)5实验内容 (20)6实验思考 (22)实验三同步和进程通信实验 (24)1实验目的 (24)2实验基础 (24)3准备事项 (24)4实验原理 (24)5实验内容 (28)6实验思考 (31)实验四优先级逆转实验 (32)1实验目的 (32)2实验基础 (32)3准备事项 (32)4实验原理 (32)5实验内容 (34)6实验思考 (40)实验五实时中断实验 (41)1实验目的 (41)2实验基础 (41)3准备事项 (41)4实验原理 (41)5实验内容 (46)6实验思考 (49)实验六任务抖动实验 (50)1实验目的 (50)2实验基础 (50)上海市浦东新区浦东软件园郭守敬路498号1206室邮件: supports@电话: 86-21-50271068 23准备事项 (50)4实验原理 (50)5实验内容 (53)6实验思考 (57)实验七钟点构件实验 (58)1实验目的 (58)2实验基础 (58)3准备事项 (58)4实验原理 (58)5实验内容 (62)6实验思考 (65)实验八串行通信构件实验 (66)1实验目的 (66)2实验基础 (66)3准备事项 (66)4实验原理 (66)5实验内容 (69)6实验思考 (72)实验九 TIMER构件实验 (73)1实验目的 (73)2实验基础 (73)3准备事项 (73)4实验原理 (73)5实验内容 (76)6实验思考 (80)上海市浦东新区浦东软件园郭守敬路498号1206室邮件: supports@电话: 86-21-50271068 3实验一µC/OS-II移植1 实验目的1、掌握移植的概念、方法和步骤2、掌握ARM体系结构3、掌握μC/OS-II软件和硬件体系结构4、学习ARM指令集和ARM处理器硬件特征5、学习μC/OS-II移植条件和在ARM上的移植方法2实验基础1、建立移植概念。
arm9实验报告
rGPGCON = rGPGCON & 0xfff0ffff | 0x00050000;
rGPGDAT = rGPGDAT & 0xeff | 0x200;
for(i=0;i<10000000;i++); //延时
2、掌握三星S3C2410UART相关寄存器的配置;
3、能够用C语言编写三星S3C2410相应的串口程序;
4、学习A/D转换的接口电路;
5、掌握三星S3C2410的A/D转换器相关的寄存器配置方法和编程方法。
二、实验仪器设备
1、EL-ARM-830教学实验箱,奔腾E系列PC机,仿真调试电缆;
data = 0x55; //给全局变量赋值
while(1)
{
Uart_Printf("%x ", data); //串口0输出
Delay(1000);
2、PC操作系统WINXP,ADS1.2集成开发环境,仿真调试电缆驱动程序。
三、实验原理
ARM的UART实验
三星S3C2410的UART单元提供3个独立的异步串行I/O口,都可以运行于中断模式或DMA模式,它最高可支持115200bps的传输速率。三星S3C2410中每个UART通道包含两个用于接收和发送数据的16位FIFO队列。
3、了解ARM9的中断原理,能够对三星S3C2410的中断资源及其相关中断寄存器进行合理配置;掌握三星S3C2410中断的编箱,奔腾E系列PC机,仿真调试电缆;
2、PC操作系统WINXP,ADS1.2集成开发环境,仿真调试电缆驱动程序。
ucOS-II实验说明
例2-6 设计一个只有一个任务MyTask的应用程序,当程序运行后,任务MyTask的工作就是每秒在显示器上面显示一个字符“M”。
学习实验代码,分析实现过程,观测实验结果,并写出实验报告。
例2-7 在例2-6应用程序的任务MyTask中再创建一个任务YouTask,当程序运行后,任务MyTask的工作在显示器上面显示一个字符“M”;而任务YouTask则是在显示器上显示字符“Y”。
学习实验代码,分析实现过程,观测实验结果,并写出实验报告。
例2-8 修改例2-7应用程序的任务YouTask。
要求任务YouTask运行20次后,挂起任务MyTask;任务YouTask运行40次后,恢复任务MyTask。
学习实验代码,分析实现过程,观测实验结果,并写出实验报告。
例2-9 改造例2-7的任务MyTask,当任务MyTask运行10次时,用函数OSSchedLock( )对调度器进行加锁;而当任务MyTask运行到第80次时,再用函数OSSchedUnlock( )对调度器进行解锁,并运行该程序。
学习实验代码,分析实现过程,观测实验结果,并写出实验报告。
例2-10 修改例2-7的应用程序,使任务MyTask能删除任务YouTask。
学习实验代码,分析实现过程,观测实验结果,并写出实验报告。
例2-11 建立一个起始任务TaskStart,由它再建立4个任务Task1、Task2、Task3和TaskClk 来完成如下任务:●由Task2和Task3各自来完成一个动画显示任务:在屏幕上依次输出字符“|”、“\”、“-”、“/”,而产生一个向左转动和一个向右的动画标志;●由TaskClk来获取系统时间并显示;●由Task1来初始化屏幕,创建其他4个任务和检查所有5个任务的任务堆栈使用情况并显示出来。
学习实验代码,分析实现过程,观测实验结果,并写出实验报告。
例3-1 在例2-6应用程序的基础上,在OS_CPU_C文件中按如下代码定义函数OSTimeTickHook( ) ,然后运行并查看运行结果。
北航ARM9实验报告:实验3uCOS-II实验
北航ARM9实验报告:实验3uCOS-II实验北航 ARM9 实验报告:实验 3uCOSII 实验一、实验目的本次实验的主要目的是深入了解和掌握 uCOSII 实时操作系统在ARM9 平台上的移植和应用。
通过实际操作,熟悉 uCOSII 的任务管理、内存管理、中断处理等核心机制,提高对实时操作系统的理解和应用能力,为后续的嵌入式系统开发打下坚实的基础。
二、实验环境1、硬件环境:ARM9 开发板、PC 机。
2、软件环境:Keil MDK 集成开发环境、uCOSII 源代码。
三、实验原理uCOSII 是一个可裁剪、可剥夺型的多任务实时内核,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。
其基本原理包括任务管理、任务调度、时间管理、内存管理和中断管理等。
任务管理:uCOSII 中的任务是一个独立的执行流,每个任务都有自己的堆栈空间和任务控制块(TCB)。
任务可以处于就绪、运行、等待、挂起等状态。
任务调度:采用基于优先级的抢占式调度算法,始终让优先级最高的就绪任务运行。
时间管理:通过系统时钟节拍来实现任务的延时和定时功能。
内存管理:提供了简单的内存分区管理和内存块管理机制。
中断管理:支持中断嵌套,在中断服务程序中可以进行任务切换。
四、实验步骤1、建立工程在 Keil MDK 中创建一个新的工程,选择对应的 ARM9 芯片型号,并配置相关的编译选项。
2、导入 uCOSII 源代码将 uCOSII 的源代码导入到工程中,并对相关的文件进行配置,如设置任务堆栈大小、系统时钟节拍频率等。
3、编写任务函数根据实验要求,编写多个任务函数,每个任务实现不同的功能。
4、创建任务在主函数中使用 uCOSII 提供的 API 函数创建任务,并设置任务的优先级。
5、启动操作系统调用 uCOSII 的启动函数,使操作系统开始运行,进行任务调度。
6、调试与测试通过单步调试、查看变量值和输出信息等方式,对系统的运行情况进行调试和测试,确保任务的执行符合预期。
uCOS-II移植实验
17
五
基础知识
OS_CPU.S的移植 -OSStartHighRd
OSStartHighRd()函数是在OSStart()多任务启动之后,从最高优先 级任务的TCB控制块中获得该任务的堆栈指针sp,通过sp依次将cpu现 场恢复,这时系统就将控制权交给用户创建的该任务进程,直到该任 务被阻塞或者被其他更高优先级的任务抢占cpu.该函数仅仅在多任务 启动时被执行一次,用来启动第一个,也就是最高优先级的任务执行.
void OSIntCtxSw(void) { need_to_swap_context = 1; }
12
五
基础知识
OS_CPU.S的移植 -时钟节拍中断服务函数
时钟节拍是特定的周期性中断.这个中断可以看作是系统 心脏的脉动. 时钟的节拍式中断使得内核可以将任务延时若干个整数时 钟节拍,及当任务等待事件发生时,提供等待超时的依据. 时钟节拍率越快,系统的额外开销就越大.中断之间的时 间间隔取决于不同的应用,本系统使用S3C44B0的timer 0 作为时钟节拍源,产生间隔10mS的时钟节拍. OSTickISR()就是时钟节拍中断服务函数,也就是S3C44B0 的timer 0的中断处理函数.
jx44b0实验系统教案ucosii移植实验jx44b0实验系统教案ucosii移植实验武汉创维特信息技术有限公司201969提纲11113333222244445555基础知识实验目的实验内容预备知识实验设备6666实验过程7777实验报告要求实验目的实验目的了解ucosii内核的基本原理和主要结构掌握将ucosii内核移植到arm处理器上的基本方法掌握ucosii下基本多任务应用程序的编写实验内容实验内容学习ucosii再arm处理器上的移植过程编写简单的多任务应用程序同时实现跑马灯和数码管显示的功能预备知识预备知识了解嵌入式操作系统的构架以及具体的ucosii的组成了解操作系统的移植方法实验设备实验设备jx44b0教学实验箱adt1000仿真器和adtide集成开发环境串口连接线基础知识ucosii概述ucosii在特定处理器上的移植工作绝大部分集中在多任务切换的实现上因为这部分代码主要是用来保存和恢复处理器现场许多操作如读写寄存器操作不能用c语言只能使用特定的处理器的汇编语言来完成
嵌入式μCOS-II实验报告模板
3.1 多任务编程实验3.1.1 实验目的1. 本实验的目的是让学生了解uC/OS-II中怎样创建一个任务以及了解uC/OS-II的多任务调度机制。
3.1.2 实验内容1. 在Eg1的基础上新建一个任务;2. 在该任务函数中打印提示信息。
3.1.3 预备知识1. C语言的基础知识;2. 程序调试的基础知识和方法。
3.1.4 实验设备1. 硬件:JXARM9-2410教学实验箱、PC机;2. 软件:PC机操作系统 Windows 98(2000、XP) + ADT IDE集成开发环境。
3.1.5 实验步骤本章将以Eg1为基础,在其上添加一个任务。
1. 打开Eg1工程打开examples/ucos工作区,并设置Eg1工程为活动工程。
然后打开App目录下的eg1.C 文件。
2. 声明任务栈在eg1.c文件中声明任务堆栈,下面代码中黑体字表示的为新添加的代码:/* task stack */OS_STK StackLED[STACKSIZE]= {0, };OS_STK StackSEG[STACKSIZE]= {0, };OS_STK StackTEST[STACKSIZE]= {0, };任务栈以全局变量的方式静态分配,然后在创建任务时使用。
3. 添加任务ID/* task name string */char IdLED = '1';char IdSEG = '2';char IdTEST = '3';4. 任务函数声明/* task entry function */void TaskLED(void *Id);void TaskSEG(void *Id);void TaskTEST(void *Id);5. 任务函数实现在TaskSEG函数后添加如下函数:/** Task entry function.* this task blink the seg every 200 ticks* that is 1s.*/void TaskTEST(void *Id){uHALr_printf("Task3() called\n");for (;;){OSSchedLock();uHALr_printf("Task%c() turned\n", *(char *)Id);User_SEG_Blink();OSSchedUnlock();OSTimeDly(100);}}在该函数中实现数码管显示,由于在TaskSEG中也进行了数码管显示,因此,请先将TaskSEG中的数码管显示功能关闭,以更好地看到效果,修改后的TaskSEG函数如下:void TaskSEG(void *Id){uHALr_printf("Task2() called\n");for (;;){OSSchedLock();uHALr_printf("Task%c() turned\n", *(char *)Id);// User_SEG_Blink();OSSchedUnlock();OSTimeDly(100);}}6. 创建任务然后在Main函数中创建任务,添加TaskTEST的创建代码,如下所示:/** create the tasks in uC/OS and assign increasing* priorities to them so that Task3 at the end of* the pipeline has the highest priority.*/OSTaskCreate(TaskLED, (void *)&IdLED, (OS_STK *)&StackLED[STACKSIZE - 1], 5);/* Create seg blink tasks */OSTaskCreate(TaskSEG, (void *)&IdSEG, (OS_STK *)&StackSEG[STACKSIZE - 1], 13);/* Create test tasks */OSTaskCreate(TaskTEST, (void *)&IdTEST, (OS_STK *)&StackTEST[STACKSIZE - 1], 15);7. 编译选择“Build”->“Rebuild All”功能编译工程,如果出现错误,修改代码,然后重新编译,直到成功。
北航ARM9嵌入式实验实验报告
实验一ARM基础知识和开发环境一、实验目的◆掌握ARM的串行口工作原理◆学习编程实现ARM的UART通讯◆掌握S3C2410寄存器配置方法二、实验内容◆熟悉打开已有工程的步骤,掌握仿真调试的方法。
◆建立一个新工程,熟练掌握编译器和链接器的设置方法。
◆从串口输入字符串,将0~9数字在超级终端上连续显示,“Enter”键换行。
◆将第三步得到的字符转换成BCD码,限制在0~1023,用于控制直流电机。
三、预备知识◆了解EW ARM集成开发环境的基本功能◆学习串口通讯的基本知识◆熟悉S3C2410串口有关的寄存器四、实验设备及工具◆硬件:ARM嵌入式开发平台、PC机Pentium100以上、用于ARM920T的JTAG仿真器、串口线。
◆软件:PC机操作系统WinXP、EWARM集成开发环境、仿真器驱动程序、超级终端通讯程序。
五、实验原理及说明1)异步串行通信异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。
数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。
接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。
为了恢复发送的信息,双方必须协调工作。
在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。
但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。
图1-1 串行通信字符格式图1-1给出异步串行通信中一个字符的传送格式。
开始前,线路处于空闲状态,送出连续“1”。
传送开始时首先发一个“0”作为起始位(即双方同步信号),然后出现在通信线上的是字符的二进制编码数据。
每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。
后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。
基于ARM9的UCOS-II移植
编号:嵌入式系统设计与制作(论文)说明书题目:基于嵌入式ARM的μC/OS-II移植院〔系〕:信息与通信学院专业:电子信息工程学生:学号:指导教师:2012年12月29日嵌入式系统设计与制作实训任务书以应用为中心、以电脑为基础的嵌入式技术,是当今发展最快、应用最广、最有发展前景的主要技术之一。
嵌入式技术已经被广泛应用于工业控制、移动通信、信息家电、医疗仪器、汽车电子、航空航天等各个领域。
在各种嵌入式处理器中,ARM以体积小、低功耗、低成本、高性能等优点,获得许多半导体厂商的支持,在嵌入式应用领域取得巨大的成功。
软件方面,uC/OS是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统,因而被使用频繁。
本文主要研究了μC/OS-II在S3c2440芯片上的移植。
本文通过对S3c2440硬件和源码公开的嵌入式实时操作系统μC/OS-II的分析,以S3C2440为例,阐述了在ARM9上移植μC/OS-II,来运行多个任务,用液晶显示来说明μC/OS-II移植的优缺点,以及在移植中应注意的问题,启动代码的理解,解析代码的优化。
关键词:嵌入式系统;实时;ARM9;μC/OS-IIApplication, embedded computer-based technology, is one of today's fastest-growing, most widely used, the most promising technologies. Embedded technology has been widely used in industrial control, mobile communications, information appliances, medical equipment, automotive electronics, aerospace and other fields.In a variety of embedded processors, ARM advantages of small size, low-power, low-cost, high-performance, get the support of many semiconductor manufacturers, achieved great success in the field of embedded applications. Software, u C / OS is a free, open-source, compact structure, can be deprived of a real-time operating system for real-time kernel, thus frequent.This paper studies the μC / OS-II in the S3c2440 chip transplant. This article by S3c2440 hardware and open source embedded real-time operating system μC / OS-II analysis, for example, described to S3C2440 ARM9 on transplantation μC / OS-II to run multiple tasks to illustrate with LCD transplant μC / OS-II strengths and weaknesses, as well as the transplant should pay attention to the problem of understanding of the startup code, the parsing code optimization.Key words: embedded system; real-time; ARM9; μC / OS-II目录引言 (1)1S3C2440系列微处理器简介 (1)内核 (1)开发板 (3)2μC/OS-II (4)分析 (4)任务运行 (6)任务通信 (7)内存动态分配 (8)3μC/OS-II在ARM9上的移植 (9)与CPU有关的文件 (9) (9) (10) (12)移植代码实现 (13)4测试程序 (23)整个测试程序的效果图 (23)测试程序的功能 (23)5总结 (24)谢辞 (25)参考文献 (26)引言早在20世纪60年代,就已经有人开始研究和开发嵌入式操作系统。
ARM课程设计UCOSII移植实验
嵌入式系统课程设计1 、设计目的(1)掌握UC/OS-II移植到ARM的方法。
(2)了解UC/OS-II的基本原理及移植条件。
(3)掌握UC/OS-II的用户程序的编写格式。
2、设计要求要求建立两个任务,一个按键检测任务,一个控制蜂鸣器。
3、电路图(原理图)(一)蜂鸣器控制(二)LED显示4、程序/**************************************************************************** * 文件名:* 功能:头文件和宏定义* 说明:/**************************************************************************** #include "config.h"#include "stdlib.h"// P0.7为蜂鸣器的控制I/O#define BEEP (1<<7)// LED控制宏函数定义。
LED1--LED8的控制I/O为P1.16--P1.23#define LED_ADJ 16#define LED_IOCON (0xFF<<LED_ADJ)#define LED_OFF() IO1SET=LED_IOCON#define LED_DISP(dat) LED_OFF(); IO1CLR=((dat)<<LED_ADJ)#defineTaskStkLengh 100 //定义用户任务堆栈长度OS_STK TaskStk0[TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈OS_STK TaskStk1[TaskStkLengh]; //Define the Task1 stack 定义用户任务1的堆栈void Task0(void *pdata); //Task0 任务0void Task1(void *pdata); //Task0 任务1/**************************************************************************** ** 主函数/**************************************************************************** int main (void){OSInit ();OSTaskCreate (Task0,(void *)0, &TaskStk0[TaskStkLengh - 1], 2);OSStart ();return 0;}/*************************************************************************** ** Task0 任务0/**************************************************************************** void Task0(void *pdata){ const uint8 DISP_TAB[32] = { 0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0x00 };uint8 i;pdata = pdata;TargetInit ();PINSEL0 = 0x00000000; // 设置P0口管脚连接GPIOIO0DIR = BEEP; // 设置蜂鸣器控制口为输出IO0SET = BEEP;IO1DIR = LED_IOCON; // 设置LED1--LED8的控制口为输出LED_OFF();// 建立任务1(用于蜂鸣器控制)OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 3);while (1){ for(i=0; i<32; i++){ LED_DISP(DISP_TAB[i]); // 输出LED显示数据OSTimeDly(OS_TICKS_PER_SEC/2); // 延时0.5S}}}/**************************************************************************** ** Task1 任务1/**************************************************************************** void Task1(void *pdata){pdata = pdata;while (1){ OSTimeDly(OS_TICKS_PER_SEC*10); // 延时10SIO0CLR = BEEP; // 控制蜂鸣器响OSTimeDly(OS_TICKS_PER_SEC/2);IO0SET = BEEP;}}/**************************************************************************** ** End Of File/****************************************************************************5、结论及分析本次设计,硬件设计完成后,将程序烧写入芯片后,实习了预期的目标,完成了两个任务:一个按键检测任务和一个控制蜂鸣器。
基于ARM9的μC_OS-Ⅱ实时操作系统移植研究
图1pc/os-u抢占式内核在/.tC/OS—II多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。
内核提供的基本服务是任务切换。
/xC/OS—II可以管理多达64个任务。
由于设计者建议用户保留8个任务,所以留给用户应用程序最多可有56个任务。
赋予各个任务的优先级必须是不相同的。
/xC/OS—II为每个任务设置独立的堆栈空间,可以快速实现任务切换。
/【上C/OS—II近似地每时每刻总是让优先级最高的就绪任务处于运行状态,为了保证这一点,它在调用系统API函数、中断结束、定时中断结束时总是执行调度算法,IzCIOS—II通过事先计算好数据简化了运算量,通过精心设计就绪表结构使得延时可预知。
/.tC/OS—II已经在世界范围内得到广泛应用,包括很多领域,如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制上。
实际上,I上C/OS-II已经通过了非常严格的测试,并且得到了美国航空管理局(FederalAviationAdministration)的认证,可以用在飞行器上。
这说明p.C/OS—II是稳定可靠的。
除此以外,gC/OS-II的鲜明特点就是源码公开,便于移植和维护。
3ttC/OS-H在¥3C2410上移植可行性分析所谓移植。
就是使这个实时内核能在某个微处理器上运行。
pC/OS—II的框架结构如图2所示。
II处理器无关oSOOREC0SMBoXC0S^伍MCOS_Q.COSSEM.CoSTASKCoSTI朋叵CpC/OS-II.Cla,C/0S-11.HI一一顼厍一一Im.-●…·一·-_I一一覆厍一一l图2i上c./os—II硬件和软件结构图l鳘I4趟缴终端监,J‘在上图可以看出,2个用户任务被建立,高优先级任务先运行,当高优先级任务被挂起时,系统自动切换低优先级任务运行。
显示多任务调度正常运行,从而验证移植成功。
6结束语采用基于ARM9的¥3C2410嵌入式微处理器具备高性能的运算处理能力。
ucosII实验报告(DOC)
实验1《任务的创建、删除、挂起、恢复》实验学时: 2 实验地点:二综x203 实验日期:2013/12/13一、实验目的1.实验环境的建立2.任务的接口函数的应用二、实验内容1.设计一个只有一个任务Task1,当程序运行后任务的工作就是每秒在显示器上显示一个字符“M”。
2.在任务Task1中在创建一个任务Task2 。
当程序运行后,任务Task1的工作在显示器上显示一个字符“M”;Task2 则是在显示器上显示字符“Y”。
3. 要求任务Task2运行20次后,挂起任务Task1;任务Task2运行40次后,恢复任务Task1。
4. 当任务Task1运行5次时,用函数OSSchedLock()对调度器进行加锁;而当任务Task1运行到第10次时,再用函数OSSchedUnlock()对调度器进行解锁,并运行该程序。
5. 使任务Task1能删除任务Task2。
三、实验方法包括实验方法、原理、技术、方案等。
四、实验步骤1.将BC45文件夹拷贝到C分区根目录下。
2.将software文件夹拷贝到任意分区根目录下。
3. 分别完成实验1、2、3、4、5五、实验结果1. DOS窗口每秒显示一个字符“M”。
每行显示10个“M”字符,行与行的间隔是一行。
按ESC键程序退出2. DOS窗口交替显示字符"M"和“Y”,每隔一秒显示一次。
每行显示10个字符,行与行之间的间隔是一行。
按ESC键程序退出3.DOS窗口开始交替显示字符"M"和“Y”,显示20次以后,Task1挂起,只显示“Y”,当Task2运行40次以后,Task1恢复,然后开始Task1,Task2交替运行。
4.DOS窗口开始交题显示字符"M"和“Y”,显示5次以后,Task1将任务调度器上锁,此时只有“M”打印,当Task1运行10次后,Task1,Task2开始交替运行。
5.DOS窗口开始交替显示字符“M”和“Y”,显示10次后,只显示“Y”六、实验结论对实验数据和结果进行分析描述,给出实验取得的成果和结论。
基于ARM9和μC-OS-II的SD卡文件系统
基于ARM9和μC/OS-II的SD卡文件系统随着嵌入式式技术的不断发展,ARM处理器凭借其高性能、廉价、耗能低的优质特性而得到广泛应用。
文中主要针对货车动态称重系统中大量实时载重数据存取的需求,在ARM9嵌入式处理器和μC/OS-II操作系统基础上,设计实现了一种SD卡文件系统。
该系统具有实时性强、存取速率高、易维护,易移植等特点。
1 硬件接口电路设计本系统硬件开发平台处理器为S3C2440A,是三星公司推出的16/32位RISC微处理器,ARM920T内核,主频400 MHz,最高可达533 MHz,内部具有丰富的系统外围控制器和多种通信接口。
SD卡支持SPI和SD 两种通信模式,S3C2440A具有SD卡接口,支持SD总线模式,所以不再像低端的ARM处理器那样采用SPI模式,而是采用SD总线模式,这样可以大大提高SD卡的读写速度。
S3C2440A 与SD卡读写器的接口电路。
SD卡的DAT0~DAT3、CLK(时钟线)和CMD(命令线)分别连接到S3C2440A的SDDATA0~SDDATA3、SDCLK和SDCMD引脚。
SD卡支持单线和宽总线的数据传输,宽总线数据一次传4位,数度更快,因此,此设计采用宽总线方式。
2 SD卡文件系统的设计与实现μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务小型的嵌入式操作系统,它采用可剥离式内核实施任务调度,实时性很强,而且每个任务具有唯一的优先级,能够保证就续表中任务优先级最高的任务优先执行。
μC/OS-II大部分代码是用移植性很高的C语言编写的,只极少部分与处理器密切相关的部分代码用汇编语言编写,因此只需要做很少的工作就可以很方便地将它移植到各种不同构架的微处理器上。
为了增强软件的可移植性,易维护性,程序设计时采用层次化,模块化设计。
模块化结构,除了用来进行管理的操作系统外,共分为4个模块,包括SD卡底层驱动,文件系统,API接口,用户应用程序。
北航ARM9嵌入式系统实验实验三uCOS-II实验
北航ARM9嵌⼊式系统实验实验三uCOS-II实验实验三 uCOS-II实验⼀、实验⽬的在内核移植了uCOS-II 的处理器上创建任务。
⼆、实验内容1)运⾏实验⼗,在超级终端上观察四个任务的切换。
2)任务1~3,每个控制“红”、“绿”、“蓝”⼀种颜⾊的显⽰,适当增加OSTimeDly()的时间,且优先级⾼的任务延时时间加长,以便看清三种颜⾊。
3)引⼊⼀个全局变量BOOLEAN ac_key,解决完整刷屏问题。
4)任务4管理键盘和超级终端,当键盘有输⼊时在超级终端上显⽰相应的字符。
三、预备知识1)掌握在EWARM 集成开发环境中编写和调试程序的基本过程。
2)了解ARM920T 处理器的结构。
3)了解uCOS-II 系统结构。
四、实验设备及⼯具1)2410s教学实验箱2)ARM ADS1.2集成开发环境3)⽤于ARM920T的JTAG仿真器4)串⼝连接线五、实验原理及说明所谓移植,指的是⼀个操作系统可以在某个微处理器或者微控制器上运⾏。
虽然uCOS-II的⼤部分源代码是⽤C语⾔写成的,仍需要⽤C语⾔和汇编语⾔完成⼀些与处理器相关的代码。
⽐如:uCOS-II在读写处理器、寄存器时只能通过汇编语⾔来实现。
因为uCOS-II 在设计的时候就已经充分考虑了可移植性,所以,uCOS-II的移植还是⽐较容易的。
要使uCOS-II可以正常⼯作,处理器必须满⾜以下要求:(1)处理器的C编译器能产⽣可重⼊代码可重⼊的代码指的是⼀段代码(如⼀个函数)可以被多个任务同时调⽤,⽽不必担⼼会破坏数据。
也就是说,可重⼊型函数在任何时候都可以被中断执⾏,过⼀段时间以后⼜可以继续运⾏,⽽不会因为在函数中断的时候被其他的任务重新调⽤,影响函数中的数据。
(2)在程序中可以打开或者关闭中断在uCOS-II中,可以通过OS_ENTER_CRITICAL()或者OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。
这需要处理器的⽀持,在ARM920T的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。
ucos实验报告
ucos实验报告UCOS实验报告引言:UCOS(MicroC/OS-II)是一款轻量级的嵌入式实时操作系统,广泛应用于各种嵌入式设备中。
本篇实验报告将对UCOS的相关实验进行总结和分析,以期对UCOS的特性和应用有更深入的了解。
一、实验目的本次实验的目的是通过搭建UCOS实验环境,学习UCOS的基本概念、原理和使用方法,进一步掌握嵌入式系统的开发和调试技术。
二、实验内容1. UCOS的安装和配置:首先,我们需要下载UCOS的源代码,并将其编译成可执行文件。
然后,根据实验要求配置UCOS的参数,如任务的优先级、堆栈大小等。
2. UCOS任务的创建和管理:在UCOS中,任务是系统的基本执行单元。
我们需要编写任务函数,并通过调用UCOS提供的API函数创建和管理任务。
这样,我们就可以实现多个任务之间的并发执行。
3. UCOS的时间管理:UCOS提供了一套时间管理机制,可以实现任务的定时调度和时间延迟等功能。
我们需要学习如何使用UCOS的时间管理功能,并在实验中进行验证。
4. UCOS的同步与通信:在多任务系统中,任务之间需要进行同步和通信,以实现数据的共享和协调。
UCOS提供了多种同步和通信机制,如信号量、邮箱等。
我们需要学习这些机制的使用方法,并进行相应的实验验证。
5. UCOS的错误处理:在实际应用中,嵌入式系统可能会遇到各种错误和异常情况。
UCOS提供了丰富的错误处理机制,我们需要学习如何使用这些机制来处理错误和异常。
三、实验结果与分析通过对UCOS的实验,我们获得了以下结果和分析:1. UCOS具有良好的可移植性和可扩展性,适用于不同的嵌入式平台和应用场景。
2. UCOS的任务调度算法采用优先级抢占式调度,可以实现任务的实时性和响应性。
3. UCOS的时间管理功能能够满足实时系统对时间约束的要求,提供了精确的时间延迟和定时调度功能。
4. UCOS的同步与通信机制可以实现任务之间的协作和数据共享,提高系统的并发性和效率。
ucosii移植实验报告
一、实验目的●了解uC/OS-II内核的主要结构。
●掌握将uC/OS-II内核移植到Cortex-M3处理器上的基本方法。
二、实验环境与设备●硬件:Cortex-M3嵌入式开发平台、用于Cortex-M3的JTAG仿真器或者内嵌的JTAG仿真器、PC机Pentium100以上。
●软件:PC机操作系统win98、Win2000或WinXP、Keil for ARM或IARfor ARM集成开发环境、仿真器驱动程序、超级终端通讯程序等。
三、预备知识●掌握在Keil for ARM或IAR for ARM集成开发环境中编写和调试程序的基本过程。
●了解Cortex-M3处理器的结构。
●理解uC/OS-II系统结构。
四、实验内容●将uC/OS-II内核移植到Cortex-M3微处理器上。
●编写两个简单任务,在超级终端上观察两个任务的切换。
五、流程图六、实验代码修改后的Os_cpu.h#ifndef OS_CPU_H#define OS_CPU_H#ifdef OS_CPU_GLOBALS#define OS_CPU_EXT#else#define OS_CPU_EXT extern#endiftypedef unsigned char BOOLEAN;typedef unsigned char INT8U; /* Unsigned 8 bit quantity*/typedef signed char INT8S; /* Signed 8 bit quantity */typedef unsigned short INT16U; /* Unsigned 16 bit quantity*/typedef signed short INT16S; /* Signed 16 bit quantity */typedef unsigned int INT32U; /* Unsigned 32 bit quantity */typedef signed int INT32S; /* Signed 32 bit quantity */typedef float FP32; /* Single precision floating point*/typedef double FP64; /* Double precision floating point */typedef unsigned int OS_STK; /* Each stack entry is 32-bit wide */typedef unsigned int OS_CPU_SR; /* Define size of CPU status register (PSR = 32 bits) */#define OS_CRITICAL_METHOD 3u#if OS_CRITICAL_METHOD == 3u#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}#endif#define OS_STK_GROWTH 1u /* Stack grows from HIGH to LOW memory on ARM */#define OS_TASK_SW() OSCtxSw()#if OS_CRITICAL_METHOD == 3u /* See OS_CPU_A.ASM */OS_CPU_SR OS_CPU_SR_Save(void);void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr);#endifvoid OSCtxSw(void);void OSIntCtxSw(void);void OSStartHighRdy(void);void OSPendSV(void);#endif修改后的Os_cpu_c.c#define OS_CPU_GLOBALS#include <ucos_ii.h>#include <includes.h>#if OS_TMR_EN > 0ustatic INT16U OSTmrCtr;#endif#if OS_CPU_HOOKS_EN > 0uvoid OSInitHookBegin (void){#if OS_TMR_EN > 0uOSTmrCtr = 0u;#endif}#endif#if OS_CPU_HOOKS_EN > 0uvoid OSInitHookEnd (void){}#endif#if OS_CPU_HOOKS_EN > 0uvoid OSTaskCreateHook (OS_TCB *ptcb){#if OS_APP_HOOKS_EN > 0uApp_TaskCreateHook(ptcb);#else(void)ptcb; /* Prevent compiler warning */#endif}#endif#if OS_CPU_HOOKS_EN > 0uvoid OSTaskDelHook (OS_TCB *ptcb){#if OS_APP_HOOKS_EN > 0uApp_TaskDelHook(ptcb);#else(void)ptcb; /* Prevent compiler warning */#endif}#endif#if OS_CPU_HOOKS_EN > 0uvoid OSTaskIdleHook (void){#if OS_APP_HOOKS_EN > 0uApp_TaskIdleHook();#endif}#endif#if OS_CPU_HOOKS_EN > 0uvoid OSTaskStatHook (void){#if OS_APP_HOOKS_EN > 0uApp_TaskStatHook();#endif}#endifOS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt){OS_STK *stk;(void)opt; /* 'opt' is not used, prevent warning*/stk = ptos; /* Load stack pointer *//* Registers stacked as if auto-saved on exception */*(stk) = (INT32U)0x01000000uL; /* xPSR */*(--stk)= (INT32U)task; /* Entry Point */*(--stk)= (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will *//* cause fault if ever used) */ *(--stk)= (INT32U)0x12121212uL;/* R12*/*(--stk)= (INT32U)0x03030303uL; /* R3 */*(--stk)= (INT32U)0x02020202uL /* R2 */*(--stk)=(INT32U)0x01010101uL; /* R1 */*(--stk)=(INT32U)p_arg; /* R0 : argument *//* Remaining registers saved on process stack */*(--stk)=(INT32U)0x11111111uL; /* R11 */*(--stk)=(INT32U)0x10101010uL; /* R10 */*(--stk)=(INT32U)0x09090909uL; /* R9 */*(--stk)=(INT32U)0x08080808uL; /* R8 */*(--stk)=(INT32U)0x07070707uL; /* R7 */*(--stk)=(INT32U)0x06060606uL; /* R6 */*(--stk)=(INT32U)0x05050505uL; /* R5 */*(--stk)=(INT32U)0x04040404uL; /* R4 */return (stk);}#if (OS_CPU_HOOKS_EN > 0u) && (OS_TASK_SW_HOOK_EN > 0u)void OSTaskSwHook (void){#if OS_APP_HOOKS_EN > 0uApp_TaskSwHook();#endif}#endif#if OS_CPU_HOOKS_EN > 0uvoid OSTCBInitHook (OS_TCB *ptcb){#if OS_APP_HOOKS_EN > 0uApp_TCBInitHook(ptcb);#else(void)ptcb; /* Prevent compiler warning */#endif}#endif#if (OS_CPU_HOOKS_EN > 0u) && (OS_TIME_TICK_HOOK_EN > 0u)void OSTimeTickHook (void){#if OS_APP_HOOKS_EN > 0uApp_TimeTickHook();#endif#if OS_TMR_EN > 0uOSTmrCtr++;if (OSTmrCtr >= (OS_TICKS_PER_SEC / OS_TMR_CFG_TICKS_PER_SEC)) { OSTmrCtr = 0;OSTmrSignal();}#endif}#endif修改后的Os_cpu_a.asmEXTERN OSRunningEXTERN OSPrioCurEXTERN OSPrioHighRdyEXTERN OSTCBCurEXTERN OSTCBHighRdyEXTERN OSIntExitEXTERN OSTaskSwHookEXPORT OS_CPU_SR_SaveEXPORT OS_CPU_SR_RestoreEXPORT OSStartHighRdyEXPORT OSCtxSwEXPORT OSIntCtxSwEXPORT OSPendSVNVIC_INT_CTRL EQU 0xE000ED04; Interrupt control state register.NVIC_SYSPRI14 EQU 0xE000ED22 System priority register (priority 14).NVIC_PENDSV_PRI EQU 0xFF; PendSV priority value (lowest).NVIC_PENDSVSET EQU 0x10000000; Value to trigger PendSV exception.PRESERVE8 ;The AAPCS requires that the stack-pointer be 8-byte aligned on entry to a conforming function.AREA UCOSII_ASM, CODE, READONLY THUMBOS_CPU_SR_SaveMRS R0, PRIMASK ; Set prio int mask to mask all (except faults)CPSID IBX LROS_CPU_SR_RestoreMSR PRIMASK, R0BX LROSStartHighRdyLDR R0, =NVIC_SYSPRI14; Set the PendSV exception priorityLDR R1, =NVIC_PENDSV_PRISTRB R1, [R0]MOV R0, #; Set the PSP to 0 for initial context switch callMSR PSP, R0LDR R0, =OSRunning ; OSRunning = TRUEMOV R1, #1STRB R1, [R0]LDR R0, =NVIC_INT_CTRL; Trigger the PendSV exception (causes context switch)LDR R1, =NVIC_PENDSVSETSTR R1, [R0]CPSIE I ; Enable interrupts at processor levelOSStartHangB OSStartHang; Should never get hereOSCtxSwLDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch)LDR R1, =NVIC_PENDSVSETSTR R1, [R0]BX LROSIntCtxSwLDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch)LDR R1, =NVIC_PENDSVSETSTR R1, [R0]BX LROSPendSVCPSID I ; Prevent interruption during context switchMRS R0, PSP ; PSP is process stack pointerCBZ R0, OSPendSV_nosave ; Skip register save the first timeSUB R0, R0, #0x20 ; Save remaining regs r4-11 on process stackSTM R0, {R4-R11}LDR R1, =OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP;LDR R1, [R1]STR R0, [R1] ; R0 is SP of process being switched out; At this point, entire context of process has been savedOSPendSV_nosavePUSH {R14} ; Save LR exc_return valueLDR R0, =OSTaskSwHook; OSTaskSwHook();BLX R0POP {R14}LDR R0, =OSPrioCur ; OSPrioCur = OSPrioHighRdy;LDR R1, =OSPrioHighRdyLDRB R2, [R1]STRB R2, [R0]LDR R0, =OSTCBCur ; OSTCBCur = OSTCBHighRdy;LDR R1, =OSTCBHighRdyLDR R2, [R1]STR R2, [R0]LDR R0, [R2] ; R0 is new process SP; SP = OSTCBHighRdy->OSTCBStkPtr; LDM R0, {R4-R11}; Restore r4-11 from new process stackADDS R0, R0, #0x20MSR PSP, R0; Load PSP with new process SPORR LR, LR, #0x04 Ensure exception return uses process stackCPSIE IBX LR ; Exception return will restore remaining context ALIG主函数APP.C#include<includes.h>#include "utils/uartstdio.h"#include "lwip/sys.h"#define TASK1_PRIO 11#define TASK2_PRIO 3#define task1stck 1024#define task2stck 1024#include "systemInit.h"#define LED_PERIPH SYSCTL_PERIPH_GPIOF#define LED_PORT GPIO_PORTF_BASE#define LED_PIN GPIO_PIN_2#define LED_PINN GPIO_PIN_3void LED0_stack(void *p_arg){//jtagWait( );clockInit( );SysCtlPeriEnable(LED_PERIPH);GPIOPinTypeOut(LED_PORT, LED_PIN);for (;;){GPIOPinWrite(LED_PORT, LED_PIN, 0x00);OSTimeDly(OS_TICKS_PER_SEC / 4);GPIOPinWrite(LED_PORT, LED_PIN, 0xFF);OSTimeDly(OS_TICKS_PER_SEC / 4);}}void LED1_stack(void *p_arg){//jtagWait( );clockInit( );SysCtlPeriEnable(LED_PERIPH);GPIOPinTypeOut(LED_PORT, LED_PINN);for (;;){GPIOPinWrite(LED_PORT, LED_PINN, 0x00);OSTimeDly(OS_TICKS_PER_SEC / 4);zGPIOPinWrite(LED_PORT, LED_PINN, 0xFF);OSTimeDly(OS_TICKS_PER_SEC / 4);}}static void App_TaskStart (void *p_arg);int main (void){BSP_PreInit ();BSP_IntDisAll();OSInit();OSTaskCreateExt((void (*)(void *)) App_TaskStart,(void *) 0,(OS_STK *)&App_TaskStartStk[APP_CFG_TASK_START_STK_SIZE - 1], (INT8U ) APP_CFG_TASK_START_PRIO,(INT16U ) APP_CFG_TASK_START_PRIO,(OS_STK *)&App_TaskStartStk[0],(INT32U ) APP_CFG_TASK_START_STK_SIZE,(void *) 0,(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));OSTaskCreate(LED0_stack,(void *)0,&App_TaskStartStk1[ APP_CFG_TASK_START_STK_SIZE -1],0);OSTaskCreate(LED1_stack,(void *)0,&App_TaskStartStk2[ APP_CFG_TASK_START_STK_SIZE -1],1);OSStart(); //4 os start}static void App_TaskStart (void *p_arg){(void)p_arg;BSP_PostInit();Tmr_TickInit ();#if (OS_TASK_STAT_EN > 0)OSStatInit(); #endiffor(;;){OSTimeDlyHMSM(0, 0, 2, 0); UARTprintf("\033[2JI am task1\n");}}。
ARM9实验报告
班级学号姓名日期实验一Linux命令的使用及演示程序的运行一、实验目的:掌握超级终端的使用,熟悉常用Linux命令的使用,并在Linux环境下运行演示程序。
二、实验内容:1、掌握超级终端的使用,自行建立超级终端并与ARM9开发系统连接;2、熟悉常用Linux命令,理解Linux文件系统;3、在Linux下运行系统提供的演示程序,观察程序运行情况。
三、实验设备及工具(包括软件调试工具)硬件:ARM 嵌入式开发平台、PC 机、串口线。
软件:PC 机操作系统Win2000 或WinXP、超级终端通讯程序。
四、实验过程记录:五、回答下列问题:1、列举常用Linux命令并解释功能及用法2、超级终端的作用是什么?如何建立一个超级终端3、请列举运行演示程序需要哪些步骤。
班级学号姓名日期实验二ADS1.2开发环境及绘图API函数实验一、实验目的:ADS1.2开发环境的使用。
并进行绘图API函数的实验。
二、实验内容:1、掌握ADS1.2开发环境和调试环境AXD的使用。
2、打开系统移植试验工程文件,并调试观察运行结果。
3、进一步掌握ADS1.2开发环境的使用及调试方法。
4、打开绘图API函数工程文件,调试并观察运行的结果;5、修改该工程文件调试并观察运行的结果。
三、实验设备及工具(包括软件调试工具)硬件:ARM 嵌入式开发平台、PC 机、用于ARM9开发平台的JTAG 仿真器、串口线。
软件:PC 机操作系统Win2000 或WinXP、ARM ADS1.2 集成开发环境、仿真器驱动程序。
四、实验过程记录:五、回答下列问题:1、UarmJtag.exe的作用是什么。
在ARM9开发平台上使用时应该如何设置。
2、AXD是什么工具?在和UarmJtag配合使用时应该如何设置。
3、简述ADS1.2工程文件的结构,及建立一个工程的大致步骤。
4、什么是API函数,其作用如何?5、AXD的使用大致有哪些步骤?如何设置及取消断点。
6、简单描述绘图API函数的使用。
嵌入式系统设计与实例开发实验——ARM与COS-Ⅱ北京航
8
Touch_Screen_Task 流程
开始
是
触摸动作不是按下 也不是移动?
否
否
有触摸动作? !TCHSCR_IsPenNot Down()? 是 得到触摸点坐标
抬起?
否
是 触摸动作为抬起 触摸点坐标为上次 触摸点坐标 否 得到触摸点坐标
是
在规定的时间内抬 起?
否 触摸点变化?
是 是 在规定的双击时间 内按下? 否 触摸动作为按下 触摸动作为移动
触摸动作为双击
触摸动作为单击
9
电子画板程序流程
创 建 按 钮 , 绘 图窗口 触摸屏消息? Y
按触 钮摸 直 线 钮触 摸 圆 按 区触 域摸 绘 图 按触 钮摸 曲 线 按触 钮摸 清 屏
N
绘 图 状 态 为 直 线
绘 图 状 态 为 画 圆
绘 图 状 态 为 曲 线
绘 图 状 态 为 清 屏
N Line_State=0 ? Y Line_State=1 移动 按 下 移 动
1.
查询用户对触摸屏的操作
2.
产生相应的消息:
TCHSCR_ACTION_CLICK
触摸屏单击
TCHSCR_ACCTION_DOWN 触摸屏按下
TCHSCR_ACTION_UP
TCHSCR_ACTION_MOVE
触摸屏抬起
触摸屏移动
11
多层复合薄膜:
玻璃基层 透明导电层 透明绝缘隔离点 透明导电层 表面硬化塑料层
5
触摸点的测量
6
触摸点的测量(2)
x= LCDWIDTH * Vx/ V
y= LCDHEIGHT *Vy/ V
嵌入式实时操作系统ucosII
嵌入式实时操作系统ucosIIucosII是一款源代码公开、可免费使用的嵌入式实时操作系统。
它是由德国嵌入式系统专家brosse于1992年编写完成的,主要适用于嵌入式系统的开发。
ucosII具有源代码短小精悍、可移植性好、稳定性高等优点,被广泛应用于各种嵌入式系统中。
源代码短小精悍:ucosII的源代码只有几百KB,相对于其他RTOS来说,其代码量较小,易于理解和修改。
可移植性好:ucosII采用了可移植性的设计方法,可以在不同的处理器和编译器上进行移植和优化。
稳定性高:ucosII在各种嵌入式系统中得到了广泛应用,其稳定性和可靠性得到了充分的验证。
支持多任务:ucosII支持多任务处理,可以同时运行多个任务,提高系统的效率和响应速度。
实时性:ucosII具有较高的实时性,可以满足各种实时性要求高的应用场景。
可扩展性:ucosII具有较好的可扩展性,可以根据需要进行功能扩展和优化。
系统内核:包括任务调度、任务管理、时间管理、内存管理等核心功能。
中断处理程序:处理各种中断请求,包括硬件中断、软件中断等。
系统API:提供了一套完善的API函数,方便应用程序的开发和调试。
调试和测试工具:包括各种调试和测试工具,如内存检查工具、性能分析工具等。
ucosII被广泛应用于各种嵌入式系统中,如工业控制、智能家居、智能交通、航空航天等。
其应用场景涵盖了消费类电子产品、医疗设备、通信设备、汽车电子等领域。
ucosII作为一款源代码公开、可免费使用的嵌入式实时操作系统,具有短小精悍、可移植性好、稳定性高等优点。
它广泛应用于各种嵌入式系统中,为应用程序的开发提供了便利和支持。
其可扩展性和实时性也使得它在各种领域中具有广泛的应用前景。
随着嵌入式系统的广泛应用,对嵌入式操作系统的需求也日益增长。
uCOSII是一种流行的实时嵌入式操作系统,具有轻量级、实时性、可扩展性等优点。
本文将介绍如何在AT91平台上实现uCOSII的移植。
基于ARM9的μCOSⅡ嵌入式系统移植设计
大庆师范学院本科生毕业论文基于ARM9上的μC/OS-Ⅱ嵌入式系统移植-院(系)物理与电气信息工程专业电子信息工程研究方向嵌入式摘要随着计算机和电子技术的发展,越来越多的嵌入式产品出现在人们的日常生活和工业生产之中。
由于嵌入式设备的智能型,使得生活和生产变得极为方便,由此也带来了嵌入式操作系统的迅速发展。
μC/OS-Ⅱ内核作为一种代码公开的嵌入式实时操作系统,ARM9以内核耗电少,成本低,二者相互搭配,构成了较为完美的搭配组合。
本文主要讲述的是μC/OS-Ⅱ在ARM9上的系统移植问题。
关键词:μC/OS-Ⅱ;Arm9;移植AbstractWith the development of computer and electronic technology, embedded has become an indispensable part of modern society. Big to industrial production, such as aerospace, small to daily life, such as smart card applications, many devices are built into the embedded, makes the equipment or device has a high automation performance and some degree of intelligence, great convenience to people's production and living needs, and thus also brought the rapid development of the embedded operating system. Mu C/OS - Ⅱkernel code, as a kind of open embedded real-time operating system, the ARM kernel, less consumption, lower cost, the two match each other, form the relatively perfect collocation. This article mainly tells the mu C/OS - Ⅱportability issues on the ARM of the system.Keywords: u C/OS - Ⅱ; Arm; transplant目录第一章嵌入式系统基础 (5)1.1 嵌入式系统概述 (5)1.2 嵌入式体系硬件基础 (5)1.3 嵌入式体系软件基础 (6)第二章μC/OS-II介绍 (6)第三章ARM9介绍 (7)第四章μC/OS-Ⅱ在S3C2440上的移植 (8)4.1 移植环境简介 (8)4.2 移植条件 (8)4.3 移植步骤 (8)4.3.1 INCLUDES.H (9)4.3.2 OS_CFG.H (9)4.3.3 OS_CPU.H 文件 (9)4.3.4 OS_CPU_C.C 文件 (10)4.3.4.1 OSTaskStkInt() (10)4.3.4.2 OSTaskCreateHook() (10)4.3.4.3OSTaskDelHook() (10)4.3.4.4 OSTaskSwHook() (11)4.3.4.5 OSTaskStatHook() (11)4.3.4.6 OSTimeTickHook() (11)4.3.5 OS_CPU_A.ASM 文件 (11)4.3.5.1 OSStartHighRdy() (11)4.3.5.2 OSCtxSw() (12)4.3.5.3 OSIntCtxSw() (12)4.3.5.4 OSTickISR() (12)4.4 移植测试 (12)第五章实例移植 (13)5.1 工程创建 (13)5.2 工程设置 (14)5.3 实例调试 (18)第六章结束语 (18)参考文献 (19)谢辞 (20)第一章嵌入式系统基础1.1 嵌入式系统概述基于计算机技术,以应用为中心,且软硬件可裁剪,对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统,叫做嵌入式系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三UC-OS移植实验一、实验目的在内核移植了uCOS-II 的处理器上创建任务。
二、实验内容1.运行实验十,在超级终端上观察四个任务的切换。
2. 任务1~3,每个控制“红”、“绿”、“蓝”一种颜色的显示,适当增加OSTimeDly()的时间,且优先级高的任务延时时间加长,以便看清三种颜色。
3.引入一个全局变量BOOLEAN ac_key,解决完整刷屏问题。
#define RdURXH0()当键盘有输入时在超级终端上显示相应的字符。
三、实验设备硬件:ARM嵌入式开发平台、用于ARM920T的JTAG仿真器、PC机Pentium100以上。
软件:PC机操作系统Win2000或WinXP、ARM ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。
四、实验原理所谓移植,指的是一个操作系统可以在某个微处理器或者微控制器上运行。
虽然uCOS-II的大部分源代码是用C语言写成的,仍需要用C语言和汇编语言完成一些与处理器相关的代码。
比如:uCOS-II在读写处理器、寄存器时只能通过汇编语言来实现。
因为uCOS-II在设计的时候就己经充分考虑了可移植性,所以,uCOS-II的移植还是比较容易的。
要使uCOS一工工可以正常工作,处理器必须满足以下要求:1)处理器的C编译器能产生可重入代码。
2)在程序中可以打开或者关闭中断。
3)处理器支持中断,并A能产生定时中断(通常在10Hz}1000Hz之间)。
4)处理器支持能够容纳一定量数据的硬件堆栈。
5)处理器有将堆栈指针和其它CPU寄存器存储和读出到堆栈(或者内存)的指令。
uCOS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。
所以,寄存器的入栈和出栈是uCOS一工工多任务调度的基础。
五、实验步骤1 以实验十为模板,将实验六inc目录下的LCD320.H 和src目录下的LCD640.C 拷到模板下的相应目录,将LCD640.C加入工程中。
2包含以下头文件#include “inc/lcd320.h”。
3改LCD640.C 文件中包含头文件的路径。
#include "../inc/drv/reg2410.h"4 声明引用的变量extern U32 LCDBufferII2[LCDHEIGHT][LCDWIDTH];六、源程序#include"../ucos-ii/includes.h" /* uC/OS interface */#include "../ucos-ii/add/osaddition.h"#include "../inc/drivers.h"#include "../inc/sys/lib.h"#include "../src/gui/gui.h"#include "../inc/lcd320.h"#include <string.h>#include <stdio.h>//#include "..inc/lcd320.h"//#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihostingOS_EVENT *MboxSem;///******************任务定义***************////*OS_STK SYS_Task_Stack[STACKSIZE]= {0, }; //system task刷新任务堆栈#define SYS_Task_Prio 1void SYS_Task(void *Id);*/OS_STK task1_Stack[STACKSIZE]={0, }; //Main_Test_Task堆栈void Task1(void *Id); //Main_Test_Task#define Task1_Prio 12OS_STK task2_Stack[STACKSIZE]={0, }; //test_Test_Task堆栈void Task2(void *Id); //test_Test_Task#define Task2_Prio 15OS_STK task3_Stack[STACKSIZE]={0, }; //test_Test_Task堆栈void Task3(void *Id); //test_Test_Task#define Task3_Prio 17OS_STK task4_Stack[STACKSIZE]={0, }; //test_Test_Task堆栈void Task4(void *Id); //test_Test_Task#define Task4_Prio 10extern U32 LCDBufferII2[LCDHEIGHT][LCDWIDTH];extern BOOLEAN ac_key=1;int k,j;/**************已经定义的OS任务*************#define SYS_Task_Prio 1#define Touch_Screen_Task_Prio 9#define Main_Task_Prio 12#define Key_Scan_Task_Prio 58#define Lcd_Fresh_prio 59#define Led_Flash_Prio 60***************************************////////////*****************事件定义*****************////////////////////////////////////////////////////////// Main function. //////////////////////////////////////////////////////int main(void){ARMTargetInit(); // do target (uHAL based ARM system) initialisation //OSInit(); // needed by uC/OS-II //LCD_Init();//OSTaskCreate(SYS_Task, (void *)0, (OS_STK *)&SYS_Task_Stack[STACKSIZE-1], SYS_Task_Prio);OSTaskCreate(Task1, (void *)0, (OS_STK *)&task1_Stack[STACKSIZE-1], Task1_Prio);OSTaskCreate(Task2, (void *)0, (OS_STK *)&task2_Stack[STACKSIZE-1], Task2_Prio);OSTaskCreate(Task3, (void *)0, (OS_STK *)&task3_Stack[STACKSIZE-1], Task3_Prio);OSTaskCreate(Task4, (void *)0, (OS_STK *)&task4_Stack[STACKSIZE-1], Task4_Prio);OSAddTask_Init(0);BSPprintf(0,"Starting uCOS-II...\n");OSStart(); // start the OS //// never reached //return 0;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////void Task1(void *Id){for(;;){ if(ac_key==1){ ac_key=0;BSPprintf(0,"RED%\n\n");for (k=0;k<480;k++)LCDBufferII2[k][j]=0x000000ff;LCD_Refresh();OSTimeDly(10000);ac_key=1;}}}void Task2(void *Id){for(;;){ if(ac_key==1){ ac_key=0;BSPprintf(0,"GREEN%\n\n");for (k=0;k<480;k++)for (j=0;j<640;j++)LCDBufferII2[k][j]=0x0000fc00;LCD_Refresh();ac_key=1;OSTimeDly(8000);}}}void Task3(void *Id){for(;;){ if(ac_key==1){ ac_key=0;BSPprintf(0,"BLUE%\n\n");for (k=0;k<480;k++)for (j=0;j<640;j++)LCDBufferII2[k][j]=0x00f80000;LCD_Refresh();ac_key=1;OSTimeDly(6000);}}}void Task4(void *Id){char s;for(;;){ac_key=0;{s=RdURXH0();OSTimeDly(100);BSPprintf(0,"%c\n\n",s);}ac_key=1;OSTimeDly(100);}}七、实验思考题1、如何提高键盘的响应速度?答:提高优先级,减少延时时间。
2、全局变量ac_key对共享资源管理有何意义?答:设置标志位,进入任务以后,判断标志位,通过,进行刷屏操作,全部显示完成后,标志位置位。
允许其他任务执行。
总之,它能解决不能完整刷屏问题。