μCOSII系统移植2
- 格式:doc
- 大小:1.19 MB
- 文档页数:5
目录摘要 (1)关键词 (1)1 引言 (1)2 μC/OS-II简介 (2)2.1 μC/OS-II的特点 (2)2.2 μC/OS-II的体系结构 (3)3 移植规划 (3)3.1 移植条件 (3)3.1.1 可重入代码与非可重入代码 (4)3.1.2 OS_ENTER_CRITICAL( )与OS_EXIT_CRITICAL( ) (4)3.2 移植要求 (4)3.3 移植需要编写的文件 (4)3.4 移植代码包括的主要内容 (5)3.5 编译器的选择 (5)4 移植的实现 (6)4.1 OS_CPU.H的移植 (6)4.1.1数据类型的定义 (6)4.1.2堆栈的定义 (6)4.1.3中断与临界区代码 (7)4.1.4使用软中断SWI作底层接口 (8)4.2 OS_CPU_C.C的移植 (9)4.2.1 OSTaskStkInit( ) (9)4.2.2 Hook( )函数 (10)4.3 OS_CPU_A.ASM的移植 (11)4.3.1 OSStartHighRdy()函数 (11)4.3.2 OSCtxSw( )函数 (12)4.3.3 OSIntCtxSw()函数 (13)4.3.4 OSTickISR()函数 (14)5 嵌入式系统的初始化 (16)5.1初始化程序的下载执行 (16)5.2嵌入式系统的初始化过程 (17)5.2.1硬件初始化阶段 (17)5.2.2 RTOS初始化阶段 (18)5.3 ARM920T系统初始化的一般过程 (19)5.3.1设置程序入口指针 (19)5.3.2设置中断向量 (19)5.4初始化存储器系统 (20)5.4.1存储器地址分布 (20)5.4.2 ROM地址重映射的实现 (20)5.5初始化堆栈 (21)5.6初始化应用程序执行环境 (22)5.6.1初始化C环境 (22)5.6.2改变处理器模式 (23)5.6.3调用C程序 (23)5.7 uC/OS系统的初始化 (23)5.7.1 ARM的硬件抽象层——uHALuC/OS (24)5.7.2 ARMTargetInit()函数结构 (24)5.7.3 uHAL的功能 (25)6 移植测试 (25)6.1测试移植代码 (25)6.1.1确保C编译器、汇编编译器及链接器正常工作 (25)6.1.2验证OSTskStkInit() 和OSStartHighRdy()函数 (25)6.1.3验证OSCtxSw() 函数 (26)6.1.4验证OSIntCtxSw()和OSTickISR()函数 (26)6.2在S3C2440上测试移植结果 (26)6.2.1编译uCOS2 (26)6.2.2把uCOS2下载到内存中运行 (28)7 结论 (30)致谢 (31)参考文献 (31)英文翻译 (32)实时操作系统μC/OS-II在ARM上的移植研究陈利顺重庆三峡学院物理与电子工程学院电子信息工程专业06级重庆万州 404000摘要本设计采用三星公司生产的一款基于ARM920T核的高性能低功耗soc芯片S3C2440作为移植的硬件平台。
基于ARM架构的μC/OS-II移植及其实时同步交流采样随着微处理器技术与信息技术的不断发展,嵌入式系统的应用也进入到国防、工业、能源、交通以及日常生活中的各个领域。
嵌入式系统的软件核心是嵌入式操作系统。
然而,国内在嵌入式系统软件开发上有很多困难,主要有:国外成熟的RTOS大都价格昂贵并且不公开源代码,用好这些操作系统需对计算机体系结构有深刻理解。
针对以上问题,免费公开源代码的嵌入式操作系统就倍受瞩目了,μC/OS-II就是其中之一。
μC/OS-II是面向中小型应用的、基于优先级的可剥夺嵌入式实时内核,其特点是小巧、性能稳定、可免费获得源代码。
本文在深入研究μC/OS-II内核基础上,将其运用于实际课题,完成了基于ARM架构的μC/OS-II移植及实时同步交流采样的误差补偿研究。
本文主要工作内容和研究成果如下:1.剖析了μC/OS-II操作系统内核,重点研究了μC/OS-II内核的任务管理与调度算法机理,得出了μC/OS-II内核优点:任务调度算法简洁、高效、实时性较好(与Linux相比)。
2.介绍了ARM9体系架构,重点讲叙了MMU(存储管理单元)功能。
为了提高交流采样系统的取指令和读数据速度,成功将MMU功能应用于本嵌入式系统中。
3.完成了μC/OS-II操作系统在目标板上的移植,主要用汇编语言编写了启动代码、开关中断、任务切换和首次任务切换等函数。
4.针对国内外提出的同步交流采样误差补偿算法的局限性,本文从理论上对同步交流采样的准确误差进行了研究,并尝试根据被测信号周期的首尾过零点的三角形相似法,求出误差参数并对误差进行补偿。
此外,考虑到采样周期ΔT不均匀,经多次采样后会产生累积误差,本文也给出了采样周期ΔT的优化算法。
5.完成了系统硬件设计,并根据补偿算法和ΔT优化法则,编写了相应采样驱动和串口驱动。
最后对实验数据进行了分析和比较,得出重要结论:该补偿算法实现简单,计算机工作量小,精度较高。
引言---实时操作系统地使用,能够简化嵌入式系统地应用开发,有效地确保稳定性和可靠性,便于维护和二次开发.μC/OS-II是一个基于抢占式地实时多任务内核,可固化、可剪裁、具有高稳定性和可靠性,除此以外,μC/OS-II地鲜明特点就是源码公开,便于移植和维护.在μC/OS-II官方地主页上可以查找到一个比较全面地移植范例列表.但是,在实际地开发项目中,仍然没有针对项目所采用芯片或开发工具地合适版本.那么,不妨自己根据需要进行移植.本文则以在TMS320C6711 DSP上地移植过程为例,分析了μC/OS-II在嵌入式开发平台上进行移植地一般方法和技巧.μC/OS-II移植地基本步骤在选定了系统平台和开发工具之后,进行μC/OS-II地移植工作,一般需要遵循以下地几个步骤:● 深入了解所采用地系统核心● 分析所采用地C语言开发工具地特点● 编写移植代码● 进行移植地测试● 针对项目地开发平台,封装服务函数<类似80x86版本地PC.C和PC.H)系统核心无论项目所采用地系统核心是MCU、DSP、MPU,进行μC/OS-II地移植时,所需要关注地细节都是相近地.首先,是芯片地中断处理机制,如何开启、屏蔽中断,可否保存前一次中断状态等.还有,芯片是否有软中断或是陷阱指令,又是如何触发地.此外,还需关注系统对于存储器地使用机制,诸如内存地地址空间,堆栈地增长方向,有无批量压栈地指令等.在本例中,使用地是TMS320C6711 DSP.这是TI公司6000系列中地一款浮点型号,因为其时钟频率非常高,且采用了超常指令字<VLIW)结构、类RISC指令集、多级流水等技术,所以运算性能相当强大,在通信设备、图像处理、医疗仪器等方面都有着广泛地应用.在C6711中,中断有3种类型,即复位、不可屏蔽中断<NMI)和可屏蔽中断<INT4-INT15).可屏蔽中断由CSR寄存器控制全局使能, 此外也可用IER寄存器分别置位使能.而在C6711中并没有软中断机制,所以μC/OS-II地任务切换需要编写一个专门地函数实现.此外,C6711也没有专门地中断返回指令、批量压栈指令,所以相应地任务切换代码均需编程完成.因为采用了类RISC核心,C6711地内核结构中,只有A0-A15和B0-B15这两组32bit地通用寄存器.C语言开发工具无论所使用地系统核心是什么,C语言开发工具对于μC/OS-II是必不可少地. 最简单地信息可以从开发工具地手册中查找,比如:C语言各种数据类型分别编译为多少字节;是否支持嵌入式汇编,格式要求怎样;是否支持“interrupt”非标准关键字声明地中断函数;是否支持汇编代码列表(list>功能,等等.上述地这样一些特性,会给嵌入式地开发带来很多便利.TI地C语言开发工具CCS for C6000就包含上述地所有功能.而在此基础上,可以进一步地弄清开发工具地一些技术细节,以便进行之后真正地移植工作.首先,开启C编译器地“汇编代码列表(list>”功能,这样编译器就会为每个C 语言源文件生成其对应地汇编代码文件.在CCS开发环境中地方法是:在菜单“/Project/Build options”地“Feedback”栏中选择“Interlisting:Opt/C and ASM(-s>”;或者,也可以直接在CCS地C编译命令行中加上“-s”参数.然后分别编写几个简单地函数进行编译,比较C源代码和编译生成地汇编代码.例如:void FUNC_TEMP (void>{Func_tmp2(>。
第六章μC O S-I I操作系统基础及其移植开发初步μCOS-II内核作为一种代码公开的嵌入式实时操作系统内核非常有特色,在规模不大的代码内实现了抢占式任务调度和多任务间通信等功能,任务调度算法也很有独特。
该内核裁剪到最小状态后编译出来只有8K左右,全部内核功能(添加LWIP网络协议栈等)也就100K 左右,资源消耗非常小。
市面上一些ARM微处理器片上所带内存就已经足够一个裁剪合适的内核的简单应用,非常方便产品的开发设计。
当前,μCOS-II是一个基本完整的嵌入式操作系统解决方案套件,包括μC/TCP-IP(IP 网络协议栈)、μC/FS(文件系统)、μC/GUI(图形界面)、μC/USB(USB驱动)、μC/FL(Flash加载器)等部件。
但是这些部件不是公开代码的。
还有一些比较重要的可能在嵌入式环境中发挥重要重要作用的部件,包括嵌入式数据库、POSIX兼容性接口、常用设备的驱动模块等。
将来这个行业还会产生更多的重要部件需求,在互联网上的开源社区通常能够找到相应的开源代码包,并且可以进行移植。
6.1 实时操作系统基本原理与技术本节将主要讲述实时操作系统的基本原理和技术,通过对本章的学习读者可以了解掌握RTOS(Real Time operation System,实时操作系统)的基本特征、结构体系、重要指标、性能参数等重要理论,为全面掌握RTOS打下基础。
6.1.1 实时操作系统基本特征根据IEEE实时UNIX分委会对实时操作系统的定义,实时操作系统的基本特征应表现为以下几个方面:∙实时性:对外部事件作出反应的时间必须在限定的时间内,在某些情况下还需要是确定的,可重复实现的,不管当时系统内部状态如何,都是可预测的;∙异步并发事件响应能力:异步事件是指无一定时序关键随机发生的事件。
如外部设备完成数据传输,实时控制设备出现异常情况等。
实际环境中,嵌入式实时系统处理的外部事件往往不是单一的,这些事件往往同时出现,而且发生的时刻也是随机的,即异步的。
移植 µC/OS-Ⅱ Ⅱ这一章介绍如何将 µC/OS-Ⅱ移植到不同的处理器上。
所谓移植,就是使一个实时内核 能在某个微处理器或微控制器上运行。
为了方便移植,大部分的 µC/OS-Ⅱ代码是用 C 语言 写的;但仍需要用 C 和汇编语言写一些与处理器相关的代码,这是因为 µC/OS-Ⅱ在读写处 理器寄存器时只能通过汇编语言来实现。
由于 µC/OS-Ⅱ在设计时就已经充分考虑了可移植 性,所以 µC/OS-Ⅱ的移植相对来说是比较容易的。
如果已经有人在您使用的处理器上成功 地移植了 µC/OS-Ⅱ,您也得到了相关代码,就不必看本章了。
当然,本章介绍的内容将有 助于用户了解 µC/OS-Ⅱ中与处理器相关的代码。
要使 µC/OS-Ⅱ正常运行,处理器必须满足以下要求: 1. 处理器的 C 编译器能产生可重入代码。
2. 用 C 语言就可以打开和关闭中断。
3. 处理器支持中断,并且能产生定时中断(通常在 10 至 100Hz 之间)。
4. 处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。
5. 处理器有将堆栈指针和其它 CPU 寄存器读出和存储到堆栈或内存中的指令。
像 Motorola 6805 系列的处理器不能满足上面的第 4 条和第 5 条要求,所以 µC/OS-Ⅱ 不能在这类处理器上运行。
图 8.1 说明了 µC/OS-Ⅱ的结构以及它与硬件的关系。
由于 µC/OS-Ⅱ为自由软件,当用 户用到 µC/OS-Ⅱ时,有责任公开应用软件和 µC/OS-Ⅱ的配置代码。
这本书和磁盘包含了所 有与处理器无关的代码和 Intel 80x86 实模式下的与处理器相关的代码(C 编译器大模式下 编译) 。
如果用户打算在其它处理器上使用 µC/OS-Ⅱ,最好能找到一个现成的移植实例,如 果没有只好自己编写了。
TMS320F28335的uCOSⅡ移植TMS320F28335的uC-OSⅡ移植1、 uC-OSII 的原理uC-OSII 包括任务调度、时间管理、内存管理、资源管理(信号量、邮箱、消息队列)四⼤部分,没有⽂件系统、⽹络接⼝、输⼊输出界⾯。
它的移植只与 4 个⽂件相关:汇编⽂件(OS_CPU_A.ASM)、处理器相关C ⽂件(OS_CPU.H、OS_CPU_C.C)和配置⽂件(OS_CFG.H)。
有64 个优先级,系统占⽤8 个,⽤户可创建56 个任务,不⽀持时间⽚轮转。
它的基本思路就是“近似地每时每刻总是让优先级最⾼的就绪任务处于运⾏状态” 。
为了保证这⼀点,它在调⽤系统API 函数、中断结束、定时中断结束时总是执⾏调度算法。
原作者通过事先计算好数据,简化了运算量,通过精⼼设计就绪表结构,使得延时可预知。
任务的切换是通过模拟⼀次中断实现的。
uC-OSII ⼯作核⼼原理是:近似地让最⾼优先级的就绪任务处于运⾏状态。
操作系统将在下⾯情况中进⾏任务调度:调⽤API 函数( ⽤户主动调⽤), 中断( 系统占⽤的时间⽚中断OsTimeTick(),⽤户使⽤的中断)。
其整体整体思路如下。
(1)、在调⽤API 函数时,有可能引起阻塞,如果系统API 函数察觉到运⾏条件不满⾜,需要切换就调⽤OSSched()调度函数,这个过程是系统⾃动完成的,⽤户没有参与。
OSSched()判断是否切换,如果需要切换,则此函数调⽤OS_TASK_SW()。
这个函数模拟⼀次中断,好象程序被中断打断了,其实是OS 故意制造的假象,⽬的是为了任务切换。
既然是中断,那么返回地址(即紧邻OS_TASK_SW()的下⼀条汇编指令的PC 地址)就被⾃动压⼊堆栈,接着在中断程序⾥保存CPU寄存器(PUSHALL)……。
堆栈结构不是任意的,⽽是严格按照uC-OSII 规范处理的。
OS 每次切换都会保存和恢复全部现场信息(POPALL),然后⽤RETI 回到任务断点继续执⾏。
设计任务二uC/OS-Ⅱ的移植与应用一、设计目的:1.了解嵌入式实时操作系统u C/OS-Ⅱ可移植、可裁剪等性能特点,正确理解实时操作系统中任务、信号、消息、中断等基本概念以及u C/OS-Ⅱ多任务管理的调度算法;2.掌握u C/OS-Ⅱ在ARM7上移植的方法;3.能将u C/OS-Ⅱ移植在LPC2106中,并根据具体要求创建用户任务,解决实际问题;二、具体任务:1.u C/OS-Ⅱ移植在LPC2106中。
2.编写用户任务程序,完成实时温度的采集控制。
硬件电路见参考硬件电路图,图中用滑动变阻器代替温度传感器转换后的电压,用ADC0809完成A/D转换,并用数码管显示出来。
三、参考硬件电路。
(用文字对所设计的电路功能、原理做详细说明)附图:四、源程序。
(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程序要有一定的注释说明)源程序:/******************************************************************** ************************************/#include "config.h"#define TASK_STK_SIZE 64INT32U NUM=0;INT32U LED[10]={0x3F,0x06,0x5b,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴级数码管显示段码表INT32U P8=0x00000100; //管脚P0.8INT32U P9=0x00000200; //管脚P0.9INT32U P10=0x00000400; //管脚P0.10INT32U P11=0x00000800; //管脚P0.11INT32U P12=0x00001000; //管脚P0.12INT32U P13=0x00002000; //管脚P0.13INT32U P14=0x00004000; //管脚P0.14OS_STK Task1Stk[TASK_STK_SIZE];OS_STK Task2Stk[TASK_STK_SIZE];OS_STK Task3Stk[TASK_STK_SIZE];void Task1(void *data);void Task2(void *data);void Task3(void *data);void IO_init(void);void delay(INT32U n);/******************************************************************** *************************************** 函数名称: main** 功能描述: c语言的主函数,由它启动多任务环境********************************************************************* ***********************************/int main (void){OSInit();OSTaskCreate(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE - 1], 4);OSTaskCreate(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE - 1], 5);OSTaskCreate(Task3, (void *)0, &Task3Stk[TASK_STK_SIZE - 1], 6);OSStart();return 0;}/******************************************************************** *************************************** 函数名称: Task1** 功能描述: μCOS-II的第一个任务,通常由它初始化目标板和建立其它任务********************************************************************* ***********************************/void Task1(void *p_arg){p_arg = p_arg; /* 避免编译警告*/TargetInit(); /* 初始化*/IO_init();while(1){while((IOPIN&P12)!=0);IO_init();while((IOPIN&P12)==0);IOCLR=0x0000FFFF; //输出引脚清零OSTaskSuspend(4); //任务切换}}/******************************************************************** *************************************** 函数名称: Task2** 功能描述: μCOS-II的第二个任务********************************************************************* ***********************************/void Task2(void *p_arg){p_arg = p_arg; /* 避免编译警告*/ IO_init();while(1){IOCLR=P13;delay(10); //送单次脉冲启动A/D转换IOSET=P13;delay(10);IOCLR=P13;delay(10);IO_init();while((IOPIN&P14)==0);IOSET=P11; //打开传送数据开关NUM=IOPIN; //读取数据NUM=NUM>>15;OSTaskSuspend(5); //切换任务}}/******************************************************************** *************************************** 函数名称: Task3** 功能描述: μCOS-II的第三个任务********************************************************************* ***********************************/void Task3(void *p_arg){INT32U n;INT32U A,B,C;p_arg = p_arg; /* 避免编译警告*/while(1){A=NUM/100;B=NUM%100/10;C=NUM%10;IOCLR=0x000000FF;IOSET=0x00000700;for(n=0;n<500;n++){IOCLR=P10;IOSET=LED[C];delay(20);IOCLR=0x000000FF;IOSET=P10;IOCLR=P9;IOSET=LED[B]+0x0000080;delay(20);IOCLR=0x000000FF;IOSET=P9;IOCLR=P8;IOSET=LED[A];delay(20);IOCLR=0x000000FF;IOSET=P8;}OSTaskResume(5);}}/******************************************************************** *************************************** 函数名称: 其他子函数** 功能描述: 供给多任务调用********************************************************************* ***********************************/void IO_init(){PINSEL0=0x0;PINSEL1=0x0; // PO口为普通io口IODIR=0x00002FFF; // 设置PO口的方向}void delay(INT32U n){INT32U i;for(i=0;i<=n;i++);}/******************************************************************** *************************************** End Of File********************************************************************* ***********************************/五、仿真效果。
实验报告
实验名称μCOSII系统移植2
课程名称嵌入式系统
华北电力大学
一、实验目的及要求:
1.实验目的
1、熟悉实验箱的硬件环境;
2、熟悉实验系统各部分的使用。
3、理解LM3S8962的各个资源使用。
4、熟悉μCOSII系统的工作特点。
5、熟悉μCOSII系统移植相关知识。
6、理解μCOSII系统中多任务的调度。
2.实验要求
在μCOSII系统上实现多任务协同工作,任务控制LM3S8962开发板上的LED1闪烁,同时控制OLED动态显示字符或图形。
二、仪器用具:
三、实验原理
i.μCOSII的简介
μCOSII的组成部分
μCOSII可以大致分成核心、任务管理、时间管理、任务同步与通信,CPU的移植等5个部分。
ii.核心部分
是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。
iii.任务管理
μCOSII中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级。
63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。
μCOSII提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。
系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。
iv.任务调度
μCOSII采用的是可剥夺型实时多任务内核。
可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。
μCOSII的任务调度是完全基于任务优先级的抢占式调度,也就是最高优先级的任务一旦处于就绪状态,则立即抢占正在运行的低优先级任务的处理器资源。
为了简化系统设计,μCOSII规定所有任务的优先级不同,因为任务的优先级也同时唯一标志了该任务本身。
v.时间管理
μCOSII的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。
中断发生的时间间隔是固定不变的,该中断也成为一个时钟节拍。
μCOSII要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换函数,系统时间函数。
μCOSII的移植
本移植的层次结构如图1所示。
它由用户层、中间件层、μCOSII源码层、μCOSII移植层和驱动库层等五个层次组成。
(1)用户层的 User 目录存放用户代码与设置。
其中 Main.C 文件是用户编写任务的地方;
Main.H 定义任务的堆栈大小、优先级等。
OS_Cfg.H 是μCOSII的配置文件,本模版提供了基于μCOSII2.52 的OS_Cfg_V252.H 配置文件,用户可把其中的内容复制到OS_Cfg.H后,再根据需要修改。
Includes.H是总的头文件,除μCOSII的源码外,所有.C 的文件都包含它,这样用户所需的头文件和其它声明只需在 Includes.H 中声明一次就行了。
(2)中间件层的Middleware目录存放用户自己编写的中间件,如 Uart0.C、Uart0.H 串口通信中间件等。
(3)μCOSII源码层的μCOSII\Source目录存放μCOSII2.52的源代码(除μCOSII.C 外的全部.C 和.H 的文件)。
用户可在《μC/OS-II 嵌入式实时操作系统》一书的配套光盘中得到 2.52 的源码。
用户只要把源码复制到此目录,不需对源码作任何的修改。
(4)μCOSII移植层的μCOSII\Ports 目录存放μCOSII基于LM3S 单片机的移植代码,包括OS_CPU_C.C、OS_CPU_A.ASM 和 OS_CPU.H 等三个必要的文件。
Target 目录中的 Startup 文件是单片机的启动代码和中断向量表,用户要在其中加入需要的中断服务函数的首地址(后面的实验例子将详细说明);Target.C和Target.H提供单片机初始化函数targetInit()和其它简单的外设控制API函数,包括LED控制、蜂鸣器控制、按键检测和定时器0中断服务等,方便用户调试程序。
(5)驱动库层是直接面向硬件目标板的层。
一般来说,除μCOSII外,其它代码都要直接或间接通过它访问硬件。
本实验原理
μCOSII可以简单的视为一个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。
其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。
内核属于抢占式,最多可以管
理60个任务。
任务调度将在以下情况下发生
1)高优先级的任务因为需要某种临界资源,主动请求挂起,让出处理器,此时将调度就绪状态的低优先级任务获得执行,这种调度也称为任务级的上下文切换。
2)高优先级的任务因为时钟节拍到来,在时钟中断的处理程序中,内核发现高优先级任务获得了执行条件(如休眠的时钟到时),则在中断态直接切换到高优先级任务执行。
这种调度也称为中断级的上下文切换。
这两种调度方式在μCOSII的执行过程中非常普遍,一般来说前者发生在系统服务中,后者发生在时钟中断的服务程序中。
调度工作的内容可以分为两部分:最高优先级任务的寻找和任务切换。
其最高优先级任务的寻找是通过建立就绪任务表来实现的。
μCOS中的每一个任务都有独立的堆栈空间,并有一个称为任务控制块TCB(Task Control Block)的数据结构,其中第一个成员变量就是保存的任务堆栈指针。
任务调度模块首先用变量OSTCBHighRdy 记录当前最高级就绪任务的TCB 地址,然后调用OS_TASK_SW()函数来进行任务切换。
四、实验方法与步骤:
1、关闭实验箱电源,将仿真器(ULINK2)的数据接口排线插在核心板1的JTAG接
口上。
2、打开Keil01_Blinky文件夹下的Blinky.Uv2工程文件,单击双箭头向下的
全编译图标,完成程序的全编译并且生成可以下载烧写到ARM芯片的AXF文件,
如果编译通不过或提示程序有错误,请修改程序错误,调试程序直到编译通过。
3、全编译通过后,单击标有load的双箭头向下的图标,完成AXF文件通过仿
真器下载和烧写到ARM芯片中,下载完成后按S1键(即RESET复位键)就可以在核
心板上运行程序了。
4、在KEIL界面下左端的Project Workspace窗口中,双击Source Code文件夹
下的ledblinkymain.c程序文件,右端窗口中就会显示相应的程序内容,因为
main函数就在其中,程序就是从main函数开始执行的,找到其中的main函数,
可以查看程序的执行流程。
5、在KEIL状态栏的Debug下,选择Start/Stop Debug Session, 开始调试程
序。
6、程序编译无错误后下载至LM3S8962开发板
五、实验结果与数据处理:
六、讨论与结论(对实验现象、实验故障及处理方法、实验中存在的问题等进行分析和讨论,对实验的进一步想法或改进意见。
)
LM3S8962开发板上的LED1每隔0.5秒闪烁一次,在OLED屏幕上以不同亮度循环显示字符“Hello World!”,同时还有一个“*”在屏幕上来回跳动。