免费预览已结束,剩余8页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验项目名称:基于ucOS的多任务系统一、实验目的(1) 掌握LPC2200(for MagicARM2200)专用工程模板的使用;(2) 能够在MagicARM2200-S 上运行基于C/OS-II 操作系统的程序;(3) 掌握基于C/OS-II 操作系统的用户程序的编写格式。二、实验内容及要求建立三个或三个以上的C/OS-II 的任务,一个任务用于检测KEY1 按键输入,称之为按键检测任务,另一个任务用于控制蜂鸣器,就称之为蜂鸣器控制任务。还有LED灯任务和电机任务。要求各个任务之间不是独立的,而是有相互关联的,达到多任务间的数据通信和同步的实验要求。三、实验设备及软件 硬件:PC 机 一台MagicARM2200-S 教学实验开发平台 一套 软件:Windows98/XP/2000 系统,ADS 1.2 集成开发环境C/OS-II 操作系统(V2.52)四、设计方案方案一: 建立四个任务:LED灯、按键、电机、蜂鸣器LED任务:LED灯有不同的花样,由数组中的十六进制数据决定。可通过设计数组的数据来设计出很多的花型。按键任务:按键任务主要是对按下的键在0到4内计数,再将所计的数通过邮箱发送给LED、电机任务,来控制任务间的通信。电机任务:电机的转速会不断的改变,电机的转速也是靠按键任务里发送的广播邮箱的值确定的,有五种转速。每次按下一次按键,转速就会改变一次。蜂鸣器任务:蜂鸣器的响灭是由LED任务里发送的信号量控制的,当LED灯亮完一个周期后就发送一个信号让蜂鸣器响起来,响完后蜂鸣器自己删除信号量,等着LED灯再一次并且发送信号。这四个任务间都有着相互的交互关系。方案二:建立三个任务:LED灯、蜂鸣器、按键LED任务:LED灯花样在数组中确定,方法很简单,只要改变数组内十六进制的数据后,就可以很简单的控制灯的闪烁方式了, LED显示完一个周期就会继续执行下一个周期,往复循环,直到按下REST键就会停止。蜂鸣器任务:蜂鸣器可由按键控制,当按键1按下后,蜂鸣器开始鸣叫,鸣叫的次数可由程序控制,延时也同样可控,在本人的设计中,我把鸣响次数设为10.,同样按下REST键就会停止鸣响。按键任务:按键任务其实就是进行等待按键按下,然后发送信号量给LED任务、蜂鸣器任务。方案选择:在我的这个设计中任务之间的联系并不是很紧密,而且每一个状态都很简单的,通过设置优先级来控制优先发生次序,但是四个功能都是很好的实现了的,但是在调试方案一时,程序老是出不来,电机总是不转,检查了程序,但是最后因为时间有限就放弃了四个任务的,选择了稍微简单的三个任务的程序,虽然简单了一些,但是道理都是一样的。为了更完美一些,我设计了很多种LEDA灯的花型 。相对而言程序比较简单,易懂!适合我们这些初学者。五实验步骤在MagicARM2200-S 上运行基于C/OS-II 操作系统的程序的具体操作步骤如下。 安装ADS 1.2 (PC) 了解ADS 1.2 (PC) 连接EasyJTAG 仿真器和MagicARM2200-S (硬件) 安装EasyJTAG 驱动程序 (PC) 添加工程模板 (PC) 建立项目目录并添加C/OS源代码和移植代码 (PC) 用工程模板建立工程 (PC) 仿真调试工程 (PC+硬件) (1) 安装ADS 1.2运行在ADS 目录下Setup.exe,开始安装ADS1.2。(若已安装过,此步省略)按照安装软件的提示安装,与其它软件安装操作方法基本一致。(2) 了解ADS 1.2使用ADS1.2 建立工程,编译链接设置,调试操作等,更详细的使用方法参考ADS1.2的在线帮助文档或相关资料。(若已熟悉ADS 1.2,此步省略)(3) 连接EasyJTAG 仿真器和MagicARM2200-S将EasyJTAG 仿真器的25 针接口通过并口延长线与PC 机的并口连接,先给MagicARM2200-S 实验箱供电,再将EasyJTAG 仿真器的20 针接口通过20 PIN 连接电缆接到MagicARM2200-S 的J3 上。(若已连接好,此步省略)(4) EasyJTAG 仿真器的安装与应用若已安装过,此步省略。(5) 添加工程模板若已添加过,此步省略。(6) 建立项目目录并添加C/OS源代码和移植代码建立一个项目目录,比如uCOS-II。将C/OS源代码Source(目录)复制到项目目录,将移植代码ARM(目录) 复制到项目目录。将移植的PC 服务代码Arm_Pc 复制到项目目录,使用移植的PC 服务代码,就可以通过串口向PC 发送显示数据(由EasyARM 软件的DOS 字符窗口显示)。C/OS 源代码可以从参考文献4的附带光盘上获得。移植代码ARM 和移植的PC 服务代码Arm_Pc 可以从MagicARM2200-S 的产品配套光盘上获得。(7) 用工程模板建立工程使用LPC2200(for MagicARM2200)专用工程模板建立工程(比如“ARM Executable Imagefor UCOSII(MagicARM2200)”工程模板),工程存放路径为项目目录下,建立源文件并加入工程,然后编写程序代码。更改Os_cfg.h 文件,配置C/OS-II 操作系统。编译链接工程,若有错误,则修改程序,然后再次编译。 (8) 仿真调试工程正确设置MagicARM2200-S 的跳线;启动AXD 进行仿真调试。六、部分主要代码方案一程序如下:#include config.h#include stdlib.h#define KEY1 (1 20) /* P0.20 为KEY1 */#define BEEP (1 7) /* P0.7 为蜂鸣器*/#define LED_OFF() IO1SET=LED_IOCON#define LED_DISP(dat) LED_OFF(); IO1CLR=(dat)LED_ADJ)#define LED_ADJ 16#define LED_IOCON (0xFFLED_ADJ)#define LEDCON 0x00ff0000 / LED 控制字#define CYCLE_DATA 200000 / 定义周期#define DUTY_CYCLE_DATA 20000 / 定义基本占空比参数#define LED1 116 / P1.16#define LED2 117 / P1.17#define LED3 118 / P1.18#define LED4 119 / P1.19#define LED5 120 / P1.20#define LED6 121 / P1.21#define LED7 122 / P1.22#define LED8 123 / P1.23#define TaskStkLengh 64 OS_STK TaskStk0TaskStkLengh; OS_STK TaskStk1TaskStkLengh; OS_STK TaskStk2TaskStkLengh; OS_STK TaskStk3TaskStkLengh; void Task0(void *pdata); /Task0 任务void Task1(void *pdata); /Task0 任务void Task2(void *pdata); /Task2 任务void Task3(void *pdata); /Task2 任务OS_EVENT *semled;OS_EVENT *sempwm;OS_EVENT *sembeep;int main(void)OSInit ();OSTaskCreate (Task0,(void *)0, &TaskStk0TaskStkLengh - 1,3);OSTaskCreate (Task2,(void *)0, &TaskStk2TaskStkLengh - 1,5);OSTaskCreate (Task3,(void *)0, &TaskStk3TaskStkLengh - 1,4);OSStart ();return 0;void Task0(void *pdata) INT8U err;const uint8 DISP_TAB24 = 0xFF,0xEE, 0xDD,0xCC, 0X55,0xBB,0xAA,0x99,0x88,0x77,0x66, 0x55,0xCC, 0x44,0x22,0x11,0x00 ,0xFF,0x18, 0x3C,0x7E, 0xFF,0x00,0xFF;uint8 i;pdata = pdata;semled=OSSemCreate(0);TargetInit ();PINSEL0 = 0x00000000; IO0DIR = BEEP; IO1DIR = LED_IOCON; LED_OFF();OSTaskCreate (Task1,(void *)0, &TaskStk1TaskStkLengh - 1,6);while (1)OSSemPend(semled,0,&err); for(i=0; i24; i+) LED_DISP(DISP_TABi); OSTimeDly(OS_TICKS_PER_SEC); OSSemPost(sempwm);void Task1(void *pdata) INT8U err; pdata = pdata; sembeep=OSSemCreate(0); sempwm=OSSemCreate(0); while(1) OSSemPend(sembeep,0,&err); OSTimeDly(OS_TICKS_PER_SEC/8); IO0CLR = BEEP; OSTimeDly(OS_TICKS_PER_SEC/4); IO0SET = BEEP; OSTimeDly(OS_TICKS_PER_SEC/2); IO0CLR = BEEP; OSTimeDly(OS_TICKS_PER_SEC/4); IO0SET = BEEP; OSTimeDly(OS_TICKS_PER_SEC/8); IO0CLR = BEEP; OSTimeDly(OS_TICKS_PER_SEC/2); IO0SET = BEEP; void Task2(void *pdata) pdata = pdata; IO0DIR&=KEY1; while(1) while(IO0PIN & KEY1) != 0) OSTimeDly(OS_TICKS_PER_SEC ); OSSemPost(sembeep);OSSemPost(sempwm);OSSemPost(semled); while (IO0PIN & KEY1) = 0) void Task3 (void *pdata) INT8U err; uint8 i = 0; pdata = pdata; PINSEL1 = 0x0110; IO1DIR = LEDCON; PWMPR = 0x00; PWMMCR = 0x02; PWMMR0 = CYCLE_DATA; PWMMR5 = DUTY_CYCLE_DATA; PWMLER = 1 0 | 1 5; PWMPCR = 1 13; PWMTCR = 0x09; while (1) OSSemPend(sempwm, 0, &err); PWMMR5 = DUTY_CYCLE_DATA*i; PWMLER = 1 0 | 1 5; PWMTCR = 0x09; i = (i+1)%5;OSTimeDly(OS_TICKS_PER_SEC*3 );方案二程序如下:#include config.h#include stdlib.h/ P0.7 为蜂鸣器的控制I/O#define BEEP (17)#define KEY1 (120)/ LED 控制宏函数定义。LED1-LED8 的控制I/O 为P1.16-P1.23#define LED_ADJ 16#define LED_IOCON (0xFFLED_ADJ)#define LED_OFF() IO1SET=LED_IOCON#define LED_DISP(dat) LED_OFF(); IO1CLR=(dat)LED_ADJ)#define TaskStkLengh 100 /定义用户任务堆栈长度OS_STK TaskStk0TaskStkLengh; /Define the Task0 stack 定义用户任务0 的堆栈OS_STK TaskStk1TaskStkLengh; /Define the Task1 stack 定义用户任务1 的堆栈OS_STK TaskStk2TaskStkLengh; /Define the Task2 stack 定义用户任务2 的堆栈void Task0(void *pdata); /Task0 任务0void Task1(void *pdata); /Task1 任务1void Task2(void *pdata); /Task2 任务2OS_EVENT *Mbox;int dly;int main (void)OSInit();OSTaskCreate (Task0,(void *)0, &TaskStk0TaskStkLengh - 1, 4);/*创建LED任务*/OSTaskCreate (Task1,(void *)0, &TaskStk1TaskStkLengh - 1, 6); /*创建BEEP任务*/OSTaskCreate (Task2,(void *)0, &TaskStk2TaskStkLengh - 1, 2); /*创建KEY任务*/OSStart ();return 0;/* Task0 任务0*/void Task0(void *pdata) const uint8 DISP_TAB32 = 0x18,0x3C,0x7E,0xFF,0x7E,0x3C,0x18,0x00,0xAA,0x55,0xAA,0x55,0xCC,0x33,0xCC,0x33,0x99,0x66,0x99,0x66,0x18,0x3C,0x81,0xC3,0x00,0xC3,0x66,0x3C,0x18,0x3C,0x66,0xC3;/INT8U err;/INT16U *pd;uint8 i;/pdata = pdata;TargetInit ();PINSEL1=0x00000000;IO0DIR = BEEP; / 设置蜂鸣器控制口为输出IO0SET = BEEP;IO1DIR = LED_IOCON; / 设置LED1-LED8 的控制口为输出LED_OFF();Mbox=OSMboxCreate(NULL);while(1) / pd=(INT16U *)OSMboxPend(Mbox,0,&err); for(i=0;i32;i+) LED_DISP(DISP_TABi); / 输出LED 显示数据OSTimeDly(OS_TICKS_PER_SEC/2); / 延时0.5S/*TASK1*/void Task1(void *pdata) int i; INT8U err;INT16U *pd; pdata=pdata; IO0DIR|=BEEP; while(1) pd=(INT16U *)OSMboxPend(Mbox,0,&err); for(i=0;i10;i+) IO0CLR=BEEP; OSTimeDly(50); IO0SET=BEEP; OSTimeDly(50); /*TASK2*/void Task2(void *pdata) pdata=pdata; IO0DIR&=KEY1; while(1) while(IO0PIN&KEY1)!=0) OSTimeDly(1); OSMboxPostOpt(Mbox,&dly,OS_POST_OPT_BROADCAST); while(IO0PIN&KEY1)=0) OSTimeDly(1); 六、测试结果方案一仿真测试后并没有实现理想的设计功能,电机没有转动,可能是软件设计有问题或者是试验箱
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年某公司空分及供风装置节能技术改造工程可研报告
- 2025年散打培训班考试题及答案
- 2025年山东省初中信息技术学业水平考试试题模拟题及答案
- 2026年中国排涝泵行业市场前景预测及投资价值评估分析报告
- 2026年冰淇淋市场调查报告范文【三】
- 2026年泵业行业研究报告
- 普外科的考试题目及答案
- 2025年矿山技术考试题库及答案
- 2026年汽车水泵项目可行性研究报告(立项备案下载可编辑)
- 2026年苏州利昊特机电科技有限公司介绍企业发展分析报告模板
- 护理职业生涯发展
- 卫生院优先使用集采药品培训
- 系统思考培训课件
- 《学前教育简史》课件-8学前教育简史 (第二版)
- 2025年春季学期国家开放大学《毛泽东思想和中国特色社会主义理论体系概论》终考任务一:学习行为表现
- 2025重大火灾隐患判定规则解读
- 护理事业十五五发展规划(2026-2030)
- 七五班《正确处理男女同学的交往》主题班会课件1
- 输血发生溶血护理
- 健康教育:我们的运动系统
- JG/T 533-2018厨卫装配式墙板技术要求
评论
0/150
提交评论