实验一 UCOSII编译环境的建立和移植.docx
- 文档编号:6195003
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:17
- 大小:28.96KB
实验一 UCOSII编译环境的建立和移植.docx
《实验一 UCOSII编译环境的建立和移植.docx》由会员分享,可在线阅读,更多相关《实验一 UCOSII编译环境的建立和移植.docx(17页珍藏版)》请在冰豆网上搜索。
实验一UCOSII编译环境的建立和移植
班级学号姓名同组人
实验日期室温大气压成绩
实验一UCOS-II编译环境的建立和移植
一、实验目的
1、掌握Keil的安装,并在keil中建立UCOS-II开发的模板,为以后的开发建立基础;
2、掌握UCOS-II在ARM平台下移植;
3、了解UCOS-II源码的结构。
二、实验步骤
1、Keil的安装和建立开发模板
1)在MDK的安装文件夹,点击MDK5.0图标,安装MDK5.0;
2)点击之后出现界面,选择Next;
3)选择”IAgree…Licenceagreement”同意协议;
4)选择安装目录,这里用户自行选择安装的目录后,点击Next即可;
5)随便输入邮箱之类的信息即可,点击Next开始安装;
6)按图配置,然后点击Finish,左面会出现keil快捷图标;
7)出现PackInstall主要是安装一些应用例子和代码;
.
8)需要进行注册,File->LicenseManagement,弹出一个LicenseManagement;
9)根据MDK的CID,生成LicenseKey,然后再将这个LicenseKey添加到MDK里面NewLicenseIDCode(LIC)对话框中去注册;
2、建立无UCOS-II的STM32的工程模板
1)首先,打开MDK(以下将RVMDK简称为MDK)软件。
然后点击Project->NewuVisionProject;
新建一个文件夹TEST,然后把工程名字设为test.点击保存。
弹出选择器件的对话框,因为ALIENTEK战舰STM32开发板所使用的STM32型号为STM32F103ZET6,所以在这里我们选择STMicroelectronics下面的STM32F103ZET6(如果使用的是其他系列的芯片,选择相应的型号就可以了)。
点击OK,MDK会弹出一个对话框,问你是否加载启动代码到当前工程下面,这里我们选择否。
没有选择加载默认的启动代码,先介绍一下启动代码:
启动代码是一段和硬件相关的汇编代码。
是必不可少的!
这代码主要作用如下:
1、堆栈(SP)的初始化;2、初始化程序计数器(PC);3、设置向量表异常事件的入口地址;4、调用main函数。
因为芯片是STM32F103ZET6,如果用默认的启动文件(STM32F10x.s),因为有些中断入口函数在这个文件里面并没有定义,会影响使用。
不过,选择ST公式提供的startup_stm32f10x_hd.s作为我们的启动文件。
出错和警告信息在下面的OutputWindows对话框中提示出来了。
因为工程中没有main函数,所以报错了,需要添加Main函数,打开文件夹,看到文件夹下面多了很多文件,但是其中真正有用的文件就两个:
startup_stm32f10x_hd.s和test.uv2。
所以,在TEST目录下新建两个新的文件夹:
USER和OBJ,USER用来存放启动文件(startup_stm32f10x_hd.s)、工程文件(test.uv2)等不可缺少的文件,而OBJ则用来存放这些编译过程中产生的过程文件(包括.hex文件也将存放在这个文件夹里面)。
然后把这些东西全部移到相应的文件夹下。
由于上面我们还没有任何代码在工程里面,这里我们把系统代码COPY过来(在SYSTEM文件夹下,此SYSTEM文件夹不是XP的文件夹,是由ALIENTEK提供,可以在光盘任何一个实例的目录下找到。
这些代码在任何STM32F103的芯片上都是通用的,可以用于快速构建自己的工程,后面会有详细介绍)
然后在USER文件夹下面找到test.Uv2,打开它.然后在Target目录树上点击右键->ManageComponents。
在上面对话框的中间栏,点新建(用红圈标出)按钮(也可以通过双击下面的空白处实现),新建USER和SYSTEM两个组。
然后点击AddFiles按钮,把sys.c、usart.c、delay.c加入到SYSTEM组中。
注意:
此时USER组下还是没有任何文件。
点击OK,退出该界面返回IDE。
在Target树下发现多了2个组名,就是刚刚新建的2个组。
接着,新建一个test.c文件,并保存在USER目录下。
然后双击USER组,会弹出加载
文件的对话框,此时我们在USER目录下选择test.c文件,加入到USER组下。
在test.c文件里面输入如下代码:
#include"sys.h"
#include"usart.h"
#include"delay.h"
intmain(void)
{
u8t=0;
Stm32_Clock_Init(9);//72M
delay_init(72);//延时初始化
uart_init(72,9600);//设置串口1波特率
while
(1)
{
printf("t:
%d\n",t);
delay_ms(500);
t++;
}
}
此时编译,生成的过程文件,还是会存放在USER文件夹下,所以,先设置输出路径,再编译。
点击(OptionsforTarget按钮),弹出OptionsforTarget’Target1’对话框,选择Output选项卡选中CreateHexFile(用于生成Hex文件,后面会用到)点击SelectFolderforObjects找到OBJ文件夹点击OK。
接着,再设置Listings文件路径,打开Listing选项卡点击SelectFolderforListings找到OBJ文件夹点击OK。
最后点击OK,回到IDE主界面。
接下来我们编译刚刚写的代码,点击(部分编译按
钮)编译一下,会在OutputWindows信息栏中发现如下报错信息:
test.c
(1):
error:
#5:
cannotopensourceinputfile"sys.h":
Nosuchfileordirectory。
test.c的01行出现了一个浅绿色的小箭头,说明错误是这个地方产生的。
双击后浅绿色箭头出现位置其实通过下面错误的说明,错误的原因了:
就是include的路径没
有加进去的缘故,而导致了这个错误。
现在再次点击(OptionsforTarget按钮),弹出OptionsforTarget’Target1’对话框,选择C/C++选项卡。
在IncludePaths处,点击按钮。
在弹出的对话框中加入SYSTEM文件夹下的3个文件夹字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后面会经常用到)。
点击OK确认,回到IDE,此时再点击按钮,再编译一次,发现没错误了。
因为之前选择了生成Hex文件,所以在编译的时候,MDK会自动生成Hex文件,这个文件在OBJ文件夹里面,串口下载的时候,就是下载这个文件到STM32里面的,这个在后面的程序下载一节会介绍。
编译后,可能会出现一个警告:
warning:
#1-Dlastlineoffileendswithoutanewline。
这个警告是在某个C文件的最后,没有输入新行,只需要双击这个警告,跳转到警告处,然后在后面输入多一个空行就好了。
至此,一个完整的STM32开发工程在MDK下建立了。
接下来就可以进行代码下载和仿真调试了。
3、建立带有UCOS-II的工程模板
在前面工程的基础上修改,在该工程源码下面加入UCOSII文件夹,存放UCOSII源码(已经将UCOSII源码分为三个文件夹:
CORE、PORT和CONFIG)。
打开工程,新建UCOSII-CORE、UCOSII-PORT和UCOSII-CONFIG三个分组,分别添加UCOSII三个文件夹下的源码,并将这三个文件夹加入头文件包含路径,最后得到工程。
UCOSII-CORE分组下面是UCOSII的核心源码,不需要做任何变动。
UCOSII-PORT分组下面是移植UCOSII要修改的3个代码,这个在移植的时候完成。
UCOSII-CONFIG分组下面是UCOSII的配置部分,主要由用户根据自己的需要对UCOSII进行裁剪或其他设置。
4、移植文件的编写
在模板中,需要针对STM32平台,需要做一些代码的移植。
参考代码如下面所示
1)需要修改的移植文件OS_CPU.H
/*******************************(C)COPYLEFT2010Leafgrass**************************
*FileName:
os_cpu_c.c
*Author:
Librae
*Date:
06/10/2010
*Description:
μCOS-II在STM32上的移植代码C语言部分,
*包括任务堆栈初始化代码和钩子函数等
*************************************************************************************/
#ifndef__OS_CPU_H__
#define__OS_CPU_H__
#ifdefOS_CPU_GLOBALS
#defineOS_CPU_EXT
#else
#defineOS_CPU_EXTextern
#endif
/*************************************************************************************定义与编译器无关的数据类型
*************************************************************************************/
typedefunsignedcharBOOLEAN;
typedefunsignedcharINT8U;/*Unsigned8bitquantity*/
typedefsignedcharINT8S;/*Signed8bitquantity*/
typedefunsignedshortINT16U;/*Unsigned16bitquantity*/
typedefsignedshortINT16S;/*Signed16bitquantity*/
typedefunsignedintINT32U;/*Unsigned32bitquantity*/
typedefsignedintINT32S;/*Signed32bitquantity*/
typedeffloatFP32;/*Singleprecisionfloatingpoint*/
typedefdoubleFP64;/*Doubleprecisionfloatingpoint*/
//STM32是32位位宽的,这里OS_STK和OS_CPU_SR都应该为32位数据类型
typedefunsignedintOS_STK;/*Eachstackentryis32-bitwide*/
typedefunsignedintOS_CPU_SR;/*DefinesizeofCPUstatusregister*/
/*************************************************************************************
*CortexM3
*CriticalSectionManagement
*************************************************************************************/
/*************************************************************************************
*ARMMiscellaneous
*************************************************************************************/
//定义栈的增长方向.
//CM3中,栈是由高地址向低地址增长的,所以OS_STK_GROWTH设置为1
#defineOS_STK_GROWTH1/*StackgrowsfromHIGHtoLOWmemoryonARM*/
//任务切换宏,由汇编实现.
#defineOS_TASK_SW()OSCtxSw()
/************************************************************************************
*PROTOTYPES
*(seeOS_CPU_A.ASM)
*************************************************************************************/
//OS_CRITICAL_METHOD=1:
直接使用处理器的开关中断指令来实现宏
//OS_CRITICAL_METHOD=2:
利用堆栈保存和恢复CPU的状态
//OS_CRITICAL_METHOD=3:
利用编译器扩展功能获得程序状态字,保存在局部变量cpu_sr
#defineOS_CRITICAL_METHOD3//进入临界段的方法
#ifOS_CRITICAL_METHOD==3
#defineOS_ENTER_CRITICAL(){cpu_sr=OS_CPU_SR_Save();}
#defineOS_EXIT_CRITICAL(){OS_CPU_SR_Restore(cpu_sr);}
#endif
voidOSCtxSw(void);
voidOSIntCtxSw(void);
voidOSStartHighRdy(void);
voidOSPendSV(void);
#ifOS_CRITICAL_METHOD==3u/*SeeOS_CPU_A.ASM*/
OS_CPU_SROS_CPU_SR_Save(void);
voidOS_CPU_SR_Restore(OS_CPU_SRcpu_sr);
#endif
OS_CPU_EXTINT32UOSInterrputSum;
#endif
/******************************(C)COPYLEFT2010Leafgrass**************************/
2OS_CPU_C.C
#defineOS_CPU_GLOBALS
#include"includes.h"
/*
***************************************************************************************
#ifOS_TMR_EN>0
staticINT16UOSTmrCtr;
#endif
#ifOS_CPU_HOOKS_EN>0&&OS_VERSION>203
voidOSInitHookBegin(void)
{
#ifOS_TMR_EN>0
OSTmrCtr=0;
#endif
}
#endif
#ifOS_CPU_HOOKS_EN>0&&OS_VERSION>203
voidOSInitHookEnd(void)
{
}
#endif
#ifOS_CPU_HOOKS_EN>0
voidOSTaskCreateHook(OS_TCB*ptcb)
{
#ifOS_APP_HOOKS_EN>0
App_TaskCreateHook(ptcb);
#else
(void)ptcb;/*Preventcompilerwarning*/
#endif
}
#endif
#ifOS_CPU_HOOKS_EN>0
voidOSTaskDelHook(OS_TCB*ptcb)
{
#ifOS_APP_HOOKS_EN>0
App_TaskDelHook(ptcb);
#else
(void)ptcb;/*Preventcompilerwarning*/
#endif
}
#endif
/*
#ifOS_CPU_HOOKS_EN>0&&OS_VERSION>=251
voidOSTaskIdleHook(void)
{
#ifOS_APP_HOOKS_EN>0
App_TaskIdleHook();
#endif
}
#endif
#ifOS_CPU_HOOKS_EN>0
voidOSTaskStatHook(void)
{
#ifOS_APP_HOOKS_EN>0
App_TaskStatHook();
#endif
}
#endif
OS_STK*OSTaskStkInit(void(*task)(void*p_arg),void*p_arg,OS_STK*ptos,INT16U
opt)
{
OS_STK*stk;
(void)opt;/*'opt'isnotused,preventwarning*/
stk=ptos;/*Loadstackpointer
*(stk)=(INT32U)0x01000000L;/*xPSR*/
*(--stk)=(INT32U)task;/*EntryPoint*/
*(--stk)=(INT32U)0xFFFFFFFEL;/*R14(LR)(initvaluewillcause
faultifeverused)*/
*(--stk)=(INT32U)0x12121212L;/*R12*/
*(--stk)=(INT32U)0x03030303L;/*R3*/
*(--stk)=(INT32U)0x02020202L;/*R2*/
*(--stk)=(INT32U)0x01010101L;/*R1*/
*(--stk)=(INT32U)p_arg;/*R0:
argument*/
*(--stk)=(INT32U)0x11111111L;/*R11*/
*(--stk)=(INT32U)0x10101010L;/*R10*/
*(--stk)=(INT32U)0x09090909L;/*R9*/
*(--stk)=(INT32U)0x08080808L;/*R8*/
*(--stk)=(INT32U)0x07070707L;/*R7*/
*(--stk)=(INT32U)0x06060606L;/*R6*/
*(--stk)=(INT32U)0x05050505L;/*R5*/
*(--stk)=(INT32U)0x04040404L;/*R4*/
return(stk);
}
#if(OS_CPU_HOOKS_EN>0)&&(OS_TASK_SW_HOOK_EN>0)
voidOSTaskSwHook(void)
{
#ifOS_APP_HOOKS_EN>0
App_TaskSwHook();
#endif
}
#endif
#ifOS_CPU_HOOKS_EN>0&&OS_VERSION>203
voidOSTCBInitHook(OS_TCB*ptcb)
{
#ifOS_APP_HOOKS_EN>0
App_TCBInitHook(ptcb);
#else
(void)ptcb;/*Preventcompilerwarning*/
#endif
}
#endif
#if(OS_CPU_HOOKS_EN>0)&&(OS_TIME_TICK_HOOK_EN>0)
voidOSTimeTickHook(void)
{
#ifOS_APP_HOOKS_EN>0
App_TimeTickHook();
#endif
#ifOS_TMR_EN>0
OSTmrCtr++;
if(OSTmrCtr>=(OS_TICKS_PER_SEC/OS_TMR_CFG_TICKS_PER_SEC)){
OSTmrCtr=0;
OSTmrSignal();
}
#endif
}
#endif
#ifOS_CPU_HOOKS_EN>0u&&OS_VERSION>290u
voidOSTaskReturnHook(OS_TCB*ptcb)
{
(void)ptcb;
}
#endif
3os_cpu_a.asm
;/***********************(C)COPYRIGHT2010Libraworks*************************
*FileName:
os_cpu_a.asm
;*Author:
Librae
;*Version:
V1.0
;*Date:
06/10/2010
;*Description:
μCOS-IIasmportforSTM32
;*******************************************************************************/
IMPORTOSRunning;Externalreferences
IMPORTOSPrioCur
IMPORTOSPrioHighRdy
IMPORTOSTCBCur
IMPORTOSTCBHighRdy
IMPORTOSIntNesting
IMPORTOSIntExit
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验一 UCOSII编译环境的建立和移植 实验 UCOSII 编译 环境 建立 移植