实验一 UCOS-II编译环境的建立和移植.doc_第1页
实验一 UCOS-II编译环境的建立和移植.doc_第2页
实验一 UCOS-II编译环境的建立和移植.doc_第3页
实验一 UCOS-II编译环境的建立和移植.doc_第4页
实验一 UCOS-II编译环境的建立和移植.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

班 级 学号 姓 名 同组人 实验日期 室温 大气压 成 绩 实验一 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)选择”I AgreeLicence agreement”同意协议;4)选择安装目录,这里用户自行选择安装的目录后,点击Next即可; 5)随便输入邮箱之类的信息即可,点击Next开始安装; 6)按图配置,然后点击Finish,左面会出现keil快捷图标;7)出现Pack Install 主要是安装一些应用例子和代码; . 8)需要进行注册,File-License Management,弹出一个License Management;9)根据MDK的CID,生成License Key,然后再将这个License Key添加到MDK里面New License ID Code(LIC)对话框中去注册; 2、建立无UCOS-II的STM32的工程模板 1)首先,打开MDK(以下将RVMDK简称为MDK)软件。然后点击Project-New uVision Project;新建一个文件夹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作为我们的启动文件。 出错和警告信息在下面的Output Windows对话框中提示出来了。因为工程中没有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目录树上点击右键-Manage Components。在上面对话框的中间栏,点新建(用红圈标出)按钮(也可以通过双击下面的空白处实现),新建USER和SYSTEM两个组。然后点击Add Files按钮,把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 int main(void) u8 t=0; Stm32_Clock_Init(9); /72M delay_init(72); /延时初始化 uart_init(72,9600); /设置串口1波特率 while(1) printf(t:%dn,t); delay_ms(500); t+; 此时编译,生成的过程文件,还是会存放在USER文件夹下,所以,先设置输出路径,再编译。点击(Options for Target按钮),弹出Options for TargetTarget 1对话框,选择Output选项卡选中Create Hex File(用于生成Hex文件,后面会用到)点击Select Folder for Objects找到OBJ文件夹点击OK。接着,再设置Listings文件路径,打开Listing选项卡点击Select Folder for Listings找到OBJ文件夹点击OK。 最后点击OK,回到IDE主界面。接下来我们编译刚刚写的代码,点击(部分编译按钮)编译一下,会在Output Windows信息栏中发现如下报错信息:test.c(1):error:#5:cannot open source input file sys.h:No such file or directory。 test.c的01行出现了一个浅绿色的小箭头,说明错误是这个地方产生的。双击后浅绿色箭头出现位置其实通过下面错误的说明,错误的原因了:就是include的路径没有加进去的缘故,而导致了这个错误。现在再次点击(Options for Target按钮),弹出Options for TargetTarget 1对话框,选择C/C+选项卡。在Include Paths处,点击按钮。在弹出的对话框中加入SYSTEM文件夹下的3个文件夹字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后面会经常用到)。点击OK确认,回到IDE,此时再点击按钮,再编译一次,发现没错误了。因为之前选择了生成Hex文件,所以在编译的时候,MDK会自动生成Hex文件,这个文件在OBJ文件夹里面,串口下载的时候,就是下载这个文件到STM32里面的,这个在后面的程序下载一节会介绍。 编译后,可能会出现一个警告:warning:#1-D last line of file ends without a newline。这个警告是在某个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) COPYLEFT 2010 Leafgrass * * File Name : os_cpu_c.c * Author : Librae * Date : 06/10/2010 * Description : COS-II在STM32上的移植代码C语言部分, * 包括任务堆栈初始化代码和钩子函数等 */ #ifndef _OS_CPU_H_ #define _OS_CPU_H_ #ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern #endif /* 定义与编译器无关的数据类型*/ typedef unsigned char BOOLEAN; typedef unsigned char INT8U; /* Unsigned 8 bit quantity */ typedef signed char INT8S; /* Signed 8 bit quantity */ typedef unsigned short INT16U; /* Unsigned 16 bit quantity */ typedef signed short INT16S; /* Signed 16 bit quantity */ typedef unsigned int INT32U; /* Unsigned 32 bit quantity */ typedef signed int INT32S; /* Signed 32 bit quantity */ typedef float FP32; /* Single precision floating point*/ typedef double FP64; /* Double precision floating point*/ /STM32是32位位宽的,这里OS_STK和OS_CPU_SR都应该为32位数据类型 typedef unsigned int OS_STK; /* Each stack entry is 32-bit wide*/ typedef unsigned int OS_CPU_SR; /* Define size of CPU status register*/ /* * Cortex M3 * Critical Section Management */ /* * ARM Miscellaneous */ /定义栈的增长方向. /CM3中,栈是由高地址向低地址增长的,所以OS_STK_GROWTH设置为1 #define OS_STK_GROWTH 1 /* Stack grows from HIGH to LOW memory on ARM */ /任务切换宏,由汇编实现. #define OS_TASK_SW() OSCtxSw() /* * PROTOTYPES * (see OS_CPU_A.ASM) */ /OS_CRITICAL_METHOD = 1 :直接使用处理器的开关中断指令来实现宏 /OS_CRITICAL_METHOD = 2 :利用堆栈保存和恢复CPU的状态 /OS_CRITICAL_METHOD = 3 :利用编译器扩展功能获得程序状态字,保存在局部变量cpu_sr #define OS_CRITICAL_METHOD 3 /进入临界段的方法 #if OS_CRITICAL_METHOD = 3 #define OS_ENTER_CRITICAL() cpu_sr = OS_CPU_SR_Save(); #define OS_EXIT_CRITICAL() OS_CPU_SR_Restore(cpu_sr); #endif void OSCtxSw(void); void OSIntCtxSw(void); void OSStartHighRdy(void); void OSPendSV(void); #if OS_CRITICAL_METHOD = 3u /* See OS_CPU_A.ASM */ OS_CPU_SR OS_CPU_SR_Save(void); void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr); #endif OS_CPU_EXT INT32U OSInterrputSum; #endif /* (C) COPYLEFT 2010 Leafgrass */ 2 OS_CPU_C.C #define OS_CPU_GLOBALS #include includes.h /* * #if OS_TMR_EN 0 static INT16U OSTmrCtr; #endif #if OS_CPU_HOOKS_EN 0 & OS_VERSION 203 void OSInitHookBegin (void) #if OS_TMR_EN 0 OSTmrCtr = 0; #endif #endif #if OS_CPU_HOOKS_EN 0 & OS_VERSION 203 void OSInitHookEnd (void) #endif #if OS_CPU_HOOKS_EN 0 void OSTaskCreateHook (OS_TCB *ptcb) #if OS_APP_HOOKS_EN 0 App_TaskCreateHook(ptcb); #else (void)ptcb; /* Prevent compiler warning */ #endif #endif #if OS_CPU_HOOKS_EN 0 void OSTaskDelHook (OS_TCB *ptcb) #if OS_APP_HOOKS_EN 0 App_TaskDelHook(ptcb); #else (void)ptcb; /* Prevent compiler warning */ #endif #endif /* #if OS_CPU_HOOKS_EN 0 & OS_VERSION = 251 void OSTaskIdleHook (void) #if OS_APP_HOOKS_EN 0 App_TaskIdleHook(); #endif #endif #if OS_CPU_HOOKS_EN 0 void OSTaskStatHook (void) #if OS_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 is not used, prevent warning */ stk = ptos; /* Load stack pointer *(stk) = (INT32U)0x01000000L; /* xPSR */ *(-stk) = (INT32U)task; /* Entry Point */ *(-stk) = (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will cause fault if ever used)*/ *(-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) void OSTaskSwHook (void) #if OS_APP_HOOKS_EN 0 App_TaskSwHook(); #endif #endif #if OS_CPU_HOOKS_EN 0 & OS_VERSION 203 void OSTCBInitHook (OS_TCB *ptcb) #if OS_APP_HOOKS_EN 0 App_TCBInitHook(ptcb); #else (void)ptcb; /* Prevent compiler warning */ #endif #endif #if (OS_CPU_HOOKS_EN 0) & (OS_TIME_TICK_HOOK_EN 0) void OSTimeTickHook (void) #if OS_APP_HOOKS_EN 0 App_TimeTickHook(); #endif #if OS_TMR_EN 0 OSTmrCtr+; if (OSTmrCtr = (OS_TICKS_PER_SEC / OS_TMR_CFG_TICKS_PER_SEC) OSTmrCtr = 0; OSTmrSignal(); #endif #endif #if OS_CPU_HOOKS_EN 0u & OS_VERSION 290u void OSTaskReturnHook(OS_TCB *ptcb) (void)ptcb; #endif 3 os_cpu_a.asm ;/* (C) COPYRIGHT 2010 Libraworks * * File Name : os_cpu_a.asm ;* Author : Librae ;* Version : V1.0 ;* Date : 06/10/2010 ;* Description : COS-II asm port for STM32 ;*/ IMPORT OSRunning ; External references IMPORT OSPrioCur IMPORT OSPrioHighRdy IMPORT OSTCBCur IMPORT OSTCBHighRdy IMPORT OSIntNesting IMPORT OSIntExit IMPORT OSTaskSwHook EXPORT OSStartHighRdy EXPORT OSCtxSw EXPORT OSIntCtxSw EXPORT OS_CPU_SR_Save ; Functions declared in this file EXPORT OS_CPU_SR_Restore EXPORT PendSV_Handler NVIC_INT_CTRL EQU 0xE000ED04 ; 中断控制寄存器 NVIC_SYSPRI2 EQU 0xE000ED20 ; 系统优先级寄存器(2) NVIC_PENDSV_PRI EQU 0xFFFF0000 ; PendSV中断和系统节拍中断 (都为最低,0xff). NVIC_PENDSVSET EQU 0x10000000 ; 触发软件中断的值. PRESERVE8 AREA |.text|, CODE, READONLY THUMB OS_CPU_SR_Save MRS R0, PRIMASK ;读取PRIMASK到R0,R0为返回值 CPSID I ;PRIMASK=1,关中断(NMI和硬件FAULT可以响应) BX LR ;返回 OS_CPU_SR_Restore MSR PRIMASK, R0 ;读取R0到PRIMASK中,R0为参数 BX LR ;返回 ;/* ;* 函数名称: OSStartHighRdy * ;* 功能描述: 使用调度器运行第一个任务 ;* ;* 参 数: None ;* ;* 返 回 值: None ;* / OSStartHighRdy LDR R4, =NVIC_SYSPRI2 ; set the PendSV exception priority LDR R5, =NVIC_PENDSV_PRI STR R5, R4 MOV R4, #0 ; set the PSP to 0 for initial context switch call MSR PSP, R4 LDR R4, =OSRunning ; OSRunning = TRUE MOV R5, #1 STRB R5, R4 ;切换到最高优先级的任务 LDR R4, =NVIC_INT_CTRL ;rigger the PendSV exception (causes context switch) LDR R5, =NVIC_PENDSVSET STR R5, R4 CPSIE I ;enable interrupts at processor level OSStartHang B OSStartHang ;should never get here ;/*;* 函数名称: OSCtxSw ;* ;* 功能描述: 任务级上下文切换 ;* ;* 参 数: None ;* ;* 返 回 值: None ;*/ OSCtxSw PUSH R4, R5 LDR R4, =NVIC_INT_CTRL ;触发PendSV异常 (causes context switch) LDR R5, =NVIC_PENDSVSET STR R5, R4 POP R4, R5 BX LR ;/*;* 函数名称: OSIntCtxSw ;* ;* 功能描述: 中断级任务切换 ;* ;* 参 数: None ;* ;* 返 回 值: None ;*/ OSIntCtxSw PUSH R4, R5 LDR R4, =NVIC_INT_CTRL ;触发PendSV异常 (causes context switch) LDR R5, =NVIC_PENDSVSET STR R5, R4 POP R4, R5 BX LR NOP ;/* ;* 函数名称: OSPendSV ;* ;* 功能描述: OSPendSV is used to cause a context switch. ;* 参 数: None ;* ;* 返 回 值: None

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论