ucos移植
μC/OS移植
1、实验目的
(1)掌握QuickARM专用
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
模板的使用。
(2)掌握在μC/OS-II操作系统下编写用户程序的方法。
(3)熟悉LPC2000系列ARM7处理器的GPIO控制。
2、实验设备
硬件:PC机
SmartSOPC教学实验开发平台
QuickARM核心板
软件:ADS1.2集成开发环境
μC/OS-II操作系统(2.52)
3、实验
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
学习移植μC/OS-II操作系统到ARM7处理器的方法,然后编写一个简单的多任务应用程序,实验中编写了3个任务:
任务1:控制QuickARM核心板上的LED1~LED4。
任务2:检测QuickARM核心板上的按键KEY1~KEY3。
任务3:控制SmartSOPC底板上的LED1~LED8。
实验现象: QuickRAM板上的LED4一直点亮,按下KEY1~KEY3中的一个按键,点亮QuickARM板上对应的LED1~LED3。底板上的LED1~LED8做流水灯显示。
4、实验预习要求
(1)仔细阅读参考文献【1】5.7节的LPC2000引脚连接模块和5.9节的GPIO。 (2)仔细阅读2.12节中LED电路部分。
(3)仔细阅读QuickARM板上的LED1~LEA8。
(4)仔细月的参考文献【5】,了解μC/OS--II的组成、移植的相关文件内容以及消息邮箱的使用。
QuickARM)模板建(5)仔细阅读使用ARM Executable Image for UCOSII(for
立工程的步骤。
5、实验原理
在任务1和任务2之间使用邮箱进行通信,当任务2检测到按键消息后,就将按键的值通过邮箱发送到任务1,任务1接收到邮箱信息后,判断键值,并点亮对应的LED1~LED3,程序流程如图5.5和图5.6所示。任务3的优先级是最低的,控制主板上的LED1~LED8作流水灯演示实验。
6、实验步骤
(1)连接EasyJTAG仿真器和QuickARM核心板,然后安装EasyJTAG仿真器的驱动程序(若已经安装过,此步省略)。
(2)为ADS1.2添加QuickARM专用工程模板——ARM Exccutable Image for UCOS?(for Quick ARM)(若已经增加过,此步省略)。
(3)建立一个实验目录——Demo Program,然后将μC/OS-?2.52源代码、移植代码(移植代码在产品配套光盘中可以找到),其目录名为ARM、PC服务代码Arm_Pc,LPC2000在μC/OS-?下的底层驱动(Driver)和外围器件的操作软件包(Software Package)复制到实验目录Demo Program下。μC/OS-?的源代码可以从参考文献的附带光盘上获得。(若已经增加过,此步省略)。 (4)启动ADS1.2,使ARM Exccutable Image for UCOS?(for Quick ARM)工程模板建立一个工程GPIO,工程存储在Demo Program目录下,此时,Demo Program含有:arm;Arm_Pc;Driver;Software Package;SOURCE;GPIO共六个文件夹。
(5)在ADS的项目窗口添加GPIO的文件组,然后把Driver\GPIO\目录下的GPIO.h和GPIO.c文件添加到该文件组。
(6)打开工程窗口user组中的main.c文件,编写实验程序并保存文件。 (7)编译连接工程。
(8)选择Project->Debug,启动AXD进行JTAQ仿真测试。
(9)跳线P2.16~P2.23分别短接LED0~KED7。全速运行程序,程序将会在main.c的主函数中停止(因为main函数起始处默认设置有断点)。 (10)全速运行程序,观察主板上LED0~KED7的显示:按下QuickARM核心板上的按键KEY1~KEY3,然后观察板上的LED0~LED3。
7. 实验参考程序
GPIO实验的参考程序见程序清单5.7、程序清单5.8、程序清单5.9和程序清单5.10。
程序清单5.7 GPIO实验参考程序——main函数 #include "config.h"
#include "stdlib.h"
#include "GPIO.h"
#define TaskStkLengh 128 //定义用户任务0的堆栈长度 #define Boad_KEY1 (1 << 28) //P0.28控制KEY1 #define Boad_KEY2 (1 << 27) //P0.27控制KEY2 #define Boad_KEY3 (1 << 25) //P0.25控制KEY3
#define Boad_LED1 (1 << 22) //P1.22控制LED1 #define Boad_LED2 (1 << 23) //P1.23控制LED2 #define Boad_LED3 (1 << 24) //P1.24控制LED3 #define Boad_LED4 (1 << 25) //P1.25控制LED4
#define LED0 (1 << 16) //P2.16控制LED0 #define LED1 (1 << 17) //P2.17控制LED1 #define LED2 (1 << 18) //P2.18控制LED2 #define LED3 (1 << 19) //P2.19控制LED3 #define LED4 (1 << 20) //P2.20控制LED4 #define LED5 (1 << 21) //P2.21控制LED5 #define LED6 (1 << 22) //P2.22控制LED6 #define LED7 (1 << 23) //P2.23控制LED7 #define LED (0xff << 16)
OS_STK Task0Stk [TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈
OS_STK Task1Stk [TaskStkLengh]; //任务1的堆栈 OS_STK Task2Stk [TaskStkLengh]; //任务2的堆栈
OS_EVENT *Mbox; //任务Task0与Task1之间通信的邮箱
const uint32 LED_TBL[] = {
0x00,0xff, //全部熄灭
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//依
次逐个点亮
0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff, //依次逐个叠加
0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01, //依次逐个递减
0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,//两
个靠拢后分开
0x81,0xc3,0xe7,0xff,0xff,0xe7,0xc3,0x81 //从两边叠加后递减
};
void Task0(void *pdata); //Task0 任务0,控制LED的显示
void Task1(void *pdata); //Task1 任务1,检测按键
void Task2(void *pdata); //Task2 任务2,流水灯显示
/********************************************************************
**********
** 函数名称:main()
** 函数功能:按下QuickARM板上的KEY1,KEY3,点亮QuickARM板上的LED1,
LED3。同时,主板上显示流水灯。
** 说明: 跳线P2.16,P2.23分别短接LED0,KED7。
*********************************************************************
*********/
int main (void)
{
OSInit ();
Mbox = OSMboxCreate((void *)0); // 建立一个邮箱,用来传递按键信息
OSTaskCreate (Task0,(void *)0, &Task0Stk[TaskStkLengh - 1], 2);
OSStart ();
return 0;
}
程序清单5.8 GPIO实验参考程序——控制板上LED显示任务
/********************************************************************
**********
** 任务名称:Task0
** 任务功能:接收任务Task1发来的邮箱信息,并控制QuickARM板上的LED
显示。
*********************************************************************
*********/
void Task0(void *pdata)
{
uint8 *MboxPoint;
uint8 Err;
pdata = pdata;
TargetInit ();
OSTaskCreate (Task1,(void *)0, &Task1Stk[TaskStkLengh - 1], 3);
// 建立任务Task1
OSTaskCreate (Task2,(void *)0, &Task2Stk[TaskStkLengh - 1], 4);
// 建立任务 Task2
P0_GPIOInit(Boad_KEY1|Boad_KEY2|Boad_KEY3,0); //按键KEY1~KEY3设置为输入模式
P1_GPIOInit(Boad_LED1|Boad_LED2|Boad_LED3|Boad_LED4,1);
//LED1~LED4设置为GPIO输出模式
P1_GPIOClr(Boad_LED4); //点亮LED4
while (1)
{
P1_GPIOSet(Boad_LED1|Boad_LED2|Boad_LED3);
MboxPoint = OSMboxPend(Mbox,0,&Err); //接收邮箱信息
switch(*MboxPoint)
{
case '1': //点亮LED1
P1_GPIOClr(Boad_LED1);
break;
case '2': //点亮LED2
P1_GPIOClr(Boad_LED2);
break;
case '3': //点亮LED3
P1_GPIOClr(Boad_LED3);
break;
default:
break;
}
OSTimeDly(10);
}
}
程序清单5.9 GPIO实验参考程序——检测按键任务 /********************************************************************
**********
** 任务名称:Task1
** 任务功能:检测按键KEY1,KEY3,并给任务Task0发送邮箱信息。 *********************************************************************
*********/
void Task1 (void *pdata)
{
uint8 KeyValue;
uint8 Err;
pdata = pdata;
while (1)
{
if((Read_P0() & Boad_KEY1) == 0)
{ // 按键KEY1按下
KeyValue = '1';
Err = OSMboxPost(Mbox,&KeyValue);
}
if((Read_P0() & Boad_KEY2) == 0)
{ // 按键KEY2按下
KeyValue = '2';
Err = OSMboxPost(Mbox,&KeyValue);
}
if((Read_P0() & Boad_KEY3) == 0)
{ // 按键KEY3按下
KeyValue = '3';
Err = OSMboxPost(Mbox,&KeyValue);
}
OSTimeDly(10);
}
}
程序清单5.10 GPIO实验参考程序——主板上流水灯显示任务 /********************************************************************
**********
** 任务名称:Task1
** 任务功能:检测按键KEY1,KEY3,并给任务Task0发送邮箱信息。 *********************************************************************
*********/
void Task1 (void *pdata)
{
uint8 KeyValue;
uint8 Err;
pdata = pdata;
while (1)
{
if((Read_P0() & Boad_KEY1) == 0)
{ // 按键KEY1按下
KeyValue = '1';
Err = OSMboxPost(Mbox,&KeyValue);
}
if((Read_P0() & Boad_KEY2) == 0)
{ // 按键KEY2按下
KeyValue = '2';
Err = OSMboxPost(Mbox,&KeyValue);
}
if((Read_P0() & Boad_KEY3) == 0)
{ // 按键KEY3按下
KeyValue = '3';
Err = OSMboxPost(Mbox,&KeyValue);
}
OSTimeDly(10);
}
}
8. 日积月累
(1)μC/OS-?任务的编写与前后台程序有何差别,
中断堆栈区也就是利用原有的MSP430中的系统堆栈区。在前后台的
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
形式中,中断中的压栈和出栈的操作都是在系统的堆栈区完成的。
(2)如何设置任务的优先等级,
一个任务通常是一个无限的循环,由于任务的执行是操作系统内核调度的,因此务是绝不会返回的,其返回参数必须定义成void。在μC/OS-?中,当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就会被抢占,高优先级任务会立刻得到CPU的控制权(在系统允许调度和任务切换的前提下)。μC/OS-?可以管理多达64个任务,但目前版本的μC/OS-?有两个任务已经被系统占用了(即空闲任务和统计任务)。必须给每个任务赋以不同的优先级,任务的优先级号就是任务编号(ID),优先级可以从0到OS_LOWEST_PR10-2。优先级号越低,任务的优先级越高。μC/OS-?总是运行进入就绪态的优先级最高的任务。