2020-03-02 07:54:31 来源:范文大全收藏下载本文
专业:自动化1402 日期:2016.11.01 地点:教2-104
成绩:________________
实验报告
同组学生姓名:施兴棋
学号:3140103039 同组学生姓名:______________________________
学号:_____________________________________ 课程名称:
《嵌入式系统》
实验序号:
实验名称:
基于μC/OS-II的LED流水灯控制实验 摘要:
利用μC/OS-II操作系统实现LED流水灯与蜂鸣器控制任务
一、实验目的
(1)掌握LPC2200专用工程模板(for μC/OS-II)的使用
(2)能够在SmartARM2200教学实验开发平台上运行基于μC/OS-II操作系统的程序。 (3)掌握基于μC/OS-II的LED操作系统的用户程序的编写风格
二、实验内容
仔细阅读给定程序,建立3个μC/OS-II的任务,1个任务用于分别控制两个LED(P2.30,P2.31)流水灯循环点亮,这里称之为流水灯循环控制任务,一个任务用于检测KEY1按键输入(P0.20口的输入),这里称之为按键检测任务;另外一个任务用于控制蜂鸣器响,这里称之为蜂鸣器控制任务。蜂鸣器控制任务平时处于等待状态,当按键检测任务检测到有效按键输入时,立即唤醒蜂鸣器控制任务,并挂起LED流水灯循环任务,当无有效按键时,两个LED循环点亮,蜂鸣器无输出。
三、实验前准备工作
(1)连接EasyJTAG仿真器和SmartARM2200教学实验开发平台,然后安装EasyJTAG仿真器的驱动程序。(若已经安装过,此步省略。)
(2)为ADS1.2增加LPC2200专用工程模板。(若已增加过,此步省略。)
(3)建立一个项目目录μC/OS-II,增加μC/OS2.52源代码和移植代码(arm文件夹)。还要将移植的PC服务代码Arm_Pc复制到项目目录μC/OS-II下。
(4)启动ADS1.2,使用ARM Executable Image for μC/OS-II(for LPC2200)工程模板建立一个工程GPIO,工程存储在μC/OS-II目录下。
(5)打开工程窗口user组中的main.c文件,根据给定的例程编写实验程序并保存。 (6)根据程序设计更改Os_cfg.h文件,配置μC/OS-II操作系统(本实验可默认配置)。 (7)选用DebugInExRam生成目标,然后编译链接工程。
(8)将SmartARM2200教学实验开发平台上的JP2,JP4跳线短接,JP10跳线设置为Bank0-RAM、Bank1-FLASH(生成目标为DebugInExRam)。
(9)选择Project-Debug,启动AXD进行JTAG仿真调试。
1 / 4
(10)全速运行程序,然后按下/放开KEY1键,监听蜂鸣器是否蜂鸣,LED流水灯是否按要求开通与关断。
(11)当仿真器调试通过后关闭AXD,在ADS1.2集成开发环境中选用RelOutChip生成目标,然后编译链接工程。
(12)将SmartARM2200教学实验开发平台上的JP
2、JP4跳线短接,JP1跳线断开,JP10跳线设置为Bank0-FLASH、Bank1-RAM,JP9跳线设置为OUTSIDE。
(15)选择Project-Debug,启动AXD进行JTAG仿真调试。此时EasyJTAG仿真器将会把程序下载到FLASH上。
注意:使用RelOutChip生成目标时,需要在H-JTAG中Load L“PC2200.hfc”文件来配置。 (16)按SmartARM2200教学实验开发平台上的RST复位键,观察程序是否能脱机运行。
实验程序编写: #include \"config.h\" #include \"stdlib.h\" #define
KEY1 (1
/* P0.20为KEY1 */ #define
BEEP (1
/* P0.07为蜂鸣器 */ #define
LEDCON
0xf0000000
#define TaskStkLengh 64
//Define the Task0 stack length OS_STK TaskStk0[TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈 OS_STK TaskStk1[TaskStkLengh]; //Define the Task1 stack 定义用户任务1的堆栈 OS_STK TaskStk2[TaskStkLengh]; //Define the Task1 stack 定义用户任务2的堆栈 void Task0(void *pdata);
//Task0 任务0 void Task1(void *pdata);
//Task0 任务1 void Task2(void *pdata);
//Task0 任务2 int main(void) { OSInit ();
OSTaskCreate (Task0,(void *)0, &TaskStk0[TaskStkLengh1], 3);
OSTaskCreate (Task2,(void *)2, &TaskStk2[TaskStkLengh - 1], 5); for (;;)
{
OSTaskSuspend(OS_PRIO_SELF);
OSTaskSuspend(5);
IO2SET=0xffffffff;
IO0CLR = BEEP;
OSTimeDly(OS_TICKS_PER_SEC / 8);
IO0SET = BEEP;
OSTimeDly(OS_TICKS_PER_SEC / 4);
IO0CLR = BEEP;
OSTimeDly(OS_TICKS_PER_SEC / 8);
IO0SET = BEEP;
OSTimeDly(OS_TICKS_PER_SEC / 4);
OSTaskResume(5);
} } /*************Task1 任务1********************************************/ void Task1(void *pdata) {
pdata = pdata;
/* 避免编译警告 */
for (;;)
{
OSTimeDly(OS_TICKS_PER_SEC / 50);
/* 延时20毫秒 */
if ((IO0PIN & KEY1) != 0)
{
continue;
}
OSTimeDly(OS_TICKS_PER_SEC / 50);
/* 延时20毫秒 */
if ((IO0PIN & KEY1) != 0)
{
continue;
}
OSTaskResume(2);
while ((IO0PIN & KEY1) == 0)
{
OSTimeDly(OS_TICKS_PER_SEC / 50);
/* 延时20毫秒 */
OSTaskSuspend(5); //挂起任务2
}
OSTaskResume(3);
OSTaskResume(5);
} } /************************Task2 任务2*************************************/ void Task2(void *pdata){ uint32 seed= 1;
3 / 4
} pdata = pdata; for(;;seed = seed>>1 | (seed &1)
四、实验结果及分析
(1)简单描述μC/OS-II应用程序的基本结构。
每一个uC/OS-II应用程序至少要有一个任务,而且每一个任务必须被写成无限循环的形式。 (2)能否将实验参考程序的两个任务组合成一个任务?这样做有什么利弊?
可以。合并的话,优点是免除了不少通信交流工作,减少共享资源的数量,减轻操作系统的负担,但缺点是任务的功能变繁杂,任务设计变得复杂,不利于整体程序的编写。
(3)在实验参考程序中,如何设置任务的优先等级?若在例程中设置按键检测任务的优先级高于蜂鸣器控制任务的优先级,程序应如何运行?
可以用OSTaskCreate函数设置任务的优先等级。当同时发生时,程序会先运行按键检测任务,然后再运行蜂鸣器控制任务。
(4)按要实验要求完成实验程序编写
五、心得体会
1.实验的时候粗心大意没有注意到应该使用ARM Executable Image for μC/OS-II(for LPC2200)工程模板来建立工程,依旧使用之前的模板导致浪费了许多时间。 2.编写完程序后进行编译,一开始出现的实验现象是按键后蜂鸣器响而流水灯循环不变,修改程序后变为:按键后蜂鸣器响流水灯循环停止,第二次按键后流水灯任务恢复;再请教老师后,发现问题在于任务1没有设置好流水灯任务(即任务2)的挂起与恢复。正确设置任务2的挂起后,发现现象为:按键后蜂鸣器响流水灯循环停止,按住按键不放流水灯任务恢复,但在此过程中蜂鸣器鸣叫了两次。严格要求的老师验收后不予通过,继而我只好继续修改程序,最终达到了老师的要求。
3.最终的实验现象为:按下按键后流水灯任务挂起,蜂鸣器响;长按按键流水灯任务挂起蜂鸣器响,松开后流水灯任务恢复而蜂鸣器不响。
4 / 4
人人范文网 m.inrrp.com.cn 手机版