课程设计(论文)基于STM32μCOSII贪吃蛇的设计.doc

上传人:laozhun 文档编号:2393812 上传时间:2023-02-17 格式:DOC 页数:35 大小:2.08MB
返回 下载 相关 举报
课程设计(论文)基于STM32μCOSII贪吃蛇的设计.doc_第1页
第1页 / 共35页
课程设计(论文)基于STM32μCOSII贪吃蛇的设计.doc_第2页
第2页 / 共35页
课程设计(论文)基于STM32μCOSII贪吃蛇的设计.doc_第3页
第3页 / 共35页
课程设计(论文)基于STM32μCOSII贪吃蛇的设计.doc_第4页
第4页 / 共35页
课程设计(论文)基于STM32μCOSII贪吃蛇的设计.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《课程设计(论文)基于STM32μCOSII贪吃蛇的设计.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)基于STM32μCOSII贪吃蛇的设计.doc(35页珍藏版)》请在三一办公上搜索。

1、邯郸学院课程设计题 目 基于STM32-C/OS-II贪吃蛇的设计学 生 指导教师 年 级 2012级专 业 电子信息工程二级学院 (系、部) 信息工程学院邯郸学院信息工程学院(系、部)2015年7月基于STM32-C/OS-II贪吃蛇的设计摘要 进入新世纪的TFT液晶显示屏的技术和产业都取得了长足的发展,作为重要的现代信息,发布媒体之一TFT液晶显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。伴随社会化信息的推进,TFT液晶屏技术也在不断地推陈出新,应用领域愈加广泛。现基于STM32的TFT液晶显示可以更好的满足各种需求,也更便于操作和实现。基于STM32在TFT液晶屏幕上可显示

2、文本及图形,包括汉字和时钟显示。 关键词:TFT液晶显示 STM32开发板 C/OS-II 贪吃蛇目 录摘要1前言31 背景介绍31.1 选题背景31.2 MiniSTM32开发板介绍32 系统硬件设计42.1 开发板简介42.2 LED 灯62.3 按键102.4 TFTLCD 模块103 系统软件设计143.1 LED驱动143.2 按键驱动143.3 TFT-LCD驱动163.4 贪吃蛇实现C语言代码183.5 uC/OS-II软件设计23结论27参考文献28前言目前已有超过85的无线通信设备采用了ARM技术,ARM以其高性能和低成本,在该领域的地位日益巩固。ARM在此方面的应用如:手提

3、式计算机、移动电话、PDA等。 随着宽带技术的推广,采用ARM技术的ADSL芯片正逐步获得竞争优势。此外,ARM在语音及视频处理上进行了优化,并获得广泛支持。UC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器,微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。 UC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标准。 1 背景介绍1.1 选题背景随着信息技术的飞速发展,形式多样的数字化产品

4、已经开始成为继PC机后的信息处理工具,在这种数字化潮流下,嵌入式系统已成为当前研究和应用的热点之一,嵌入式手持设备的视图多媒体应用也越来越广泛。由于嵌入式系统的应用要求及成本因素决定了嵌入式系统在系统资源,包括硬件资源和软件资源方面都是非常精简和高效的。1.2 MiniSTM32开发板介绍MiniSTM32 设计精良,结构小巧!板子的设计充分考虑了成本与功能这两个矛盾面,再结合实际使用的经验及 STM32 的特点,最终确定了这样的设计。STM32 的优异性体现在如下几个方面: 以 8 位机的价格,得到 32 位机,是 STM32 最大的优势。 STM32 拥有包括:FSMC、TIMER、SPI

5、、IIC、USB、CAN、IIS、SDIO、ADC、DAC、RTC、DMA 等众多外设及功能,具有极高的集成度。 STM32 仅 M3 内核就拥有 F100、F101、F102、F103、F105、F107、F207、F217 等 8 个系列上百种型号,具有 QFN、LQFP、BGA 等封装可供选择。同时 STM32还推出了 STM32L 和 STM32W 等超低功耗和无线应用型的 M3 芯片。 84 个中断,16 级可编程优先级,并且所有的引脚都可以作为中断输入。STM32 各个外设都有自己的独立时钟开关,可以通过关闭相应外设的时钟来降低功耗。STM32 的开发不需要昂贵的仿真器,只需要一个

6、串口即可下载代码,并且支持 SWD 和 JTAG 两种调试口。SWD 调试可以为你的设计带来跟多的方便,只需要 2 个 IO 口,即可实现仿真调试。2 系统硬件设计2.1 开发板简介ALIENTEK MiniSTM32 开发板是一款迷你型的 STM32F103 开发板,小巧而不小气,简约而不简单。该开发板自推出以来,深得广大 STM32 学习者喜爱,总销量超过 1.6W 套。目前最新版本为 V3.0,最新 MiniSTM32 开发板资源图如图 所示:ALIENTEK MiniSTM32开发板板载资源如下: CPU:STM32F103RBT6,LQFP64,FLASH:128K,SRAM:20K

7、; 1个标准的JTAG/SWD调试下载口 1个电源指示灯(蓝色) 2个状态指示灯(DS0:红色,DS1:绿色) 1个红外接收头,配备一款小巧的红外遥控器 1个IIC接口的EEPROM芯片,24C02,容量256字节 1个SPI FLASH芯片,W25X16,容量为2M字节 1个DS18B20/DS1820温度传感器预留接口 1个标准的2.4/2.8寸LCD接口,支持触摸屏 1个OLED模块接口 1个USB串口,可用于程序下载和代码调试 1个USB SLAVE接口,用于USB通信 1个SD卡接口 1个PS/2接口,可外接鼠标、键盘 1组5V电源供应/接入口 1组3.3V电源供应/接入口 1个启动

8、模式选择配置接口 2个2.4G无线通信接口(24L01和JF24C) 1个RTC后备电池座,并带电池 1个复位按钮,可用于复位MCU和LCD 3个功能按钮,其中WK_UP兼具唤醒功能 1个电源开关,控制整个板的电源 3.3V与5V电源TVS保护,有效防止烧坏芯片。 独创的一键下载功能 除晶振占用的IO口外,其余所有IO口全部引出,其中GPIOA和GPIOB按顺序引出,整个板子尺寸为 8cm*10cm*2cm板上除晶振外的所有的 IO 口全部引出,特别还有 GPIOA 和 GPIOB 的 IO 口是按顺序引出的,可以极大的方便大家扩展及使用,另外板载独特的一键下载功能,避免了频繁设置 B0、B1

9、 带来的麻烦,直接在电脑上一键下载。 板载十多种外设及接口,可以充分挖掘 STM32 的潜质。沉金 PCB+全新优质元器件+定制全铜镀金排针/排座+电源 TVS 保护,坚若磐石。各个接口都有丝印标注,使用起来一目了然;接口位置设计安排合理,方便顺手。资源搭配合理,物尽其用。2.2 LED 灯 ALIENTEK MiniSTM32开发板板载了2个LED,DS0和DS1, STM32的IO口可以由软件配置成8种模式:1、输入浮空2、输入上拉3、输入下拉4、模拟输入5、开漏输出6、推挽输出7、推挽式复用功能8、开漏复用功能每个IO口可以自由编程,单IO口寄存器必须要按32位字被访问。STM32的很多

10、IO口都是5V兼容的,这些IO口在与5V电平的外设连接的时候很有优势,具体哪些IO口是5V兼容的,可以从该芯片的数据手册管脚描述章节查到(I/O Level标FT的就是5V电平兼容的)。STM32的每个IO端口都有7个寄存器来控制。他们分别是:配置模式的2个32位的端口配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位/复位寄存器BSRR;一个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;这里我们仅介绍常用的几个寄存器,我们常用的IO端口寄存器只有4个:CRL、CRH、IDR、ODR。CRL和CRH控制着每个IO口的模式及输出速率。端口低配置寄存器CR

11、L的描述,如下图所示:该寄存器的复位值为0X4444 4444,从上图可以看到,复位值其实就是配置端口为浮空输入模式。从上图还可以得出:STM32的CRL控制着每个IO端口(AG)的低8位的模式。每个IO端口的位占用CRL的4个位,高两位为CNF,低两位为MODE。这里我们可以记住几个常用的配置,比如0X0表示模拟输入模式(ADC用)、0X3表示推挽输出模式(做输出口用,50M速率)、0X8表示上/下拉输入模式(做输入口用)、0XB表示复用输出(使用IO口的第二功能,50M速率)。CRH的作用和CRL完全一样,只是CRL控制的是低8位输出口,而CRH控制的是高8位输出口。IDR是一个端口输入数

12、据寄存器,只用了低16位。该寄存器为只读寄存器,并且只能以16位的形式读出。该寄存器各位的描述如下图所示:要想知道某个IO口的状态,你只要读这个寄存器,再看某个位的状态就可以了。ODR是一个端口输出数据寄存器,也只用了低16位。该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前IO口的输出状态。而向该寄存器写数据,则可以控制某个IO口的输出电平。该寄存器的各位描述如下图所示:ALIENTEK MiniSTM32开发板板载的LED硬件连接:2.3 按键 ALIENTEK MiniSTM32 开发板总共有 3 个按键,其原理图如下: KEY0 和 KEY1 用作普通按键输入,分别连接在 PC

13、5 和 PA15 上,其中 PA15 和 JTDI 共用了,所以,在使用 KEY0 和 KEY1 的时候,就不能使用 JTAG 来调试了,但是可以用 SWD 调试,这点在使用的时候要注意。KEY0 和 KEY1 还和 PS/2 的 DAT 和 CLK 线共用。 WK_UP 按键连接到 PA0(STM32 的 WKUP 引脚),它除了可以用作普通输入按键外,还可以用作 STM32 的唤醒输入。该按键是高电平触发的。由于 PA0 还是 DS18B20 的输入引脚,而18B20 是有上拉电阻的,所以在使用 WK_UP 按键的时候,请一定要断开 PA0 和 DS18B20 的跳线帽。2.4 TFTLC

14、D 模块 TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。该模块有如下特点:1,2.4/2.8两种大小的屏幕可选。2,320240的分辨率。3,16位真彩显示。4,自带触摸屏,可以用来作为控制输入。5,通用的接口,除了ALIENTEK MiniSTM32

15、开发板,该液晶模块还可以使用在优异特、STMSKY、红牛等开发板上。ALIENTEK MiniSTM32开发板的该模块采用的是显尚光电的DST2001PH TFTLCD,DST2001PH的控制器为ILI9320,采用26万色的TFTLCD屏,分辨率为320240,采用16位的80并口。CS:TFTLCD片选信号。WR:向TFTLCD写入数据。RD:从TFTLCD读取数据。D15:0:16位双向数据线。RST:硬复位TFTLCD。RS:命令/数据标志(0,读写命令;1,读写数据)。80并口在上一节我们已经有详细的介绍了,这里我们就不在介绍,需要说明的是,TFTLCD模块的RST信号线和OLED

16、模块一样,也是直接接到STM32的复位脚上,并不由软件控制,这样可以省下来一个IO口。另外我们还需要一个背光控制线来控制TFTLCD的背光。所以,我们总共需要的IO口数目为21个。模块的控制器为ILI9320(可能为其他型号,但是他们的设置很相似,除了初始化序列有些区别,其他大都是一摸一样的,这里仅以9320为例介绍),该控制器自带显存,其显存总大小为172820(240*320*18/8),即18位模式(26万色)下的显存量。模块的16位数据线与显寸的对应关系为565方式,如下图所示:最低5位代表蓝色,中间6位为绿色,最高5位为红色。数值越大,表示该颜色越深。接下来,我们介绍一下ILI932

17、0的几个重要命令,因为ILI9320的命令很多,我们这里不可能一一介绍,有兴趣的大家可以找到ILI9320的datasheet看看。里面对这些命令有详细的介绍。这里我们要介绍的命令列表如下:这个命令,有两个功能,如果对它写,则最低位为OSC,用于开启或关闭振荡器。而如果对它读操作,则返回的是控制器的型号。这个命令最大的功能就是通过读它可以得到控制器的型号,而我们代码在知道了控制器的型号之后,可以针对不同型号的控制器,进行不同的初始化。因为93xx系列的初始化,其实都比较类似,我们完全可以用一个代码兼容好几个控制器。R3,入口模式命令。我们重点关注的是I/D0、I/D1、AM这3个位,因为这3个

18、位控制了屏幕的显示方向。AM:控制GRAM更新方向。当AM=0的时候,地址以行方向更新。当AM=1的时候,地址以列方向更新。I/D1:0:当更新了一个数据之后,根据这两个位的设置来控制地址计数器自动增加/减少1,其关系如下图:通过这几个位的设置,我们就可以控制屏幕的显示方向了。R7,显示控制命令。该命令CL位用来控制是8位彩色,还是26万色。为0时26万色,为1时八位色。D1、D0、BASEE这三个位用来控制显示开关与否的。当全部设置为1的时候开启显示,全0是关闭。我们一般通过该命令的设置来开启或关闭显示器,以降低功耗。R32,R33,设置GRAM的行地址和列地址。R32用于设置列地址(X坐标

19、,0239),R33用于设置行地址(Y坐标,0319)。当我们要在某个指定点写入一个颜色的时候,先通过这两个命令设置到改点,然后写入颜色值就可以了。R34,写数据到GRAM命令,当写入了这个命令之后,地址计数器才会自动的增加和减少。该命令是我们要介绍的这一组命令里面唯一的单个操作的命令,只需要写入该值就可以了,其他的都是要先写入命令编号,然后写入操作数。R80R83,行列GRAM地址位置设置。这几个命令用于设定你显示区域的大小,我们整个屏的大小为240*320,但是有时候我们只需要在其中的一部分区域写入数据,如果用先写坐标,后写数据这样的方式来实现,则速度大打折扣。此时我们就可以通过这几个命令

20、,在其中开辟一个区域,然后不停的丢数据,地址计数器就会根据R3的设置自动增加/减少,这样就不需要频繁的写地址了,大大提高了刷新的速度。3 系统软件设计3.1 LED驱动/初始化PA8和PD2为输出口.并使能这两个口的时钟 /LED IO初始化void LED_Init(void)RCC-APB2ENR|=1APB2ENR|=1CRH&=0XFFFFFFF0; GPIOA-CRH|=0X00000003;/PA8 推挽输出 GPIOA-ODR|=1CRL&=0XFFFFF0FF;GPIOD-CRL|=0X00000300;/PD.2推挽输出GPIOD-ODR|=1APB2ENR|=1CRL&=0

21、XFFFFFFF0;/PA0设置成输入 GPIOA-CRL|=0X00000008; GPIOA-CRH&=0X0F0FFFFF;/PA13,15设置成输入 GPIOA-CRH|=0X80800000; GPIOA-ODR|=1ODR|=1KEY1KEY2!u8 KEY_Scan(void) static u8 key_up=1;/按键按松开标志JTAG_Set(JTAG_SWD_DISABLE);if(key_up&(KEY0=0|KEY1=0|KEY2=1)/delay_ms(10);/去抖动 key_up=0;if(KEY0=0)JTAG_Set(SWD_ENABLE);return 1

22、;else if(KEY1=0)JTAG_Set(SWD_ENABLE);return 2;else if(KEY2=1)JTAG_Set(SWD_ENABLE);return 3;else if(KEY0=1&KEY1=1&KEY2=0)key_up=1; JTAG_Set(SWD_ENABLE);return 0;/ 无按键按下3.3 TFT-LCD驱动/画笔颜色#define WHITE 0xFFFF#define BLACK 0x0000 #define BLUE 0x001F #define BRED 0XF81F#define GRED 0XFFE0#define GBLUE 0X

23、07FF#define RED 0xF800#define MAGENTA 0xF81F#define GREEN 0x07E0#define CYAN 0x7FFF#define YELLOW 0xFFE0#define BROWN 0XBC40 /棕色#define BRRED 0XFC07 /棕红色#define GRAY 0X8430 /灰色/GUI颜色#define DARKBLUE 0X01CF/深蓝色#define LIGHTBLUE 0X7D7C/浅蓝色 #define GRAYBLUE 0X5458 /灰蓝色/以上三色为PANEL的颜色 #define LIGHTGREEN

24、0X841F /浅绿色/#define LIGHTGRAY 0XEF5B /浅灰色(PANNEL)#define LGRAY 0XC618 /浅灰色(PANNEL),窗体背景色#define LGRAYBLUE 0XA651 /浅灰蓝色(中间层颜色)#define LBBLUE 0X2B12 /浅棕蓝色(选择条目的反色) extern u16 BACK_COLOR, POINT_COLOR ; void LCD_Init(void);void LCD_DisplayOn(void);void LCD_DisplayOff(void);void LCD_Clear(u16 Color); voi

25、d LCD_SetCursor(u16 Xpos, u16 Ypos);void LCD_Scan_Dir(u8 dir);void LCD_DrawPoint(u16 x,u16 y);/画点u16 LCD_ReadPoint(u16 x,u16 y); /读点void Draw_Circle(u16 x0,u16 y0,u8 r);void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2);void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2); void LCD_Fill(u16 sx,u16

26、sy,u16 ex,u16 ey,u16 color);void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode);/显示一个字符void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size); /显示一个数字void LCD_Show2Num(u16 x,u16 y,u16 num,u8 len,u8 size,u8 mode);/显示2个数字void LCD_ShowString(u16 x,u16 y,const u8 *p); /显示一个字符串,16字体u16 LCD_RD_DATA(void);

27、/读取LCD数据 void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue);u16 LCD_ReadReg(u8 LCD_Reg);void LCD_WriteRAM_Prepare(void);void LCD_WriteRAM(u16 RGB_Code);u16 LCD_ReadRAM(void); u16 LCD_BGR2RGB(u16 c);3.4 贪吃蛇实现C语言代码#include snake.h#include lcd.h#include key.hextern u8 key_value;u8 key_temp;extern int dir_

28、x,dir_y;#define SNAKE_MAX_LONG 10 /最大长度10struct u8 XSNAKE_MAX_LONG; u8 YSNAKE_MAX_LONG; u8 Long; u8 Life; u8 Score; u8 Level;Snake; /蛇结构体struct u8 X;u8 Y;u8 Yes;Food; /食物结构体/绘制小方块,8*8void Turn_Off(u8 x,u8 y) LCD_Fill(x*8),(y*8),(x*8+8),(y*8+8),BLACK); /8*8小矩形void Turn_On(u8 x,u8 y) LCD_Fill(x*8),(y*

29、8),(x*8+8),(y*8+8),RED); /8*8小矩形/初始化贪吃蛇void Snake_Init(void) u8 i; /*初始化蛇参数*/Snake.Long=2; /定义初始化蛇的长度Snake.Life=0; /初始化蛇还活着Snake.Score=0;Food.Yes=1;/放食物标志for(i=0;iSnake.Long;i+)/初始化蛇的位置Snake.Xi=i+14;Snake.Yi=7;for(i=0;iSnake.Long;i+)/将蛇画出来Turn_On(Snake.Xi,Snake.Yi);void Snake_Move(int dir_x,int dir_

30、y) /移动蛇 u8 i;Turn_Off(Snake.X0,Snake.Y0); /向上for(i=0;iSnake.Long-1;i+) /初始化蛇的位置 /向右 1 0Snake.Xi=Snake.Xi+1; /向左 01Snake.Yi=Snake.Yi+1; /向下 -1 0 /向上 0 -1Snake.XSnake.Long-1=Snake.XSnake.Long-2+dir_x; Snake.YSnake.Long-1=Snake.YSnake.Long-2+dir_y; /蛇头向你要求的方向移动for(i=0;iSnake.Long;i+) /将蛇画出来Turn_On(Snak

31、e.Xi,Snake.Yi);void Food_Place(u8 Food_x,u8 Food_y) /放食物 Food.X=Food_x; Food.Y=Food_y; Turn_On(Food.X,Food.Y);void Run_Snake(void) /游戏运行 u8 i; Snake_Move(dir_x,dir_y); /判断是否吃到食物,若吃到长度加1,而且再放一个 if(Snake.XSnake.Long-1=Food.X)&(Snake.YSnake.Long-1=Food.Y) Snake.Long+;Snake.XSnake.Long-1=Food.X;Snake.YS

32、nake.Long-1=Food.Y;Food.X=0;Food.Y=0;Snake.Score+=1;Food.Yes= 1; /吃完一个后,再放一个食物LCD_ShowNum(50,300,(u32)Snake.Score,4,16);/显示分数 if(Food.Yes=0) Food_Place(Food.X,Food.Y);/放食物 if(Food.Yes=1)/获得随机食物坐标 while(1)Food.X=rand()%28+1;Food.Y=rand()%28+1;for(i=0;iSnake.Long;i+)/将蛇画出来 if(Snake.XSnake.Long=Food.X)

33、&(Snake.YSnake.Long=Food.Y) break; /如果放的食物和蛇身重合则跳出来,不放食物 Food.Yes=0;break; for(i=0;iSnake.Long;i+)/将蛇画出来 if(Snake.Xi=Snake.XSnake.Long&Snake.Yi=Snake.YSnake.Long) Game_Over(); /蛇头碰到蛇身,游戏结束 if(Snake.XSnake.Long-1=30)|(Snake.YSnake.Long-1=33) Game_Over(); /delay_ms(300);void Game_Start(void)/u8 i;POIN

34、T_COLOR=WHITE;/画笔颜色BACK_COLOR=BLACK; /背景色 /*绘制游戏界面*/LCD_Fill(0,0,8,280,DARKBLUE);/Rectangle(8,8-1,85,120,0xaa);/绘制一个矩形框, 0-127LCD_Fill(232,0,240,280,DARKBLUE);/LCD_Fill(0,0,240,8,DARKBLUE);/LCD_Fill(0,272,240,280,DARKBLUE);/ LCD_ShowString(20,300,Score);/Show ScoreLCD_ShowString(150,300,LEVEL);/Show

35、 LevelLCD_ShowNum(50,300,(u32)Snake.Score,4,16);/显示分数LCD_ShowNum(180,300,(u32)Snake.Level,4,16);void Game_Over(void)LCD_Clear(BLACK);LCD_ShowString(60,150,GAME OVER! );LCD_ShowString(25,170,PRESS ENTER TO RESTART);LCD_ShowString(60,190,SCORE:);LCD_ShowNum(100,190,(u32)Snake.Score,4,16);/显示分数while(1)

36、;/Game_Start(); /Snake_Init();3.5 uC/OS-II软件设计uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,适合很多商业操作系统性能相当的实时操作系统(RTOS)。为了提供最好的移植性能,uC/OS II最大程度上使用ANSI C语言进行开发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU(包括DSP)。 uC/OS II可以简单的视为一个多任务调度器,在这个任务调度器之上完善并添加了和多任务操

37、作系统相关的系统服务,如信号量、邮箱等。其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。内核属于抢占式,最多可以管理60个任务。从1992年开始,由于高度可靠性、移植性和安全性,uC/OS II已经广泛使用在从照相机到航空电子产品的各种应用中。C/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。(1) 核心部分(OSCore.c) 是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。(2) 任务处理部分(OSTask

38、.c) 任务处理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为C/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。(3) 时钟部分(OSTime.c) C/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等操作是在这里完成的。(4) 任务同步和通信部分 为事件处理部分,包括信号量、邮箱、消息队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。(5) 与CPU的接口部分 是指C/OS-II针对所使用的CPU的移植部分。由于C/OS-II是一个通用性的操作系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内

39、容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。uC/OS-II 采用的是可剥夺型实时多任务内核。可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。 uC/os-II的任务调度是完全基于任务优先级的抢占式调度,也就是最高优先级的任务一旦处于就绪状态,则立即抢占正在运行的低优先级任务的处理器资源。为了简化系统设计,uC/OS-II规定所有任务的优先级不同,因而任务的优先级也同时唯一标志了该任务本身。uC/OS-II 中最多可以支持64 个任务,分

40、别对应优先级063,其中0 为最高优先级。63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。 uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。 系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整型变量做累加运算;另一个是统计任务,它的优先级为次低,该任务负责统计当前cpu的利用率。uC/OS-II的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。中断发生的时间间隔是固定不变的,该

41、中断也成为一个时钟节拍。 uC/OS-II要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换函数,系统时间函数。对一个多任务的操作系统来说,任务间的通信和同步是必不可少的。uC/OS-II中提供了4种同步对象,分别是信号量,邮箱,消息队列和事件。所有这些同步对象都有创建,等待,发送,查询的接口用于实现进程间的通信和同步。uC/OS-II部分代码:任务的初始化和开始任务的创建:OSInit(); /系统初始化OSTaskCreate( TaskStart,/task pointer(void *)0,/parameter(OS_STK *)&TASK_START_STKSTART_STK_SIZE-1,/task stack top pointerSTART_TASK_Prio );/task priorityOSStart(); 配置和任务创建函数:/开始任务void TaskStart(void * pdata)pd

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号